前言
- 这几天各种技术面试接踵而至,压得我喘不过气了!然后面试官问了我这个解析漏洞原理和利用方式以及防御手段,当然同时还问了好几个Top10漏洞!
IIS解析漏洞
文件夹解析漏洞
原理
- 在IIS 5.x 和6.x下,对于目录名称为“x.asp”中的任何内容,包括“1.jpg”这样的图片资源文件,都会被当作ASP文件解析
限制条件
- 需要同时存在文件夹解析漏洞和网站允许创建恶意文件夹(管理员权限)两个漏洞利用点,缺少任何一个都无法成功利用。
“;” 分号截断漏洞
原理
- IIS 6.0 下,会将“1.asp;.jpg”这样的文件当作ASP文件解析。
- 计算机对文件扩展名的理解上来说,文件扩展名是以最后一个“ . ”的后面内容为依据的,这个文件被网站过滤程序理解成了图片
- IIS 会认为分号即是结尾,后面的内容被“截断”了,认为这是ASP文件,及时使用了“白名单”过滤,也允许可以进行绕过。
IIS解析漏洞检测
IIS 文件夹解析漏洞检测
- 通过在网站根目录下创建“a.asp”文件夹,并在其中创建“1.jpg”,文件内容填写ASP代码。然后远程访问 http://target.com/a.asp/1.jpg,验证文件是否能够被当作ASP解析,以判断漏洞存在是否
IIS 分号截断漏洞检测
- 可以上传“1.asp;.jpg” 文件,然后远程访问http://target.com/1.asp;.jpg,验证文件是否能够被当做ASP解析
防御手段
- 漏洞源于IIS 服务器本身存在缺陷。可以升级IIS 服务器版本和打补丁
Nginx解析漏洞
Nginx 文件类型错误解析漏洞导致任意PHP代码执行
原理
- 服务器上任意一个已存在的文件,包括用户上传的图片、附件等,都可以被PHP-FPM解析,导致任意PHP代码执行漏洞(国内知名安全团队80sec提出)
- Nginx会将用户请求的HTTP数据包解析生成CGI环境变量,并通过FastCGI协议发送给PHP-FPM的9000端口;PHP-FPM通过这些CGI环境变量,定于到用户需要执行的PHP文件并执行,将返回结果在通过FastCGI协议的返回包返回给Nginx服务器。
Nginx 空字节解析漏洞导致任意文件可解析(CVE-2013-4547)
原理
- Nginx在遇到“%00空字节”时,与后端FastCGI处理不一致,导致可以在图片中可以嵌入PHP代码,然后通过访问“xxx.jpg%00.php”来执行其中的代码。
受该漏洞影响的Nginx版本:
- 0.8.41-1.4.3/1.5.0-1.5.7
Nginx解析漏洞检测
- Nginx 解析漏洞的表现形式就是任意文件都可以让PHP解释器执行。
通常,可以在目标站点中找到任意一个已知的静态文件,如“/robots.txt”。利用Burp Suite工具可以看到请求和响应的HTTP协议内容。 - 正常情况下"/robots.txt"的Content-Type是“text/plain”
- 如果访问“/robots.txt/.php”,其响应头字段Content-Type将变成PHP默认的“text/html”,并会增加PHP的指纹“X-Powered-By”
- 通过这个特征,可以判断目标网站是否将静态文件分发给PHP执行。
- 如果目标网站支持上传文件,攻击者用图片的形式上传一个WebShell命名为shell.jpg,并增加“/.php”访问,就成功实现了GetShell
Nginx 解析漏洞的防御
- Nginx文件类型错误漏洞是由PATH_INFO变量所导致的,如果业务上并没有用到PATH_INFO功能,可以直接在PHP.INI配置文件中关闭fix_pathionfo。
- 还可以在PHP-FPM中设置security.limit_extensions来限制PHP-FPM执行的PHP文件的扩展名,将其值设置为“.php”,则其他扩展名的文件不再会被作为PHP运行
- security.limit_extensions = .php
- 还可以在Nginx的配置文件中增加如下选项
fastcgi_split_path_info ^(.+.php)(.*) ; N g i n x 将会按照正则表达式 “ ( . + . p h p ) ( . ∗ ) ; Nginx将会按照正则表达式“^(.+.php)(.*) ;Nginx将会按照正则表达式“(.+.php)(.∗)”对,PATH进行分割,匹配到的第一项作为“ f a s t c g i s c r i p t n a m e ” , 第二项作为“ fastcgi_script_name”,第二项作为“ fastcgiscriptname”,第二项作为“fastcgi_path_info” - 对于Nginx空字节解析漏洞,可以通过升级Nginx版本来得到彻底修复
Apache 解析漏洞
配置错误导致的Apache解析漏洞
-
通常指多扩展名导致任意代码执行的漏洞。类似Nginx解析漏洞,Apache解析漏洞也是由错误配置导致。也是因为这个原因,这个漏洞并不会在Apache核心代码中修复
-
AddHandler application/x-httpd-php .php
-
AddHandler cgi-script .cgi
-
AddHandler 在用户请求某扩展名的文件时,使用某处理器处理
该漏洞产生原因
- 如果开发者在用户上传文件的时候用黑名单校验文件扩展名,攻击者可以通过上传包含不在黑名单也不被Apache识别的扩展名的文件名(如“sample.php.xyz”)来绕过校验,最后执行任意PHP代码。
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
原理
代码片段
<FileMatch "[^.]+.php$">
SetHandler application/x-httpd-php
<FileMatch>
- Apache使用的是Perl兼容的正则表达式库PCRE,其文档详细描述了“$”的语法
$ assert end of string (or line ,in multiline mode)
$ 能够匹配到的三个内容
1、一个字符串的结尾
2、一个以换行符作为结尾的字符串的结尾部分
3、在多行模式开启的情况下,匹配每一行的结尾
- 不能仅仅将“KaTeX parse error: Undefined control sequence: \n at position 30: …,如果一个文件名是以“.php\̲n̲"结尾,(\n表示换行),他是…”的。
该漏洞产生原因
- 如果开发者在用户上传文件的时候,以黑名单的形式校验文件扩展名,可以上传一个以“.php\n”为扩展名的PHP文件,这个扩展名可以绕过黑名单校验,同样也会被Apache作为PHP代码解析
Apache解析漏洞检测
利用条件
- 1、网站存在文件上传的功能点
- 2、文件上传以黑名单检测
测试文件上传漏洞的时候,可以测试如下文件
sample.php.xyz
sample.php.jpeg
sample.php\n - 上传并访问,如果能够执行PHP代码,则说明目标网站存在Apache 解析漏洞
Apache解析漏洞的防御
- 1、白名单扩展名检测,并结合文件上传以后将文件重新命
- 2、只取文件扩展名,对其进行检查,扩展名满足条件的情况下,使用uniqid()生成新文件名,并执行文件移动操作,最后保留在文件系统中的将是一个完全标准化的文件名,不会再触发Apache文件解析漏洞
解析漏洞的防御
- 1、在选择Web Server 时,一定要使用最新版或确保安全的较新版本
- 2、对于已经由业务运行,迁移Web Server存在业务中断风险的情况,需要及时打补丁
- 3、如果要修改Web Server 的默认解析配置,应当充分了解其带来的安全风险的前提下再进行修改
- 4、删除不必要的解析扩展名(如PHP3,php4等),避免攻击者通过上传可解析为脚本资源的扩展名来获取WebShell权限