
在很多网站中 特别是在论坛系统中 往往存在文件上传的功能 文件上传功能允许用户将本地的文件通过Web页面提交到网站服务器上 但是如果不对用户的上传进行任何限制的话 可能会对服务器造成很大的危害
一个简单的文件上传页面
以下代码是一个简单的文件上传页面 <?php if(isset($_POST[ form ])) { $uploadfile = upfiles/ $_FILES[ upfile ][ name ] //上传后文件所在的文件名和路径 move_uploaded_file($_FILES[ upfile ][ tmp_name ] $uploadfile) //上传文件 print_r($_FILES) //输出文件信息 die() } ?> <> <head> <title>文件上传</title> <meta equiv= Content Type content= text/charset=gb > </head> <H >文件上传</H > <form enctype= multipart/form data action= method= post > <input name= upfile type= file > <input name= form type= hidden value= form ><BR> <input type= submit value= Submit > </form> <body> </body> </> 上面的代码将文件上传到网站服务器并存储在upfiles文件夹下 但是 由于上面的文件上传程序没有对上传的文件进行任何检查 用户可以通过该程序上传自行编写的PHP脚本到服务器上并通过浏览器运行 由于PHP脚本潜在的危害性 该漏洞可能会导致服务器的彻底崩溃及数据的丢失 漏洞防护措施 解决上面所述问题的一种方法是通过检查上传文件的类型来限制用户的文件上传 如以下代码所示 <?php if(isset($_POST[ form ])) { if($_FILES[ upfile ][ type ] == image/pjpeg ) //检查文件类型是否为JPEG { $uploadfile = upfiles/ $_FILES[ upfile ][ name ] //上传后文件所在的文件名和路径 move_uploaded_file($_FILES[ upfile ][ tmp_name ] $uploadfile) //上传文件 print_r($_FILES) die() } else { die( 上传文件的格式不正确! ) } } ?>
lishixinzhi/Article/program/PHP/201311/214771、 前端检测绕过
有的站点只在前端对文件的类型有所限制,我们只需用bp抓包然后修改文件后缀名就能绕过这种检测。
2、 文件头检测绕过
有的站点使用文件头来检测文件的类型,这种检测可以在shell前加入相应的字节一绕过检测,几种常见的文件类型的头字节如下:
3、 后缀检测绕过
部分服务器仅根据文件后缀、上传时的信息或者文件头来判断文件类型,此时可以绕过。php由于历史的原因,部分解释器可能支持符合正则/ph(p[2-7]?|t(ml)?)/的后缀,如php/php5/pht/phtml/shtml/pwml/phtm等。如果后端对文件名进行了过滤,可以尝试双写文件名,比如1.pphphp。
4、 系统命名绕过
在windows系统中,上传不符合windwos命名规则的文件名会被windows系统自动去掉不符合规则符号后面的内容,例如:test.asp.、test.asp(空格)、test.php:1.jpg、test.php:: D A T A 、 t e s t . p h p : : DATA、test.php:: DATA、test.php::DATA…这些文件上传到服务器端之后都会变成test.php
在linux系统下,可以尝试上传文件后缀名为大小写混用的Php文件。
5、 文件包含绕过
在文件包含的时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件,用户可以对变量的值进行控制,而服务器端未对变量进行合理的校验,这样就导致所包含的文件有可能存在恶意代码。比如1.php
<?php $file=$_GET[‘file’]include($file)?>
这个程序就包含了一个文件,我们在1.txt文件中写入
<?php phpinfo()?>
然后将这个文件包含在1.php中1.php?file=1.txt这样
<?php phpinfo()?>就成功写入1.php这个文件当中,我们访问1.php这个文件的时候就能出现php信息那个页面。利用这个漏洞我们就可以进行文件上传,我们只需包含一个一句话木马内容的txt就能用菜刀连接,这样就成功执行了文件上传。
6、 解析漏洞绕过
目录解析:在网站中建立名称为*.asp、.asa格式的文件夹时,其文件夹下面的文件都会被当做asp执行。
文件解析:当文件名为.asp1.jpg时,也会被当做asp执行
Apache解析漏洞:Apache在解析文件时,是从右往左,如果遇到不认识的扩展名时,就会继续向左判断,例如1.php.rar就会被当做
php解析。
IIS 7.0/IIS 7.5/Nginx<0.8.3畸形文件解析漏洞,当访问http://xxx.com/1.jpg/1.php时,此时1.php不存在,就会将1.jpg当做php文件去执行,所以如果存在该漏洞,将php木马后缀改成jpg然后访问1.jpg/1.php然后1.jpg就会被当成1.php来执行。
.htaccess,该文件里面的代码如下:
<FilesMatch “1”>
SetHandler application/x-httpd-php
这段代码的意思就是文件名包含”1”这个这个字符串就会被当成php文件来处理。但是值得注意的是上传.htaccess必须是网站根路径。
7、 文件截断绕过
00截断:由于00代表结束符,所以会把00后面的所有字符删除。
能利用这个漏洞的前提是,php版本要小于5.3.4,magic_quotes_gpc需要为OFF状态。我们用bp进行拦包之后,需要send to repeater,然后在hex中,在php后面添加00
8、 竞争条件攻击
一些网站上传文件逻辑上是允许上传任意文件的,然后检查上传文件的内容是否包含webshell脚本,如果包含则删除该文件,这里存在的问题是文件上传成功之后和删除文件之间存在一个短的时间差,攻击者就可以利用这个时间差来上传漏洞攻击。攻击者先上传一个webshell脚本1.php内容如下:
<?php fputs(fopen(‘../shell.php’,’w’),’<?php @eval($_POST[a]) ?>’)?>
代码内容就是生成一个新的webshell,shell.php,那么当1.php上传成功之后,我们快速访问这个文件,这时就会在服务器端当前目录下自动生成shell.php,这时就利用时间差完成了webshell的上传。
文件上传漏洞作为获取服务器权限最快的方式,虽然相关资料很多,但很多人对上传校验方式、如何针对性绕过检测、哪种上传和解析的场景会产生危害等还是比较模糊。本文作一些阐述,然后补充一些除了上传webshell的其他非常规挖掘姿势,包括XSS、重定向、Dos、CSRF等等。1、基础知识:
要深入了解文件上传,必须了解上传属性、常见文件的结构、图形处理函数等内容。
1) 报文特点:
观察文件上传报文的特点:
Header中Content-Type特征有二:
1.multipart/form-data(form表单的enctype属性,规定为二进制数据)
2.boundary字符串(作用为分隔符,以区分POST数据)
POST内容特征有五:
1.Content-Disposition:form-data
2. name:input表单名
3.filename:文件名
4.Content-Type:定义文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件;
5.boundary:Content-Type的值前面加了两个---
2) 常见校验规则
现存常用的上传校验规则无非下面几类:
1.客户端javascript校验(后缀名)
2.文件头content-type字段校验(image/gif):附带参数
4.后缀名黑/白名单校验:扩展名
5.文件内容头校验:GIF89a
6.文件内容校验:文件信息,二次渲染
7.自定义正则校验
3)一个澄清
文件上传和文件解析是两个过程,即使我们上传的是php文件,但解析为图片,访问php文件会显示“图片无法显示”;或者我们上传的是jpg文件,但里面混有shell脚本,若被解析为php文件也会执行;又或者上传处没法绕过检测,只能上传jpg文件,但在其他功能处存在文件包含等功能,仍可执行成功。
还是回到安全的本质,上传是“输入”,那文件解析就是“输出”,任何漏洞挖掘都需要结合输入+输出。
2、绕过技巧:
这里汇总一些实战中较常用的绕过技巧:
1)后缀名黑名单
以下替换后缀也可以解析为shell:
php:.phtml,.phpt,.php3,.php3p
asp:.aspx,asmx,ashx,web.config
perl:.pl,.pm,.cgi,.lib
jsp:.jspx,.jsw,.jsv,.jspf
Coldfusion:.cfm,.cfml,.cfc,.dbm
另外可以配合 *** 作系统的文件命名规则:
.php.,.php空格,.php:1.jpg,.php::$DATA等
这些后缀的文件会被windows系统自动去掉不符合规则符号后面的内容,从而只留下.php。
2)后缀名白名单
除了结合各种服务器解析特性,较常用的是Null Byte Injection空字节注入,插入空字节值的原因是某些应用程序服务器脚本语言使用c/c++库来检查文件名和内容。在C/C ++中,一行以/00结尾或称为NullByte。因此,只要解释器在字符串的末尾看到一个空字节,就会停止读取,认为它已经到达字符串的末尾。
如,我们将要上传的Happy.jpg的名称更改为Happy.phpA.jpg,然后上传文件,在Burp中捕获请求,切换到Hex视图。在字符串视图中找到文件名。查看相应的Hex表,并将41('A')替换为00(为空字节)。结果字符串变为Happy.php(空).jpeg。由于php解释器在内部使用C语言库,它将停止读取Happy.php后的文件名,文件将保存为Happy.php。
另一种绕过白名单的方法是使用双后缀:shell.php.jpg。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)