Web中间件常见漏洞总结
IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行MicrosoftWindows的互联网基本服务。
IIS目前只适用于Windows系统,不适用于其他操作系统。
基于文件名该版本默认会将*.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等)
安装IIS7.51.控制面板 -> 程序 -> 打开或关闭windows功能。
1. 下载php-5.2.6-win32-installer.msi
- 打开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程序
结果如下:
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;
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。
影响范围: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)
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更换成如下:
结果:
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 修改后如下:
执行:
当路径长度小于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中间件常见漏洞还远不止这些,等以后空闲再补录。
网络安全之对文件上传的思考
在web渗透中,最简单直接的方式就是文件上传。但是不做任何检测,直接getshell的现在已经很少了.我在平时的授权测试中,遇到的大多数都是对上传的文件内容,格式等检测的比较多的
按前端到后端绕过顺序分为:前端js检验、代码防护检测(比如waf)、服务端检测
一、文件上传安全配置
二、绕过服务端的代码检测
服务端的代码常检测request包中的三个点:
1)MIME类型
2)文件后缀
3)文件内容
理论上请求包的任何参数都可以作为检测点,但是对于文件上传功能来说,用户提交的请求包中这三个
地方,是辨别是否为恶意文件的重要的三个点,服务端检测基本都是检测这三个地方
1)MIME类型检测
代码中只校验了http头中的MIME类型。
request包中content-type字段改为image/jpeg)
这个逻辑适用于很多情况,这也是安全的基础:不信任任何客户端提交的数据。
2)文件后缀检测
文件名后缀检测分两种情况:白名单和黑名单。
绕过白名单或黑名单有诸多姿势:“服务器解析漏洞” 、 “文件命名规则”、“%00截断”、“长度
截断”、“条件竞争”、“双文件上传”、“可解析后缀”、“.htacees和user.ini”、“误用函数”
等等。
1、服务器解析漏洞
1.1、apache解析漏洞
对于Apache服务器来说,哪些后缀可以被解析是由什么决定呢?
apache中有一个关于php的默认配置文件,其中用正则指定了哪些后缀使用哪些解析器。
apache解析一个特点,解析文件时是从右往左判断,遇到不认识的后缀时,就跳过,于是就有了类似于
“.php.123”这种绕过方式。大多情况下,我们遇到apache解析漏洞的是配置错误导致的
1.2、nginx和iis7.5/7.0解析漏洞
此解析漏洞其实是php的配置错误导致。
php为了支持path info模式创造了fix_pathinfo这个选项,当它被打开时,fpm就会判断请求的文件是
否存在,如果不存在就去掉最后一个\\开始的内容,再次查看文件是否存在,不存在再去掉从\\开的内容
,循环往复。所以当请求http://192.168.1.100/admin/upload/shell.jpg/.php这么个文件时,fpm会
把/.php去掉把shell.jpg当作php执行。
后来出现了seccurity.limit_extensions选项,这个选项默认配置.php文件才能被fpm执行。
利用条件:
1、fast-cgi模式运行
2、Fix_pathinfo为1 (默认为1)
3、seccurity.limit_extensions选项允许(默认只解析.php)
1.3、iis5.x- iis6.x解析漏洞
使用iis5–iis6的基本都是Windows server 2003这种老服务器了。
这种老服务器默认一般只解析asp。
这个解析漏洞很简单,就两条:
1、以*.asp命名的文件夹下所有文件都以asp文件执行
2、.asp;.jpg这种形式的命名方式会自动会忽略掉;后的内容。
2、文件命名规则
2.1、windows命名规则
1、文件名长度最大为255个英文字符。(或者是127个中文字符+1个英文字符)
2、全路径最大长度最大为260个字符。
3、访问文件不区分大小写(部分应用程序使用时除外),显示文件时有大小写。
4、开头不能使用空格,其他地方可以。
5、文件名不能包含:< > | / \\ * ? :
2.2、linux命名规则
1、文件名最大长度为255
2、全路径长度最大为4096(16级最大文件长度)
3、区分大小写
4、除“/”之外所有字符都可以使用
5、linux不以文件扩展名区分文件类型,对linux来说一切皆文件。
linux下通过命名规则绕过的话,可以尝试 \\ 或者 && ; 等命令分割符号绕过
3、00截断
00截断常见的有%00、0x00等,他们都是表示ascii字符表中的保留字符chr(0)。
不管表示编码方式有啥区别,只要能让服务器正确解析为chr(0)就行。
00截断的原理:chr(0)表示结束。
限制条件:
小于php5.3.4 小于jdk1.7.0_40
未过滤chr(0),例如magicquoesgpc为off
4、长度截断
当文件名的长度超过系统允许的最大长度时,会将超出部分进行截断。
(部分系统不会进行截断,无法创建)
测试中可以使用二分法,不断尝试最大长度,然后进行截断。
5、条件竞争上传
当代码中的逻辑是先保存上传的文件,然后再判断上传文件是否合法时,便存在时间竞争条件漏洞。
首先写个生成马儿的马儿。
上传马儿,同时使用burpsuit不断请求马儿,或者写个脚本跑,
6、双文件上传
当代码中只对一处文件名做校验时,便存在双上传的漏洞。
使用burpsuit抓包改包或者F12修改前端代码都可以。
7、可解析后缀
不常见的可解析后缀:
1、ph(p[1-7]?|t(ml)?) ,shtml,pwml
2、asa ,asax, cer, cdx ,aspx,ascx,ashx,asmx,asp,
3、jspx,jspf,jspa,jsw,jsv,jtml
8、.htacces和user.ini
利用方式差不多,都是先上传配置文件,然后上传图片马之类的。
唯一不同是,user.ini是把图片内容附加在php脚本前面或者后面,类似于require()函数;
.htaccess是把图片内容用php来解析。
9、误用函数
empty()、isset()、strpos()、rename()、iconv()、copy()
3)文件内容检测
1、图片马
一般情况下检测文件相关信息、文件渲染都可以通过制作的图片马进行绕过。
文件渲染顾名思义,就是对上传的文件进行加载渲染,例如加载图片检测是否能正常使用。
绕过方式:burpsuit改包 或者 copy 1.jpg /b + 2.php /a 3.jpg 生成图片马
2、二次渲染
二次渲染就不好过了,因为它会把图片中多余的语句去除,包括你的代码。
关于怎么制作过二次渲染的图片马,建议直接用别人做好的图片马
网络安全干货知识分享 | 解析漏洞总结(转载)
本文接着上一期的文件上传进行更进一步的学习,需要网络安全课件资料+大厂面试课题可以私信我!
文件解析漏洞概述
文件解析漏洞,是指Web容器(Apache、Nginx、IIS等)将一些特殊文件解析成脚本文件格式,导致攻击者可以利用该漏洞实现非法文件的解析。
解析漏洞的分类
常见的解析漏洞分为 IIS解析漏洞,Apache解析漏洞和Nginx解析漏洞
IIS解析漏洞
IIS(Internet Information Services)是微软出品的灵活、安全、易于管理的Web服务器。
漏洞简介
环境
一般为 IIS/6.0 搭配 windows 2003
修复方法
阻止创建.asp类型的文件夹
阻止上传 xx.asp;.jpg 类型的文件名
阻止上传.asa, .cer,.cdx 后缀的文件
环境搭建和复现
记得 连接 windows2003 的CD
安装 windows 2003
开始→控制面板→添加或删除程序→添加/删除windows组件】。找到应用【程序服务器】,选中,点击【详细信息】,选中第一个【ASP.NET】,点确定,
下一步,完成。(中间会让选择IIS6.0文件包里的文件) 记得勾选
在网站目录中新建一个a.asp的文件,然后用记事本打开写入<%=now()%>
测试时发现报错,根据提示打开 Active service pages
测试没有问题后,新建asp webshell,测试解析漏洞
目录解析
创建目录为b.asp 的文件夹,在创建的文件夹下创建文件a.jpg , 内容为:<%eval>
蚁剑连接
文件解析
创建文件 :test.asp;.jpg 内容为:<%eval>
IIS 7.0/7.5 CGI解析漏洞
IIS7/7.5的漏洞与nginx的类似,都是由于php配置文件中,开启了cgi.fix_pathinfo,而这并不是nginx或者iis7/7.5本身的漏洞。
漏洞条件
php.ini 里的 cgi.cgi_pathinfo=1
IIS7 在fast-cgi 运行模式下
测试(这个漏洞我会在nginx详细叙述 大家往下看)
- 在站点根目录创建 webshell.jpg文件,文件内容为:
- 配置CGI模式
- 在php.ini文件里将cgi.fix_pathinfo 取消注释并把值改为1
- 更改网站的处理程序映射 管理工具 –> IIS -> WIN-5RQ4P819403 -> 处理程序映射
- 访问 webshell.jpg/.php, webshell.jpg 成功被解析
- <?php$a = \’\’;file_put_contents(\’123.php\’,$a);?>然后访问test.jpg/.php或test.jpg/abc.php 当前目录下就会⽣成⼀句话⽊马123.php。
修复方法
1、 将php.ini文件中的cgi.fix_pathinfo的值设置为0,这样php再解析1.php/1.jpg这样的目录时,只要1.jpg不存在就会显示404页面
2、 php-fpm.conf中的security.limit_extensions后面的值设置为.php
环境搭建和复现
搭建IIS7.0
- 勾选CGI 否则无法使用IIS 解析PHP
忘记添加 可以在这里添加
安装完成后,点击 处理程序映射
这里需要安装php,直接 装个 phpstudy-iis版
这里要注意,如果windows上安装了mssql,也会占用80端口,
例如:
发现占用80端口的确是 SQL Server 2008 里面的组件——SQL Server Reporting Services (MSSQLSERVER)。是 SQL Server 的日志系统,
关闭方法: 在运行框中输入 services.msc ,进入服务窗口。或者直接在开始菜单里面的搜索框中输入“服务”即可打开。然后找到 SQL Server Reporting Services (MSSQLSERVER) 这个服务,然后停止,被占用的80端口就被释放出来了。你也可以设置它的启动方式为“禁用”。
测试一下
访问webshell.php
没有问题
添加 处理程序映射
- 打开之前php的可执行文件同一级目录下的php.ini
- 修改cgi.fix_pathinfo的值为1
- 重启 IIS
- 上传webshell.png ,访问
- 添加/.php 后访问
Apache 解析漏洞-多后缀解析漏洞
漏洞描述:Apache 解析⽂件的规则是从右到左开始判断解析,如果后缀名为不可识别⽂件解析,就再往左解析,直到碰到认识的扩展名为⽌,如果都不认识,则会暴露其源代码。这种⽅法可以绕过基于⿊名单的检查。
比如:test.php.x1.x2.x3 ,Apache将从右至左开始判断后缀,若x3非可识别后缀,再判断x2,直到找到可识别后缀为止,然后将该可识别后缀进解析 test.php.x1.x2.x3 则会被解析为php
我们可以完全上传⼀个 xxx.php.abc 这样名字的 webshell ,Apache仍然会当做PHP来解析。
Apache 能够识别的文件在mime.types文件里。
影响版本
Apache 2.0.x <= 2.0.59
Apache 2.2.x <= 2.2.17
Apache 2.2.2 <= 2.2.8
修复方法
后缀验证尽量使用白名单的方式,这样即使使用不存在的后缀名,也无法绕过。
- 如果在Apache的 /etc/apache2/apache2.conf里有这样的配置
这时只要文件名是shell.jpg,会以php 来执行。
- 如果在Apache的 conf 里有这样一行配置AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是qwzf.php.jpg也会以php 来执行。
- 如果在 Apache 的 conf 里有这样一行配置AddType application/x-httpd-php .jpg , 即使扩展名是.jpg,也会以php来执行。
Apache提供了一种很方便的、可作用于当前目录及其子目录的配置文件——.htaccess(分布式配置文件) 将Apache的/etc/apache2/sites-available/default里AllowOverride None改为AllowOverride All
开启rewrite_mod
这样.htaccess文件就会生效。
在win 下 必须先开启mod_rewrite功能
先开启httpd.conf 将下面这个行的注解拿掉#LoadModule rewrite_module modules/mod_rewrite.soAllowOverride controls what directives may be placed in .htaccess files.# It can be \”All\”, \”None\”, or any combination of the keywords: # Options FileInfo AuthConfig Limit #将
搜索
AllowOverride None修改为AllowOverride All
****
重启服务器服务可以让.htaccess档案生效
测试
方法2 :上传 webshell.php.jpg
方法1和方法3: 上传 webshell.jpg修复方法
1.apache配置文件,禁止.php.这样的文件执行,配置文件里面加入
2.关闭重写
Apache HTTPD 换行解析漏洞
漏洞简介:Apache HTTPD是美国阿帕奇(Apache)软件基金会的一款专为现代操作系统开发和维护的开源HTTP服务器;Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。在解析PHP时,xx.php\\x0A将被按照PHP后缀进行解析,导致可以绕过一些服务器的安全策略。
条件:1、获取文件名时不能用$_FILES[\’file\’][\’name\’],因为它会自动把换行去掉。
2、Apache版本为2.4.0到2.4.29
3、服务器必须是linux系统,因为windows环境下不支持后缀名带有换行符\\x0a
影响版本HTTPD :2.4.0~2.4.29
漏洞原理
看完上面的源代码我们很容易就能知道我们上传xx.php%0a和xx.php是不一样的,我们上传xx.php%0a就可以对文件上传的黑名单进行了绕过
只要满足这么一个正则匹配,就会告知Apache将这个满足匹配的文件按PHP文件来解析
但是不巧的是这里还有一个东西就是$这个东西,它是用来匹配字符串结尾位置的,而且如果设置了RegExp 对象(正则表达式)的 Multiline(/m) 属性,则 $ 也匹配 ‘\\n’ 或 ‘\\r’。
所以如果我们设置了RegExp 对象的 Multiline 属性(\\m)的条件下,$还会匹配到字符串结尾的换行符(也就是%0a),于是也就产生了这么一个换行解析漏洞
测试
上传一个后缀末尾包含换行符的文件,绕过 FilesMatch
1.php\\x0a => 1.php
apache通过mod_php来运行脚本,其2.4.0-2.4.29中存在apache换行解析漏洞,在解析php时xxx.php\\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。该漏洞属于用户配置不当产生的漏洞,与具体中间件版本无关。
在1.php后面插入一个\\x0A(注意,不能是\\x0D\\x0A,只能是一个\\x0A),不再拦截:
社区版Burp点击1.php后面的一个字节,然后右键->Insert byte。再将插入的00修改为0a。
访问刚才上传的/1.php%0a,发现能够成功解析,但是这个文件的后缀不是php后缀,说明目标存在解析漏洞
漏洞修复1.升级到最新版本
2.将上传的文件重命名为时间戳+随机数+.jpg的格式并禁用上传文件目录执行脚本权限
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。