目录
绕过内容检查实现文件上传
文件上传漏洞简介
通常web站点会有用户注册功能,而当用户登录之后大多数情况下会存在类似头像上传、附件上传之类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,导致攻击者通过各种手段绕过验证,上传非法文件,这是在web渗透中非常关键的突破口。
文件上传漏洞危害
攻击者绕过上传验证机制上传恶意文件,通过上传的web后门获得整个web业务的控制权,复杂一点的情况是结合web服务器的解析漏洞来获取权限。
文件上传检测流程
通常一个文件以HTTP协议进行上传时,将以POST请求发送至web服务器,web服务器收到请求并同意后,用户与web服务器将建立连接,并传输数据。
制作图片马木
图片马制作方法:copy test.gif /b + eval.php /a eval.gif
将PHP一句话追加到gif图片末尾,b表示二进制文件,a表示ASCII码文件,形成一个包含webshell代码的新gif文件eval.gif。
任务描述:绕过文件头检查,添加GIF图片的文件头绕过GIF图片检查,上传图片木马,配合文件包含漏洞执行webshell。
显示源码,根据源码提示进行文件上传:
上传eval.gif并用burpsuite抓包:
可以看到图片马最后包含webshell代码;添加GIF图片的文件头GIF89a:
点击go后查看响应:
配合文件包含漏洞执行webshell:
在upload目录下写一个include.php文件,内容为:
菜刀连接webshell:
点这个‘+’号,输入webshell地址:http://10.1.1.100/upload-labs/upload/include.php?page=7820200101163204.gif
在后面的post数据输入框里输入:test=phpinfo();
点击post数据输入框后面的提交键,即可连接webshell:
任务描述:突破getimagesize(),配合文件包含漏洞执行webshell。
这里使用getimagesize()获取文件类型,直接上传图片马,添加GIF图片的文件头绕过GIF图片检查。
上传eval.gif并用burpsuite抓包,添加GIF图片的文件头GIF89a,点击‘go’之后查看响应内容:
利用菜刀,配合文件包含漏洞连接webshell:
任务描述:还可以通过上传.php文件,修改Content-Type,添加GIF图片的文件头GIF89a进行绕过。
写一个PHP一句话木马eval.php:
上传eval.php并用burpsuite抓包,修改Content-Type为image/gif,添加GIF图片的文件头GIF89a:
利用菜刀,配合文件包含漏洞连接webshell:
成功连接。
绕过白名单检查实现文件上传
常见的MIME类型
- 超文本标记语言.html文件的MIME类型为:text/html
- 普通文本.txt文件的MIME类型为:text/plain
- PDF文档.pdf的MIME类型为:application/pdf
- MicrosoftWord文件.word的MIME类型为:application/msword
- PNG图像.png的MIME类型为:image/png
- GIF图像.gif的MIME类型为:image/gif
- MPEG文件.mpg、.mpeg的MIME类型为:video/mpeg
- AVI文件.avi的MIME类型为:video/x-msvideo
00截断
1.0x00截断
0x00是十六进制表示方法,表示ASCII码为0的字符,在一些函数处理时,会把这个字符当作结束符。
0x00可以用在对文件名的绕过上,具体原理:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。也就是说系统是按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII码为0的位置在十六进制中是00。
总之就是利用ASCII码为0这个特殊字符,让系统认为字符串已经结束。
2.%00截断
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。总之就是%00被服务器解码为0x00发挥了截断作用。
3.0x0a
0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置。
任务描述:通过修改MIME类型,使其符合$_FILES['upload_file']['type']的白名单,达到上传恶意文件的目的。
在桌面写一个简单的一句话木马eval.php:
查看源码可以发现是白名单判断,只允许上传$_FILES['upload_file']['type']为'image/jpeg'、'image/png'及'image/gif'的文件。
上传eval.php并用burpsuite抓包:
修改Content-Type为image/gif,点击‘go’之后在Response处查看响应内容:
成功上传木马文件到upload文件夹。
任务描述:$img_path直接拼接,利用%00截断进行绕过,上传恶意文件并通过浏览器连接webshell。
根据源码提示进行文件上传:
可以看到是白名单判断,但是$img_path直接对上传的文件名拼接,使用$_GET传参,我们可以利用%00截断进行绕过。
注:%00截断的条件:
- PHP版本小于5.3.4;
- 打开PHP的配置文件php-ini,将magic_quotes_gpc设置为Off。
桌面写一个test.jpg文件:
Windows中修改PHP配置文件php.ini:
保存后重启phpStudy。
上传test.jpg并使用burpsuite抓包,save_path改为../upload/test.php%00:
连接webshell:
任务描述:0x00截断绕过,利用burpsuite的hex功能将save_path改成../upload/test.php[二进制00]形式,上传恶意文件并通过菜刀浏览器连接webshell。
通过源码提示进行文件上传:
和之前不同的是,'save_path'是通过post传进来的,需要在二进制文件中进行修改,因为post不会像get那样对%00进行自动解码。
上传test.jpg并使用burpsuite抓包,利用burpsuite的hex功能将save_path改成../upload/test.php[二进制00]形式:
在../upload/后添加test.php (.php后面加空格),filename不用修改,然后点击‘Hex’:
0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置;而0x0d表示ASCII码为/r的回车字符,回车的作用只是移动光标至该行的起始位置。
最终上传的是test.php文件。使用菜刀连接webshell:
任务描述:本关考察CVE-2015-2348,move_uploaded_file() 00截断,上传webshell同时自定义保存名称,上传成功后用菜刀连接
发现move_uploaded_file()函数中的$img_path是由post参数save_name控制的,可以在save_name中利用00截断进行绕过。
保存名称修改为‘test.php+空格.1.jpg’,点击‘上传’;
在‘Hex’中将20(表示php后的那个空格)改为00,然后点击‘go’查看响应内容:
最终上传的是test.php文件。
通过菜刀连接webshell:
菜刀连接webshell成功。
绕过黑名单检查实现文件上传
任务描述:后缀大小写绕过实现文件上传。
通过源码提示进行文件上传:
可以看出此处对后缀名为. php等的文件做了限制,但是没有将后缀进行大小写统一,我们可以通过大小写绕过上传恶意文件。
在桌面写一个简单的一句话木马eval.php:
上传eval.php并用burpsuite抓包,将文件后缀改为.phP,点击‘go’之后在Response处查看响应内容:
可以看到文件已经成功上传,但是文件名已经变成了202204020052033933.phP。一些网站会对上传的文件进行文件名随机修改,以防攻击者通过原文件连接webshell,如果不通过burpsuite抓包检测很难发现这一点。
Firefox浏览器访问脚本http://10.1.1.100/upload-labs/upload/201904101753558013.phP,并开启post data:
任务描述:空格绕过实现文件上传。
通过源码提示进行文件上传:
发现还是黑名单检测,但是没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过。
还是上传之前的PHP一句话木马eval.php并用burpsuite抓包,将文件后缀改为.php+空格:
利用菜刀进行webshell连接:
任务描述:利用Windows系统的文件名特性,通过点绕过实现文件上传。
通过查看源码可以发现没有对后缀名进行去‘.’处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的‘.’,通过在文件名后加‘.’进行绕过。
上传eval.php并用burpsuite抓包,将文件名改为‘eval.php.’:
虽然在burpsuite里看到的是.php.文件,但是在Windows里保存的会是.php文件
通过菜刀连接:
任务描述:利用Windows特性,通过::$DATA绕过实现文件上传。
通过源码提示进行文件上传:
发现没有对后缀名进行去‘::$DATA’处理,利用Windows下NTFS文件系统的一个特性,即NTFS文件系统存储数据流的一个属性$DATA,当我们访问aa.asp::$DATA时,就是请求aa.asp本身的数据。可以在后缀名后加‘::$DATA’,绕过对黑名单的检测。
上传eval.php并使用burpsuite抓包,修改后缀名为.php::$DATA,点击‘go’之后查看响应内容:
成功上传文件到upload文件夹下。
Windows文件流特性绕过,上传成功后实际保存的文件名是202204020245414181.php
使用菜刀连接webshell:
任务描述:配合解析漏洞,构造‘点+空格+点’的形式实现文件上传。
还是黑名单过滤,注意第15行和之前不太一样,路径拼接的是处理后的文件名,直接上传.php、.php+点、.php+空都会被当成黑名单过滤掉,因为源代码做了删除文件名末尾的点和首尾去空处理。可以配合解析漏洞,构造‘点+空格+点’的形式,绕过黑名单的检测上传恶意文件。
上传eval.php并使用burpsuite抓包,修改后缀名为.php. .(点+空格+点):
成功上传文件至upload文件夹,而Windows系统存在文件名特性,最终保存的文件名为eval.php。
通过菜刀连接webshell:
任务描述:双后缀名绕过实现文件上传。
通过源码提示进行文件上传:
依然是黑名单限制,注意到这里将问题后缀名替换为空,我们可以利用双写绕过,进行恶意文件的上传。
上传eval.php并使用burpsuite抓包,修改后缀名为pphphp,点击‘go’之后查看文件是否上传成功:
通过菜刀连接webshell: