IIS是微软开发的原生 Windows Web 服务器软件,作为 Windows 生态中承载 Web 服务的核心组件,其核心功能是接收客户端的 HTTP/HTTPS 请求,调用后端资源(网页文件、数据库、Web 应用)并返回响应,实现网站与 Web 系统的发布与访问;它深度集成 Windows 系统内核及.NET Framework、ASP.NET等微软技术栈,还支持 FTP、SMTP 等多类网络服务,广泛应用于企业内部系统、中小型商业网站,全球约 15%-20% 的活跃网站依赖其部署,而正因这种广泛的应用场景与系统集成性,其安全漏洞可能引发服务器远程控制、敏感数据泄露等严重风险,对企业 Web 服务安全至关重要。
IIS在处理类似test.asp;.jpg文件时,正常情况下不会当做asp文件解析,但在IIS6.0版本,IIS会把分号之后的内容截断,变成test.asp,当做asp文件执行。iis除了会将asp解析成脚本执行文件之外,还会将 cer cdx asa扩展名解析成asp,原因是 asp cer cdx asa这四个扩展名都是由同一个dll解析,都是asp.dll。
在IIS6.0的目录下创建一个test的目录,目录下创建一个名为test.asp;.jpg的文件访问该文件
访问结果:函数执行,打印出当时时间
上传文件存放目录设置成禁止脚本文件执行;
升级iis版本。
IIS6.0 在网站下建立的目录名称是*.asp *.cer *.cdx *.asa时,目录下的文件都会被当做asp文件解析,原理类似文件名解析漏洞,这些文件扩展名都是由asp.dll解析。
利用方法
这里我们创建一个test.asp的文件夹,文件夹下放置ceshi1.jpg、ceshi2.txt两个文件夹,文件内容均为:<%=time()%>,文件结构如下:
测试访问:
禁止创建此类文件夹名称,或者直接禁止创建文件夹;
升级IIS版本。
HTTP 协议中的 PUT 方法原本设计用途是 允许客户端向服务器指定路径上传文件( WebDAV 服务会依赖此方法实现文件管理)。而 IIS 6.0 在默认配置或管理员误操作下,可能存在两种启用 PUT 方法的场景:
WebDAV 服务开启:若服务器安装并启用了 WebDAV 组件(用于支持远程文件管理),PUT 方法会默认开放,攻击者可直接通过 PUT 请求向服务器上传文件;
非 WebDAV 场景的配置漏洞:即使未安装 WebDAV,若 IIS 6.0 的 Web 服务扩展 中未禁用 PUT 方法,或站点配置中允许 PUT 动词,攻击者仍可构造 PUT 请求触发上传。
正常情况下,Web 服务器应严格限制 PUT 方法的使用范围(如仅允许特定目录、特定用户),但 IIS 6.0 的默认配置或早期运维疏忽常导致该方法被过度开放,为文件上传提供了入口。
总之就是IIS Server在Web服务扩展中开启了WebDAV;IIS配置了写入权限。
利用options方法检测是否开启WebDAV,还有支持的协议:
使用put协议上传一句话木马的txt文件。
一句话木马:<%eval request("pass")%>
利用move方法修改扩展名,如果服务器返回201 Created则修改成功,即获得一个Webshell。
使用菜刀进行连接getshell
IIS 短文件名机制是为兼容 DOS 及早期 Windows 的 8.3 命名规则而保留的特性。长文件名会生成 8 字符主名 +~1+3 字符扩展名短名,重名则递增~后的数字。
利用这个机制可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400,该漏洞在IIS全部版本中存在,除了IIS使用.Net Framework 4时不受影响, IIS8.0以下版本需要开启ASP.NET支持,IIS>=8.0版本,即使没有安装ASP.NET,通过OPTIONS和TRACE方法也可以猜解成功,不同版本在返回结果上可能存在不同。
网站根目录存在bcadefg121.txt文件,IIS版本为6.0。
访问http://www.zero1sec.com/a*~1*/.aspx,返回400,即不存在开头为a的文件;
访问http://www.zero1sec.com/b*~1*/.aspx,返回404,即存在开头为b的文件;
访问http://www.zero1sec.com/ba*~1*/.aspx,返回400,即不存在开头为ba的文件;
访问http://www.zero1sec.com/bb*~1*/.aspx,直到找到一个返回为404的,再查询第三位;
循环访问,找到404则跳出循环,再找下一个,直到访问到该文件。
类似于sql注入中的盲注,可以编写脚本进行测试。
检测工具:https://github.com/lijiejie/IIS_shortname_Scanner,只能检测,不能猜解。
升级.net framework或者禁用ASP.NET功能(若Web环境不需要ASP.NET支持)
关闭NTFS对8.3文件名格式的支持(此方法只能禁止NTFS8.3格式文件名创建,已经存在的文件的短文件名无法移除,需要重新复制才会消失。如果不重新复制,已经存在的短文件名则是不会消失的。) 修改注册表键值:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem修改NtfsDisable8dot3NameCreation为1。修改完成后,需要重启系统生效。
禁止在URL中使用“~”及其Unicode编码。
HTTP.sys 是 Windows 系统的核心组件,运行在内核模式,负责处理 HTTP 请求,为 IIS 等 Web 服务提供底层支持,承担请求解析、连接管理、缓存等功能。
HTTP.SYS远程代码执行漏洞实质是HTTP.SYS的整数溢出漏洞,当攻击者向受影响的Windows系统发送特殊设计的HTTP 请求,HTTP.sys 未正确分析时就会导致此漏洞,成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码,可以使IIS系统蓝屏等。
主要存在Windows+IIS的环境下,任何安装了微软IIS 7.0以上的Windows Server 2008 R2/Server2012/Server 2012 R2以及Windows 7/8/8.1操作系统都受到这个漏洞的影响。
void process_range_header(char* range_str, char* buffer, int buffer_size) {
int start, end;
int total_length = 1024;
sscanf(range_str, "bytes=%d-%d", &start, &end);
int count = end - start + 1;
if (count > 0) {
memcpy(buffer, resource + start, count);
}
}
整数溢出未校验
代码中 count = end - start + 1 未检查 end 是否远大于 start。当攻击者构造 Range: bytes=0-18446744073709551615 时,end - start + 1 会因整数溢出变成负数或超大正数,导致 count 取值异常。
缓冲区边界未检查
memcpy 操作直接使用计算出的 count 作为复制长度,未验证其是否超过 buffer_size。若 count 因溢出变为远大于缓冲区大小的值,会导致缓冲区溢出,覆盖相邻内存区域。
内核模式下的风险放大
HTTP.sys 运行在内核态,缓冲区溢出会直接影响内核内存,攻击者可通过精心构造的 Range 头部控制溢出数据,覆盖函数返回地址或内核数据结构,最终实现远程代码执行(在内核态执行恶意指令)。
(1)检测漏洞是否存在,在浏览器编辑请求头,增加Range: bytes=0-18446744073709551615字段,若返回码状态为416 Requested Range Not Satisfiable,则存在HTTP.SYS远程代码执行漏洞;或者使用curl工具,命令:
curl -v www.zero1sec.com -H "Host:irrelevant" -H "Range:bytes=0-18446744073709551615"
返回码状态为416 RequestedRange Not Satisfiable,即存在漏洞。
(2)对网站执行poc,目标系统会蓝屏或者卡顿;或者使用渗透框架msf搜索该漏洞利用模块,进行测试。
WebDAV 服务在处理 HTTP 的PROPFIND 请求时,会解析请求中的 XML 数据;当攻击者发送包含特殊构造 XML 字段(如超长或畸形的<D:prop>相关内容)的请求时,服务对数据长度的校验存在缺陷,导致缓冲区溢出—— 攻击者可通过构造的恶意数据覆盖服务器内存,进而注入并执行恶意代码,实现远程控制目标 IIS 服务器。
void ScStoragePathFromUr(const char* url_path, char* local_path) {
char decoded_path[256];
url_decode(url_path, decoded_path);
strcpy(local_path, "/var/www/");
strcat(local_path, decoded_path);
}
固定缓冲区与输入长度失控
函数中 decoded_path 和 local_path 采用固定大小缓冲区,但未严格校验用户输入的 url_path 解码后的长度。当攻击者构造超长 URL 路径,解码后长度超过缓冲区容量时,后续的 strcpy/strcat 操作会导致缓冲区溢出。
用户可控输入直接拼接
url_path 是攻击者可控的 HTTP 请求参数,通过精心构造超长路径,可使解码后的 decoded_path 超出缓冲区限制。strcat 函数在拼接时不会检查目标缓冲区是否足够,直接写入数据,覆盖相邻内存区域。
溢出导致代码执行
溢出数据可覆盖函数返回地址或关键内存结构,攻击者通过精准构造恶意数据,可将返回地址指向自己注入的 shellcode,当函数执行结束时,CPU 会跳转到 shellcode 所在地址,实现远程代码执行。
(1)检测是否开启WebDAV
OPTIONS / HTTP/1.1
Host:www.zero1sec.com
若返回信息存在以下内容,说明开启了WebDAV
DAV:1,2
(2)执行exp,设置IP及其端口,监听本机端口,反弹shell
exp地址:https://github.com/g0rx/iis6-exploit-2017-CVE-2017-7269
IIS7.x版本在Fast-CGl运行模式下(cgi.fix_pathinfo=1),在任意文件如:1.jpg/png后面加上/.php,因为php不存在,会向前解析,将1.jpg/png解析为php文件。
创建jiexi.jpg文件,写入如下内容
<?php phpinfo();?>
正常访问该文件
在后面加上/.php再访问
显示服务器错误
开启该解析漏洞的利用条件
在处理程序映射中双击选择FastCGI,在请求限制中叉掉映射的选项
再次打开该页面
成功将解析jpg文件解析成php文件
配置 cgi fix_pathinfo(php ini)为0并重启php-cgi程序;
处理程序映射->FastCGI->请求限制->映射->选择文件或文件夹->确定