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

文件上传

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

绕过方式

前端绕过

通过浏览器插件来删除检查后援js代码,然后上传webshell。上传文件时把后缀名改成png或者其他合法的格式,上传时在通过抓包工具把后缀名改回来。更改Content-Tybe为image/jpeg(上传php或者其他木马时,有时候更该这个值可直接上传成功)。

文件扩展名绕过

1
2
3
4
Php除了可以解析php后缀 还可以解析php2,php3,php4 ,phtml
Asp可解析 asa,cer,cdx
Aspx可解析 ashx,asmx,ascx
Jsp可解析jspx、jspf

黑名单限制绕过直接在后面使用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/gifimage/pngimage/jpegimage/bmpimage/webpimage/x-iconimage/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_fileauto_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864

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
2
3
<?php 
fputs(fopen("shell.php", "w"), '<?php @eval($_POST["cmd"]); ?>');
?>