文件上传漏洞原理、防御、绕过

文件上传漏洞

现在大多数的站点都存在文件上传功能,该功能在为我们带来方便的同时若未对用户上传的文件进行严格的过滤,则攻击者可能向后台数据库上传病毒、木马后门程序等恶意文件。如恶意用户上传一个可以执行的WebShell程序,则可以通过该程序获取系统后台Shell执行方法从而进一步获取整个系统的操作权限。该漏洞操作简单但危害极大,成为威胁web站点安全的常见漏洞之一。

文件上传漏洞原理

文件上传漏洞主要是因为Web应用在设计和开发文件上传功能时,没有对用户上传的文件进行充分的检测及防御,导致恶意的可执行文件上传至Web服务器并造成损害

文件上传漏洞的防护

(1)对上传文件扩展名进行严格过滤,设置白名单机制只允许特定扩展名文件上传,严格过滤扩展名为“.php、.asp、.bat”等可执行文件上传
(2)限制目录权限,对于文件上传目录设置可读、可写、不可执行权限,禁止用户上传的文件在后台执行。
(3)隐藏文件上传目录,用户上传文件的目标目录对用户隐藏。

绕过方式

前端js绕过

上传1.php文件时,前端阻止上传弹窗,说明存在前端验证文件。
修改前端js代码,利用f12可修改
把1.php改为1.jpg,再利用bp抓包,修改回1.php也可上传

黑白名单绕过

如果可以上传phtml 、php3 、php4 、php5 、Php 、php (空格) php、pphphp
如果上传成功,测试是否能够解析,不能解析则此方法不行。

针对文件类型绕过

程序对文件的类型content-type进行了判断
绕过:
1、上传1.php文件,进行bp抓包,
2、有的情况不仅仅判断content-type,还判断了内容,文件头
判断文件头:上传1.php抓包在文件内容增加GIF89a
判断文件内容:上传图片马1.jpg,再修改回1.php
常见文件头

路径截断绕过与普通截断绕过

上传图片马(可以在图片马头加GIF89a),发现有保存路径
成功的条件:php版本小于5.3.4
php的magic_quotes_gpc=off
可能为路径截断绕过
1、Get:在上传路劲处…/upload/1.php%00
2、Post:对…/upload/1.php后进行16进制hex修改为00
3、还有一种非路径截断,上传图片马(视情况加GIF89a)
抓包修改为:1.php;jpg或者1.php%00.jpg或者1.php/00.jpg

win系统解析漏洞绕过

1、上传1.php(或者图片马),抓包改为1.php.
2、上传1.php(或者图片马),抓包改为1.php:: D A T A 这 是 因 为 p h p + w i n d o w s 的 情 况 下 , 如 果 文 件 名 + “ : : DATA 这是因为php+windows的情况下,如果文件名+“:: DATAphp+windows+::DATA”会把:: D A T A 之 后 的 数 据 当 成 文 件 流 处 理 , 不 会 检 测 后 缀 名 . 且 保 持 " : : DATA之后的数据当成文件流处理,不会检测后缀名. 且保持":: DATA."::DATA"之前的文件
3、上传1.php(或者图片马),抓包改为1.php:1.jpg
4、上传1.php(或者图片马),抓包改为1.php::$DATA…….

中间件解析漏洞绕过(apache)

利用了apache从右向左解析漏洞
1、上传图片马,bp抓包为1.php.xxxx.abc
2、上传.htaccess文件(内容:SetHandler application/x-httpd-php
)(如果允许上传),再上传图片马
Ps:如果能上传.htacess文件,但不能解析,可以试试下面
内容改为:

SetHandler application/x-httpd-php

Filename 为你想要上传的文件后缀名。如jpg
然后再上传1.jpg图片马即可

中间件解析漏洞绕过(iis6.0 6.5 版本)

1、上传图片马,抓包修改为1.asp;.jpg或者%00 /00也可以(截断)
2、 上传图片马抓包,修改后缀为.asa、.cer和.cdx等,当然不检测内容和类型是直接上传也可以
3、上传图片马,抓包发现有保存图片的路径,如…/upload/image

4、修改路径为…/upload/image/1.asp

(然后就会存在…/upload/image/1.asp/目录,在这个目录下任何文件当作asp文件解析) iis7.0也存在这漏洞

中间件解析漏洞(nginx)

上传图片马,拿到图片马的路径,访问的时候加上/.php 就可作为php文件解析
如/upload/image/1.jpg/.php

条件竞争漏洞

文件上传进行验证的短暂时间内,服务器对传入的文件进行了临时保存,在这短暂时间内php是可以解析的,如果解析的速度够快
绕过:
上传1.php文件,利用bp抓包,设置多线程,不断发包。
浏览器访问连接我们上传的1.php文件。
不断刷新,会在某瞬间,执行1.php成功。

//连接脚本
import requests
url = "http://127.0.0.1/upload-labs/upload/shell.php.7z"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break
    else:
	    print("NO")

二次渲染

上传图片加载后,会对图片进行二次渲养,改变大部分图片源码,绕过为:对照上传后的图片与原图片放在winhex中对比,查看图片哪个数据块没有被改变。将木马代码放在没有改变的一块中,在不损坏图片的前提下,即可绕过上传

你可能感兴趣的:(OWASF,Top10,安全,web安全,php,信息安全,网络安全)