笔记

  • 前言
  • IIS解析漏洞
    • 文件夹解析漏洞
      • 原理
      • 限制条件
    • “;” 分号截断漏洞
      • 原理
    • IIS解析漏洞检测
      • IIS 文件夹解析漏洞检测
      • IIS 分号截断漏洞检测
    • 防御手段
  • Nginx解析漏洞
    • Nginx 文件类型错误解析漏洞导致任意PHP代码执行
      • 原理
      • Nginx 空字节解析漏洞导致任意文件可解析(CVE-2013-4547)
      • 原理
      • 受该漏洞影响的Nginx版本:
    • Nginx解析漏洞检测
    • Nginx 解析漏洞的防御
  • Apache 解析漏洞
    • 配置错误导致的Apache解析漏洞
      • 该漏洞产生原因
    • Apache HTTPD 换行解析漏洞(CVE-2017-15715)
      • 原理
      • 该漏洞产生原因
    • Apache解析漏洞检测
    • Apache解析漏洞的防御
  • 解析漏洞的防御

前言

  • 这几天各种技术面试接踵而至,压得我喘不过气了!然后面试官问了我这个解析漏洞原理和利用方式以及防御手段,当然同时还问了好几个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)(.*);Nginx将会按照正则表达式 “ (.+.php)(.∗); Nginx将会按照正则表达式“^(.+.php)(.*) ;Nginx将会按照正则表达式(.+.php)(.)”对,PATH进行分割,匹配到的第一项作为“fastcg i scrip t name”,第二项作为“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权限