Web安全基础篇——文件上传漏洞

Web安全基础篇——文件上传漏洞
Audience文件上传
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
绕过方式
前端绕过
通过浏览器插件来删除检查后援js代码,然后上传webshell。上传文件时把后缀名改成png或者其他合法的格式,上传时在通过抓包工具把后缀名改回来。更改Content-Tybe为image/jpeg(上传php或者其他木马时,有时候更该这个值可直接上传成功)。
文件扩展名绕过:
1 | Php除了可以解析php后缀 还可以解析php2,php3,php4 ,phtml |
黑名单限制绕过直接在后面使用php3 、phptml等进行黑名单绕过。
大小写绕过:windows服务器不区分大小写,linux服务器才取分大小写,所以windows才能使用此方法。
加空格绕过:在后缀名后加空格,windows会默认去除后缀后的空格,而linux不会,所以windows才能使用此方法。
加点绕过:在后缀名加点(.php.
),windows会自动省略后缀名后的点,linux则不会去掉,只有windows服务器才能使用此方法。
双写绕过:在后缀名中间插入后缀名(pphphp
),当后端过滤php字符之后,还剩下php实现绕过。
文件流绕过:必须是window的服务器,抓包修改后缀,并在后缀后面加上::$DATA
。
白名单检测
要求只能是特定扩展名的文件才能上传。
%00截断
在url中%00表示ascll码的0 ,而ascii码的0,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
注:需满足 php 版本<5.3.4 才有可能存在此漏洞。
1 | simple.php%00.jpg-->simple.php |
文件存储时的后缀名为.php是可以被解析成php文件的,从而实现绕过。
0x00截断
原理同%00截断原理相同。我们在BP中修改时,需要使用Hex模块,添加00。
MIME检测
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
常见图片MIME类型: image/gif
、image/png
、image/jpeg
、image/bmp
、image/webp
、image/x-icon
、image/vnd.microsoft.icon
。
服务端代码是通过Content-Type的值来判断文件的类型,这样我们可以直接对文件的Content-Type进行修改来绕过此防御方式。
黑名单绕过
.htaccess
.htaccess
文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
上传.htaccess,只要有这个配置文件,并且内容为AddType application/x-httpd-php .jpg(这里是你指定的文件后缀名)
(就是把所以jpg后缀的文件全都当作php文件来执行)。
.user.ini
php.ini
是php的一个全局配置文件,对整个web服务起作用;而.user.ini
和.htaccess
一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。
.user.ini
使用范围很广,不仅限于Apache服务器,同样适用于Nginx服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)。
.user.ini中两个中的配置就是auto_prepend_file
和auto_append_file
。这两个配置的意思就是:我们指定一个文件(如1.jpg
),那么该文件就会被包含在要执行的php文件中(如index.php
),相当于在index.php
中插入一句:require(./1.jpg)
。这两个设置的区别只是在于auto_prepend_file是在文件前插入,auto_append_file在文件最后插入。
有了这个文件,就可以将hack.jpg当成php包含到任意的php文件中。
如果该上传的目录下没有php文件,那我们可以直接访问该文件夹,它会把我们上传的jpg文件当成php文件响应给我们。
文件内容检测
文件头检测
我们可以制作图片马来绕过。
1 | copy 1.jpg/b+shell.php/a hack.gif |
或者在文件头部添加文件幻数。
1 | JPEG (jpg),文件头:FFD8FF |
shell检测
禁止了文件内容中出现<?
。可以换一种木马。或者其他变形的木马。
1 | <script language="php">eval($_POST['pass']);</script> |
服务器解析漏洞
apache解析漏洞
Apache按从右到左的顺序识别文件后缀,直至找到后缀能匹配配置文件中的设置。遇到不能识别的后缀名便跳过,如shell.php.xxx
将会被解析成php文件,可用来绕过黑名单过滤。
IIS解析漏洞
*.asa
、*.asp
格式的文件夹时其目录下的文件都会当做asp文件解析。当文件名为*.asp;1.jpg
时,IIS会以asp文件来解析,也就是说;
起到了截断作用。
Nginx解析漏洞
在Nginx的服务器环境下,假如成功上传一张名为test.jpg
的文件到网站,如果我们访问/test.jpg/test.php
这个虚构的目录时服务器会直接将test.jpg
作为php文件进行解析。
条件竞争文件上传
条件竞争,在程序员日常的Web应用开发中,通常不如其他漏洞受到的关注度高。因为普遍的共识是,条件竞争是不可靠的,大多数时候只能靠代码审计来识别发现,而依赖现有的工具或技术很难在黑盒灰盒中识别并进行攻击。
后台先进行了文件上传,再进行了逻辑判断。那么在逻辑判断到删除不允许的文件这个过程有一个时间,导致了后门代码存在了此服务器上。虽然这个后门php文件很快很快就会被删除掉,但是我们可以利用BP这个工具不断的发送,一边不断发送,一边不断的访问。
在CPU不断执行unlink删除函数时,我们也不断的发送访问数据包和上传文件的数据包。就等着某一次对方CPU会先执行访问的指令,而不是先执行删除指令。这就是条件竞争。
可以上传一个写入webShell后门木马的文件,只要我们访问成功就可以生成一个木马文件。
1 |
|