(原创)代码审计社团官网的典型 SQL 注入漏洞 [代码审计][sql 注入漏洞][ip 注入][emlog 漏洞]
统计文章阅读量的代码处。该漏洞不算 0day,但特殊之处在于此前黑盒测试时未被发现,而代码本身存在典型的注入风险,此次发现未造成损失,但再次印证了开发者的核心原则:永远不要相信来自用户的输入。
一、漏洞发现
1. 漏洞线索来源
某微信群中出现一张盲注测试截图,显示攻击者构造请求头注入 IP ",Emlog 返回 SQL 语法错误: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 '"""' at line 1。从报错可初步判断:用户 IP 输入未经过滤。
盲注测试截图:
2. 漏洞真实性验证
使用抓包工具复现请求,发送构造的数据包到服务器,服务器返回的错误与截图一致,确认漏洞真实存在。
抓包请求内容:
服务器返回报错(确认漏洞存在):
二、注入测试(使用 SQLMap)
由于注入点位于 HTTP 请求头(X-Forwarded-For 字段),需通过抓包获取请求头并结合 SQLMap 进行测试,步骤如下:
1. 工具准备(SQLMap 更新)
因 PentestBox 自带 SQLMap 可能版本陈旧,先手动更新 SQLMap:
2. 构造注入材料
将抓包获取的 HTTP 请求头保存为文件(重点关注 X-Forwarded-For 字段,标记为注入点):
3. 执行 SQLMap 注入测试
使用以下命令加载请求头文件,启动 SQLMap 测试:
sqlmap -r request.txt -p X-Forwarded-For --dbs
(-r 指定请求文件,-p 指定注入点字段)
SQLMap 执行过程:
4. 测试结果与影响
SQLMap 报告显示注入点可成功利用,支持多种注入方式(如布尔盲注、时间盲注):
但由于 SQLMap 的高并发请求,测试过程中社团网站出现宕机(无法连接),印证了此前网站可能被 SQLMap 扫描导致故障:
网站宕机现象:
三、源码分析(定位漏洞代码)
Emlog 基于 PHP 开发,通过以下思路定位漏洞代码:
1. 审计关键词
根据报错信息(含view_ip字段)和注入点(X-Forwarded-For),确定审计关键词:
HTTP_X_FORWARDED_FOR(获取 X-Forwarded-For 字段的 PHP 关键字)
view_ip(报错中出现的字段,与 IP 记录相关)
2. 定位漏洞代码
通过关键词搜索,找到记录文章阅读量的核心代码,发现以下问题:
IP 获取未过滤:直接通过$_SERVER['HTTP_X_FORWARDED_FOR']获取用户 IP,未做任何过滤或转义;
SQL 语句直接拼接:将未过滤的 IP 直接拼接到 SQL 语句中,导致注入漏洞。
漏洞代码定位:
IP 获取逻辑(未过滤):
SQL 语句拼接(直接使用未过滤 IP):
3. 对比官方源码(确认非原生漏洞)
查看 emlog 官方 GitHub 仓库的源码,发现官方代码不存在该漏洞,确认此漏洞为第三方改进(统计阅读量功能)时添加的自定义代码导致:
四、漏洞修复
为保证 “统计文章阅读量” 功能可用,采用最小修改原则,通过IP 哈希化避免直接使用用户输入的 IP,修复步骤如下:
修复思路
将用户 IP 通过md5()哈希处理后再存入数据库,既保留 “唯一 IP 统计” 的功能,又彻底消除注入风险(哈希值为固定格式字符串,无注入字符)。
修复代码
修改 IP 记录逻辑,在获取 IP 后添加哈希处理:
// 原代码(存在漏洞)
$view_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$sql = "INSERT INTO em_view (view_ip, post_id) VALUES ('$view_ip', $post_id)";
// 修复后代码(哈希处理IP)
$view_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$view_ip_hash = md5($view_ip); // 对IP进行哈希处理
$sql = "INSERT INTO em_view (view_ip, post_id) VALUES ('$view_ip_hash', $post_id)";
修复代码截图:
五、注入总结
核心原则:永远不要相信任何用户输入,即使是 HTTP 请求头(如 X-Forwarded-For),必须经过过滤、转义或哈希处理后再使用;
审计建议:开源程序的第三方插件 / 自定义代码是漏洞高发区,需重点审计;
测试规范:避免使用 SQLMap 等工具对生产环境进行高并发扫描,易导致网站宕机,应采用低流量手动测试或获得授权后进行;
漏洞披露:发现漏洞后应优先联系网站管理员,而非公开传播(需打码隐藏网址),避免被恶意利用。