美文网首页Web攻防
解析漏洞小结及BP插件开发

解析漏洞小结及BP插件开发

作者: book4yi | 来源:发表于2021-06-08 21:09 被阅读0次

    前言:


    4月底离职以后在学习BP插件开发,断断续续也写了几个插件,后面再慢慢优化把。临近毕业了,近期越来越感到颓废了……

    Apache:


    Apache Httpd多后缀解析漏洞:

    Apache的解析漏洞依赖于一个特性:Apache默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别(不在mime.types文件内),则继续向左识别,直到识别到合法后缀才进行解析。利用Apache httpd这个特性,就可以绕过上传文件的白名单。

    该漏洞和apache版本和php版本无关,属于用户配置不当造成的解析漏洞

    漏洞原理:

    由于管理员的错误配置, AddHandler application/x-httpd-php .php,在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件

    漏洞环境搭建:

    win7 + phpstudy 2014 + apache + php5.2

    在根目录上添加一个.htaccess文件,内容如下:

    AddHandler application/x-httpd-php .php
    

    在根目录下上传一个info.php.abc文件,内容如下:

    <?php phpinfo();?>
    

    漏洞复现:

    防御措施:

    • 1、使用SetHandler,写好正则
      <FileMatch ".+.php$">
      SetHandler application/x-httpd-php
      </FileMatch>
    • 2、禁止.php这样的文件执行
      <FileMatch ".+.ph(p[3457]?|t|tml).">
      Require all denied
      </FileMatch>
    Apache HTTPD 换行解析漏洞(CVE-2017-15715):

    Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。

    此漏洞形成的根本原因,在于, 正则表达式中不仅匹配字符串结尾位置,也可以匹配\n 或 \r
    影响范围:

    2.4.0~2.4.29版本

    漏洞环境搭建:

    kali + docker

    漏洞复现:

    上传一个名为123.php的文件,被拦截,在123.php后面插入一个\x0A,不再拦截:

    查看docker容器内是否成功上传:

    成功访问:

    IIS 7.x 解析漏洞:

    IIS7 及IIS7.5 在使FastCGI方式调用php时,在php.ini里设置:

    cgi.fix_pathinfo=1
    

    使得访问任意文件URL时,在URL后面添加“/x.php”等字符时,该文件被IIS当php文件代码解析

    利用条件:

    • 1、php.ini里cgi.fix_pathinfo=1(默认为1)
    • 2、在请求限制中勾选下图红框内的选项

    漏洞环境搭建:
    win7 + phpstudy 2014 + IIS7.5 + php5.2

    IIS启动对CGI的支持:

    漏洞复现:

    Nginx:


    Nginx 解析漏洞:

    该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。

    这其中涉及到php的一个选项:cgi.fix_pathinfo 该值默认为1,表示开启。php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。

    但在高版本的php中,由于security.limit_extensions的引入,使得该漏洞难以被成功利用。
    说明:限制了fastcgi解析文件的类型(即指定什么类型的文件当做代码解析),此项设置为空的时候才允许fastcgi将’.png’等文件当做代码解析

    漏洞原理:

    • 1、当攻击者访问/info.jpg/xxx.php时, Nginx将查看URL,看到它以.php结尾,并将路径传递给PHP fastcgi处理程序。
    • 2、但是fastcgi在处理’.php’文件时发现文件并不存在,这时php.ini配置文件中cgi.fix_pathinfo=1 发挥作用,如果当前路径不存在则采用上层路径。为此这里交由fastcgi处理的文件就变成了/info.jpg
    • 3、fastcgi将.jpg文件当做代码解析

    漏洞环境搭建:

    win7 + phpstudy 8.1.0.7 + nginx

    漏洞复现:

    防御措施:

    • 1、 将php.ini文件中的cgi.fix_pathinfo的值设置为0,这样php再解析1.php/1.jpg这样的目录时,只要1.jpg不存在就会显示404页面
    • 2、 php-fpm.conf中的security.limit_extensions后面的值设置为.php
    Nginx 文件名逻辑漏洞(CVE-2013-4547)

    nginx会把所有后缀名为php的文件交给fastcgi处理,在存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则.php$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。

    Fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。所以,我们只需要上传一个空格结尾的文件,即可使PHP解析之。

    影响版本:

    Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

    漏洞复现:

    成功解析:

    php解析正常图片:

    说明:该漏洞不受cgi.fix_pathinfo影响,当其为0时,依旧解析,在Windows上有所限制。

    防御措施:

    • 1、设置security.limit_extensions = .php
    • 2、升级Nginx

    BP插件开发:


    最初的想法是打造一个被动检测插件,用于检测nginx解析漏洞和IIS 7.x解析漏洞,大概的实现思路如下:

    • 1、只监听响应包,并获取其Content-Type
    • 2、当Content-Type为JPEG或者PNG或者GIF时,进行被动检测
    • 3、构造一个特定的URI,形如:abc.jpg/zxc813.php
    • 4、构造一个GET型的HTTP请求并获取分析响应包
    • 5、将响应包的body部分转变成16进制,匹配是否存在png、jpg、gif的文件头,并判断响应码是否为200,Content-Type是否为HTML
    • 6、若均满足条件,则添加至issues列表并返回

    部分代码:

    if str(resp_contentType) in ['JPEG', 'GIF', 'PNG']:
        print 'Passivecan'
        if '.jpg?' in str(request_Path) or '.gif?' in str(request_Path) or '.png?' in str(request_Path):
            request_Path = str(request_Path).split('?')[0]
    
    newRequest = self._helpers.buildHttpRequest(new_url)
    newIHttpRequestResponse = self._callbacks.makeHttpRequest(httpService, newRequest)
    target_response = newIHttpRequestResponse.getResponse()
    analyzedIResponseInfo = self._helpers.analyzeResponse(target_response)
    
    if str(target_contentType) == 'HTML' and str(target_status) == '200' and '474946383961' in target_bodys_hex or 'FFD8FFE00010' in target_bodys_hex or '89504E470D0A' in target_bodys_hex:
        issues.append(CustomScanIssue(newIHttpRequestResponse.getHttpService(),self._helpers.analyzeRequest(newIHttpRequestResponse).getUrl(), [newIHttpRequestResponse],"Nginx Analytical Vuln","Nginx Analytical Vuln","High"))
        return issues
    

    最终实现效果:

    参考如下:


    apache httpd多后缀解析漏洞复现
    IIS 7.5 解析错误 命令执行漏洞解决方案
    nginx解析漏洞复现
    Web中间件常见安全漏洞总结

    相关文章

      网友评论

        本文标题:解析漏洞小结及BP插件开发

        本文链接:https://www.haomeiwen.com/subject/jmjfeltx.html