概括: 从技术角度分析IIS6文件名解析漏洞的原理与IIS7的相关情况。

a.IIS6错误解析文件类型现象

1、当WEB目录下,文件名以 xxx.asp;xxx.xxx 来进行命名的时候,此文件将送交asp.dll解析(也就是执行脚本)

2、当WEB目录下,在访问以 xxx.asp 命名的目录下的任意文件时,此文件将送交asp.dll解析(也就是执行脚本)

通过对IIS6的核心文件类型解析相关文件的逆向后,整理出下面的核心处理代码。

 //reverse code by golds7n with ida
int __thiscall Url(void *this, char *UrlStruct)
{
void *pW3_URL_INFO; // esi@1
int bSuccess; // eax@1
const wchar_t *i; // eax@2
wchar_t *wcsSlashTemp; // ebx@6
int wcsTemp; // eax@6
int wcs_Exten; // eax@6
int v8; // esi@9
int v10; // eax@11
int v11; // ST04_4@13
int v12; // eax@13
int ExtenDll; // eax@19
int Extenisa; // eax@20
int ExtenExe; // eax@21
int ExtenCgi; // eax@22
int ExtenCom; // eax@23
int ExtenMap; // eax@24
int Entry; // [sp+Ch] [bp-148h]@6
wchar_t *wcsMaohaoTemp; // [sp+10h] [bp-144h]@6
unsigned int dotCount; // [sp+14h] [bp-140h]@1
wchar_t *Str; // [sp+18h] [bp-13Ch]@3
char *url_FileName; // [sp+1Ch] [bp-138h]@1
char Url_FileExtenName; // [sp+20h] [bp-134h]@1
char v25; // [sp+50h] [bp-104h]@1 dotCount = ;
pW3_URL_INFO = this;
STRU::STRU(&Url_FileExtenName, &v25, 0x100u);
url_FileName = (char *)pW3_URL_INFO + ;
bSuccess = STRU::Copy((char *)pW3_URL_INFO + , UrlStruct);
if ( bSuccess < )
goto SubEnd;
for ( i = (const wchar_t *)STRU::QueryStr((char *)pW3_URL_INFO + ); ; i = Str + )
{
Str = _wcschr(i, '.'); ***********N1************
if ( !Str )
break;
++dotCount;
if ( dotCount > W3_URL_INFO::sm_cMaxDots )
break;
bSuccess = STRU::Copy(&Url_FileExtenName, Str);
if ( bSuccess < )
goto SubEnd;
wcsSlashTemp = _wcschr(Str, '/'); ***********N2************
JUMPOUT(wcsSlashTemp, , loc_5A63FD37);
wcsTemp = STRU::QueryStr(&Url_FileExtenName);
wcsMaohaoTemp = _wcschr((const wchar_t *)wcsTemp, ':'); ***********N3************
JUMPOUT(wcsMaohaoTemp, , loc_5A63FD51);
wcs_Exten = STRU::QueryStr(&Url_FileExtenName);
__wcslwr((wchar_t *)wcs_Exten);
if ( META_SCRIPT_MAP::FindEntry(&Url_FileExtenName, &Entry) )
{
*((_DWORD *)pW3_URL_INFO + ) = Entry;
JUMPOUT(wcsSlashTemp, , loc_5A63FDAD);
STRU::Reset((char *)pW3_URL_INFO + );
break;
}
if ( STRU::QueryCCH(&Url_FileExtenName) == )
{
ExtenDll = STRU::QueryStr(&Url_FileExtenName);
if ( !_wcscmp(L".dll", (const wchar_t *)ExtenDll)
|| (Extenisa = STRU::QueryStr(&Url_FileExtenName), !_wcscmp(L".isa", (const wchar_t *)Extenisa)) )
JUMPOUT(loc_5A63FD89);
ExtenExe = STRU::QueryStr(&Url_FileExtenName);
if ( !_wcscmp(L".exe", (const wchar_t *)ExtenExe)
|| (ExtenCgi = STRU::QueryStr(&Url_FileExtenName), !_wcscmp(L".cgi", (const wchar_t *)ExtenCgi))
|| (ExtenCom = STRU::QueryStr(&Url_FileExtenName), !_wcscmp(L".com", (const wchar_t *)ExtenCom)) )
JUMPOUT(loc_5A63FD89);
ExtenMap = STRU::QueryStr(&Url_FileExtenName);
JUMPOUT(_wcscmp(L".map", (const wchar_t *)ExtenMap), , loc_5A63FD7B);
}
}
if ( *((_DWORD *)pW3_URL_INFO + )
|| (v10 = *((_DWORD *)pW3_URL_INFO + ), v10 == )
|| v10 ==
|| (v11 = *(_DWORD *)(*((_DWORD *)pW3_URL_INFO + ) + 0xC4C),
v12 = STRU::QueryStr(url_FileName),
bSuccess = SelectMimeMappingForFileExt(v12, v11, (char *)pW3_URL_INFO + , (char *)pW3_URL_INFO + ),
bSuccess >= ) )
v8 = ;
else
SubEnd:
v8 = bSuccess;
STRU::_STRU(&Url_FileExtenName);
return v8;
}

上述代码中,作星号标记的是N1,N2,N3,分别检测点号,反斜杠和分号。

大概流程为:

请求 /aaa.asp;xxxx.jpg

N1:从头部查找查找 "."号,获得 .asp;xxxx.jpg

N2:查找";"号,如果有则内存截断

N3:查找"/",如果有则内存截断

最终,将保留下来 .asp 字符串,从META_SCRIPT_MAP脚本映射表里与扩展名匹配对比,并反馈给了asp.dll处理

b.IIS7是否延续了漏洞

IIS7的核心处理代码:

 //reverse code by golds7n with ida
const unsigned __int16 *__stdcall MatchPathInUrl(const unsigned __int16 *url_User, unsigned __int32 url_Length, const unsigned __int16 *IIS_MAP_Wizard)
{
const unsigned __int16 *p; // ebx@1
const unsigned __int16 *pUrl; // ecx@4
const wchar_t *i; // edi@6
signed int isXingHao; // edx@8
const unsigned __int16 cWizard; // ax@10
const unsigned __int16 *pWizard; // esi@11
int cTemp; // eax@17
int pCharTemp; // esi@23
const unsigned __int16 *pCharUser; // eax@43
const unsigned __int16 byteChar; // cx@44
const wchar_t cSlash; // ax@50
const unsigned __int16 *Str2; // [sp+8h] [bp-8h]@11
signed int bFound; // [sp+Ch] [bp-4h]@3 p = IIS_MAP_Wizard;
if ( *IIS_MAP_Wizard != '*' || IIS_MAP_Wizard[] )
{
bFound = ;
if ( *IIS_MAP_Wizard == '/' )
{
p = IIS_MAP_Wizard + ;
bFound = ;
++IIS_MAP_Wizard;
}
pUrl = url_User;
if ( *url_User == '/' )
{
pUrl = url_User + ;
++url_User;
}
LABEL_6:
for ( i = pUrl; ; i += pCharTemp )
{
while ( *p == '?' )
{
if ( !*i )
return ;
if ( *i == '/' )
goto LABEL_30;
++p;
++i;
}
isXingHao = ;
if ( *p == '*' )
{
++p;
isXingHao = ;
}
cWizard = *p;
if ( !*p )
break;
pWizard = p;
Str2 = p;
if ( cWizard != '*' )
{
do
{
if ( cWizard == '?' )
break;
if ( !cWizard )
break;
++pWizard;
cWizard = *pWizard;
Str2 = pWizard;
}
while ( *pWizard != '*' );
}
if ( isXingHao )
{
if ( !*pWizard )
{
cTemp = (int)&i[pWizard - p];
if ( cTemp > (unsigned int)&pUrl[url_Length] )
return ;
while ( *(_WORD *)cTemp != '/' && *(_WORD *)cTemp && *i != '/' && *i )
{
++i;
cTemp += ;
}
}
pCharTemp = pWizard - p;
while ( _wcsncmp(i, p, pCharTemp) )
{
if ( !*i )
return ;
if ( *i == '/' )
goto LABEL_29;
++i;
}
}
else
{
pCharTemp = pWizard - p;
if ( _wcsncmp(i, p, pCharTemp) )
{
LABEL_29:
pUrl = url_User;
LABEL_30:
if ( !bFound )
return ;
while ( *pUrl != '/' )
{
if ( !*pUrl )
return ;
++pUrl;
}
if ( !*pUrl )
return ;
p = IIS_MAP_Wizard;
++pUrl;
url_User = pUrl;
goto LABEL_6;
}
}
p = Str2;
pUrl = url_User;
}
if ( isXingHao )
{
cSlash = *i;
if ( *i == '/' )
return i;
do
{
if ( !cSlash )
break;
++i;
cSlash = *i;
}
while ( *i != '/' );
}
if ( *i != '/' && *i )
goto LABEL_30;
return i;
}
pCharUser = url_User;
do
{
byteChar = *pCharUser;
++pCharUser;
}
while ( byteChar );
return &url_User[pCharUser - (url_User + )];
}
MatchPathInUrl(const unsigned __int16 *url_User, unsigned __int32 url_Length, const unsigned __int16 *IIS_MAP_Wizard)

参数url_User是用户提交的路径参数,类似PHOST/DEFAULT WEB SITE/aa.asp;xxx.jpg,由 服务/站点名称/请求路径 构成,IIS_MAP_Wizard是在管理器文件映射里的每个表项,譬如*.ASP

比较的结果就是,拿aa.asp;xxx.jpg与*.ASP进行匹配,显然结果是不匹配的(/xxx.asp/xxx.jpg,是拿xxx.jpg和*.ASP进行匹配)

c.总结

IIS6文件映射配置图

IIS7文件映射配置图

从上面的关键分析和图中,可以看出,IIS6存在解析漏洞是由于其设计上的问题导致,IIS6只简单地根据扩展名来识别,而IIS7是进行通配符匹配来定夺请求文件是否是某脚本类型,可见IIS7纠正了错误机制,更加科学、健壮。

IIS文件名解析漏洞扼要分析的更多相关文章

  1. dedecms_v5.7的apache文件名解析漏洞的学习

    0x00 Apache文件名解析漏洞 Apache是一个Web服务器,可以提供web服务.配合java中间件.PHP实现动态页面访问. Apache和PHP通过接口接入后,Apache接受用户的请求, ...

  2. apache、nginx、Tomcat、IIS引擎解析漏洞

                                            引擎解析漏洞 常见的web容器有IIS.Apache.Nginx.Tomcat等,以下是详细讲解 IIS IIS简介 是 ...

  3. IIS 6.0/7.0/7.5、Nginx、Apache 等服务器解析漏洞总结

    IIS 6.0 1.目录解析:/xx.asp/xx.jpg  xx.jpg可替换为任意文本文件(e.g. xx.txt),文本内容为后门代码 IIS6.0 会将 xx.jpg 解析为 asp 文件. ...

  4. 文件解析漏洞总结(IIS,APACHE,NGINX)

    (本文主体来自https://blog.csdn.net/qq_36119192/article/details/82834063) 文件解析漏洞 文件解析漏洞主要由于网站管理员操作不当或者 Web ...

  5. IIS6.0文件解析漏洞和短文件名漏洞复现

    一.IIS6.0文件解析漏洞 1.ASP一句话木马的准备 新建木马文件“muma.txt”,将“我asp是一句话木马:<%eval request("asp")%>”写 ...

  6. IIS短文件名泄露漏洞危害及防范方法

    危害级别:轻微 IIS短文件名泄露漏洞 WASC Threat Classification 描述: Microsoft IIS在实现上存在文件枚举漏洞,攻击者可利用此漏洞枚举网络服务器根目录中的文件 ...

  7. IIS短文件名泄露漏洞危害及防范方法(转)

    攻击方法(转自http://blog.sina.com.cn/s/blog_64a3795a01017xqt.html) 一直在寻找一种方法,如果我可以使用通配符"*" 和 &qu ...

  8. IIS 7.5最新解析漏洞

    IIS7.5解析漏洞 http://www.cnk0n9.com/fckeditor/editor/fckeditor.html, 上传图片,浏览,上传一个aspx的一句话木马,名字为:a.aspx. ...

  9. IIS的Unicode漏洞攻击

    IIS有十多种常见漏洞,但利用得最多的莫过于Unicode解析错误漏洞.微软IIS 4.0/5.0在Unicode字符解码的实现中存在一个安全漏洞,用户可以远程通过IIS执行任意命令.当IIS打开文件 ...

随机推荐

  1. PHP学习方法总结

    怎样快速学好PHP技术  PHP学习方法总结   怎样快速学好PHP技术?我想这应该是大多数参加PHP培训学习PHP的同学比较关心和想要知道的问题,今天扣丁学堂小编就给大家简单谈谈怎样快速学好PHP技 ...

  2. java开发-问题清单

    本人是做Java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些 1. junit用法,before,before ...

  3. Python环境搭建之OpenCV

    一.openCV介绍 Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于 ...

  4. 微擎框架小程序 uitl

    获取用户信息 util.getUserInfo(callback) 获取成功后会将用户信息写入到缓存中,如果指定了回调函数,则会调用回调函数 callback 获取成功后的回调函数 示例 var ap ...

  5. ubuntu 安装 环境

    svn   https://blog.csdn.net/leibris/article/details/72982804         https://blog.csdn.net/frankchen ...

  6. 配置文件 .properties 的使用。

    在代码中使用 @Controller public class IndexController { @Value("${CONTENT_LUNBO_ID}") private Lo ...

  7. 基于二进制RPC协议法的轻量级远程调用框架 ---- Hessian

    使用Java创建Hessian服务有四个步骤: 1.创建Java接口作为公共API                             (client和server端 创建一个相同的借口) 2.使 ...

  8. 安装设置IIS5.1

    1.防止不停提示无法复制staxmem.dll: esentutl /p %windir%/security/database/secedit.sdb提示数据库损坏,是否恢复,选是,出现以下提示后退出 ...

  9. WDA-FPM-4-用OVP做查询跳转到明细

    转载:https://www.cnblogs.com/sapSB/p/10100697.html   FPM四:用OVP做查询跳转到明细 前面做了查询的UIBB配置,在这边可以直接复用,查询的feed ...

  10. fiddler 修改request请求

    例:在request url后追加&test=1参数 在OnBeforeRequest函数中添加以下代码 if(oSession.uriContains("www.bing.com/ ...