昨天给大家普及到了渗透测试中执行命令漏洞的检测方法,今天抽出时间由我们Sine安全的渗透工程师来讲下遇到文件包含漏洞以及模板注入漏洞的检测方法和防御手段,本文仅参考给有授权渗透测试的正规安全检测的客户,让更多的客户了解到具体测试的内容,是如何进行全面的网站安全测试。
3.8. 文件包含
3.8.1. 基础
常见的文件包含漏洞的形式为
考虑常用的几种包含方式为
同目录包含 file=.htaccess
目录遍历 ?file=../../../../../../../../../var/lib/locate.db
日志注入 ?file=../../../../../../../../../var/log/apache/error.log
利用 /proc/self/environ
其中日志可以使用SSH日志或者Web日志等多种日志来源测试
3.8.2. 绕过技巧
常见的应用在文件包含之前,可能会调用函数对其进行判断,一般有如下几种绕过方式
3.8.2.1. url编码绕过
如果WAF中是字符串匹配,可以使用url多次编码的方式可以绕过
3.8.2.2. 特殊字符绕过
某些情况下,读文件支持使用Shell通配符,如 ? * 等
url中 使用 ? # 可能会影响include包含的结果
某些情况下,unicode编码不同但是字形相近的字符有同一个效果
3.8.2.3. %00截断
几乎是最常用的方法,条件是magic_quotes_gpc打开,而且php版本小于5.3.4。
3.8.2.4. 长度截断
Windows上的文件名长度和文件路径有关。具体关系为:从根目录计算,文件路径长度最长为259个bytes。
msdn定义“`#define MAX_PATH 260“`,第260个字符为字符串结尾的“`0“`
linux可以用getconf来判断文件名长度限制和文件路径长度限制
获取最长文件路径长度:getconf PATH_MAX /root 得到4096 获取最长文件名:getconf NAME_MAX /root 得到255
那么在长度有限的时候,`././././` (n个) 的形式就可以通过这个把路径爆掉
在php代码包含中,这种绕过方式要求php版本 < php 5.2.8
3.8.2.5. 伪协议绕过
远程包含: 要求 allow_url_fopen=On and allow_url_include=On , payload为 ?file=[" %}
{% extends "x.html" %}
3.10.4. 目标
创建对象
文件读写
远程文件包含
信息泄漏 提权
3.10.5. 相关属性
3.10.5.1. __class__
python中的新式类(即显示继承object对象的类)都有一个属性 __class__ 用于获取当前实例对应的类,例如 "".__class__ 就可以获取到字符串实例对应的类
3.10.5.2. __mro__
python中类对象的 __mro__ 属性会返回一个tuple对象,其中包含了当前类对象所有继承的基类,tuple中元素的顺序是MRO(Method Resolution Order) 寻找的顺序。
3.10.5.3. __globals__
保存了函数所有的所有全局变量,在利用中,可以使用 __init__ 获取对象的函数,并通过 __globals__ 获取 file os 等模块以进行下一步的利用
3.10.5.4. __subclasses__()
python的新式类都保留了它所有的子类的引用,__subclasses__() 这个方法返回了类的所有存活的子类的引用(是类对象引用,不是实例)。
因为python中的类都是继承object的,所以只要调用object类对象的 __subclasses__() 方法就可以获取想要的类的对象。这一节渗透测试讲到的这些内容和绕过手法,如果对自己网站不太放心的话可以找专业的网站安全公司来处理解决,国内做的比较好的如Sinesafe,绿盟,启明星辰等等。