1.介绍
由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件,这是在web渗透中非常关键的突破口。
可以通过抓包修改内容类型来进行绕过。
2.绕过内容检查实现文件上传
任务描述:绕过文件头检查,添加GIF图片的文件头绕过GIF图片检查,上传图片马,配合文件包含漏洞执行webshell。
(1)
通过读取文件的前两个字节来判断文件类型,可以上传图片马,添加GIF图片的文件头绕过GIF图片检查。
(2)上传eval.gif并用burpsuite抓包,可以看到图片马最后包含webshell代码;添加GIF图片的文件头GIF89a。
点击‘go’后查看响应,成功上传5120190530143008.gif文件。
(3)配合文件包含漏洞执行webshell,在upload目录下写一个include.php文件,内容为:
(4)菜刀连接webshell,点这个‘+’号,输入webshell地址:http://10.1.1.100/upload-labs/upload/include.php?page=5120190530143008.gif。在后面的post数据输入框里输入:test=phpinfo();
点击post数据输入框后面的提交键,即可连接webshell。
3.绕过白名单检查实现文件上传
1.00截断
1) 0x00截断
0x00是十六进制表示方法,表示ASCII码为0的字符,在一些函数处理时,会把这个字符当作结束符。0x00可以用在对文件名的绕过上。
2) %00截断
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。总之就是%00被服务器解码为0x00发挥了截断作用。
注:%00截断的条件:
PHP版本小于5.3.4;
打开PHP的配置文件php-ini,将magic_quotes_gpc设置为Off。
3) 0x0a
0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置。
4)0x0d
0x0d表示ASCII码为/r的回车字符,回车的作用只是移动光标至该行的起始位置。
2.常见的MIME类型
1)超文本标记语言.html文件的MIME类型为:text/html
2)普通文本.txt文件的MIME类型为:text/plain
3)PDF文档.pdf的MIME类型为:application/pdf
4)MicrosoftWord文件.word的MIME类型为:application/msword
5)PNG图像.png的MIME类型为:image/png
6)GIF图像.gif的MIME类型为:image/gif
7)MPEG文件.mpg、.mpeg的MIME类型为:video/mpeg
8)AVI文件.avi的MIME类型为:video/x-msvideo
3.修改MIME类型,使其符合$_FILES['upload_file']['type']的白名单,达到上传恶意文件的目的。
4.$img_path直接拼接,利用%00截断进行绕过,上传恶意文件并通过浏览器连接webshell。
(1)可以看到是白名单判断,但是$img_path直接对上传的文件名拼接,使用$_GET传参,我们可以利用%00截断进行绕过。
(2)桌面写一个test.jpg文件:
(3)Windows中修改PHP配置文件php.ini,保存后重启phpStudy。
(4)上传test.jpg并使用burpsuite抓包,save_path改为../upload/test.php%00:
(5)点击‘go’之后查看响应内容,最后保存下来的文件会是test.php:
(6)Firefox浏览器连接webshell;连接成功。
5.0x00截断绕过,利用burpsuite的hex功能将save_path改成../upload/test.php[二进制00]形式,上传恶意文件并通过菜刀浏览器连接webshell。
(1)与上个实验不同的是,'save_path'是通过post传进来的,需要在二进制文件中进行修改,因为post不会像get那样对%00进行自动解码。
(2)上传test.jpg并使用burpsuite抓包,在../upload/后添加test.php (.php后面加空格),filename不用修改,然后点击‘Hex’:
(3)将0d前面的20改为00,然后点击‘go’查看响应内容:
(4)最终上传的是test.php文件。
6.本关考察CVE-2015-2348,move_uploaded_file() 00截断,上传webshell同时自定义保存名称,上传成功后用菜刀连接。
(1)发现move_uploaded_file()函数中的$img_path是由post参数save_name控制的,可以在save_name中利用00截断进行绕过。
(2)上传test.jpg并使用burpsuite抓包:保存名称修改为‘test.php+空格.1.jpg’,点击‘上传’;
(3)在‘Hex’中将20(表示php后的那个空格)改为00,然后点击‘go’查看响应内容:最终上传的是test.php文件。
4.绕过黑名单检查实现文件上传
1.后缀大小写绕过
上传eval.php并用burpsuite抓包,将文件后缀改为.phP。
2.空格绕过
没有对后缀名进行去空处理,上传之前的PHP一句话木马eval.php并用burpsuite抓包,将文件后缀改为.php+空格。
3.利用Windows系统的文件名特性,通过点绕过实现文件上传
查看源码发现没有对后缀名进行去‘.’处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的‘.’,通过在文件名后加‘.’进行绕过。上传eval.php并用burpsuite抓包,将文件名改为‘eval.php.’。
4.利用Windows特性,通过::$DATA绕过实现文件上传
上传eval.php并使用burpsuite抓包,修改后缀名为.php::$DATA
5.配合解析漏洞,构造‘点+空格+点’的形式实现文件上传
路径拼接的是处理后的文件名,直接上传.php、.php+点、.php+空都会被当成黑名单过滤掉,因为源代码做了删除文件名末尾的点和首尾去空处理。
上传eval.php并使用burpsuite抓包,修改后缀名为.php. .(点+空格+点),过滤后变为.php.
6.双后缀名绕过实现文件上传
这里将问题后缀名替换为空,我们可以利用双写绕过,进行恶意文件的上传。上传eval.php并使用burpsuite抓包,修改后缀名为pphphp,过滤后变为php。