文件上传靶场upload-labs实战(连载中)
前言
来具体学习一下文件上传的相关知识,参考教程:https://blog.csdn.net/qq_43390703/article/details/104858705,dalao写的很全面了。
Pass-01(前端扩展名验证)

前端F12删除CheckFile无法绕过,查看源代码,发现后台对扩展名进行了过滤,限制只能传图片,上传png一句话木马,burp抓包修改扩展名为php后放包,蚁剑连接即可。
Pass-02(MIME类型绕过)

和Pass-01同样的方法处理即可,我们来看看源码:
- file_exists:检查所给的文件或目录是否存在,若存在则返回true;
- move_uploaded_file(file, newloc):将指定文件file移动到新目录newloc;
- $_FILES['file']['type']:文件的MIME类型,在数据包的Content-Type中可以看到;
- $_FILES['file']['tmp_name']:文件被上传后在服务端储存的临时文件名;
- $_FILES['file']['name']:文件在客户端主机上的原名称;
首先检查是否存在上传路径,之后对文件的MIME类型进行判断(可以用burp抓包修改),判断是否为jpeg,png或gif图片;之后声明temp_file和img_path是为了后面move_upload_file。总的来说只有一层MIME类型验证,所以和上一题使用同种方法即可。(或者先上传php文件,抓包改Content-Type也可以)
Pass-03(phtml绕过)

先和第一题一样处理,但被ban了,应该是后端要过滤扩展名了:

这些扩展名不让用,改成phtml文件,可以成功上传。不知道为什么蚁剑连接不上其他扩展名,明明我已经设置了phtml之类的解析......
转战BUU上的靶机,成功连接。
Pass-04(.htaccess)

基本上能过滤的扩展名都过滤了,但是没有过滤.htaccess,.htaccess文件可以设置对文件的解析。可以考虑先上传.htaccess文件修改配置,再传一句话木马。.htaccess文件配置如下:
SetHandler application/x-httpd-php
该配置会将所有上传图片解析为php,之后直接一句话木马连接即可。(还有其他的配置方式)
另一种方法——扩展名冗余绕过(限Apache)(我发现我的httpd.conf里没有DefaultType,一直报500):
本质是Apache解析漏洞。Apache中的主配置文件httpd.conf中存在DefaultType用于告诉apache该如何处理未知扩展名的文件,默认参数为text\plain。Apache认为一个文件可以拥有多个扩展名,并且是从右往左解析,如果第一个扩展名不是可解析的扩展名,就直接解析第二个,因此.php.aaa这样的扩展名会被解析为php。
Pass-05(.user.ini)

过滤了.htaccess,但是把.ini放了出来,我们采取上传.user.ini的方式绕过,关于.user.ini的知识看这位dalao的文章:https://blog.csdn.net/u014029795/article/details/117252533
实际操作一下:首先,确保开启了FastCGI。
我们写一个.user.ini文件,内容是:
auto_prepend_file=shell.png
auto_prepend_file的意思是在任意php页面执行前加载某某文件,我们把自己的一句话木马命名为shell.png,当我们访问目录下某个php文件时,会自动包含shell.png文件。
首先上传.user.ini,之后上传shell.php,并改名为shell.png。提示告诉我们在上传文件夹下有一个readme.php文件,我们访问它就可以实现包含shell(在这个文件中包含shell)。

Pass-06(大小写绕过)

这关把.htaccess过滤了,但是少了一个关键的strtolower函数,因此直接.Php即可绕过。
Pass-07(空格绕过)

tolower加回来了,但是首尾去空的trim不见了。我们采取空格绕过的方式,即扩展名添加空格,上传名字为"xxxx.php "的文件。不过直接修改文件名是不能保留住空格的,需要在burp里改包放包。
Pass-08(加点绕过)

对比一下,少了去掉末尾的点的deldot函数,那我们上传shell.php.即可绕过。
Pass-09(NTFS特性 ::$DATA绕过)

对比一下,少了个去掉字符串::\$DATA的函数str_ireplace,可以利用NTFS文件系统的::\$DATA属性绕过。
NTFS文件系统中所有的文件都至少包含一个主数据流,也就是用户可见的文件或者目录,一个文件在NTFS中真正的名称格式是<文件名>:<流名>:<流种类>。
默认数据流没有名字,所以shell.php的真正名称是shell.php::\$DATA,$DATA是表示文件内容的属性,具体我也不懂,记住shell.php等同于shell.php::\$DATA就行了。
注意,在访问的时候不要访问*****.php::\$DATA,要访问*****.php。
Pass-10(二次绕过)

这次的过滤一个都没少,但是只有一次。::$DATA是全部删除,但是deldot和trim都只执行了一次,所以我们来个多次绕过:
shell.php. .
首先去掉末尾的点,然后首尾去空,但是最后的点没有被处理掉,又变成了shell.php.,可以绕过。
Pass-11(双写绕过)

一下子少了好几个函数,但关键还是str_ireplace,这次将黑名单里的字符串替换为空串,双写绕过即可。
这个双写注意一下,在h后面加php的话,会变成phphpp,替换之后会变成hpp。所以不要在h后面双写。(挺有趣的
Pass-12(00截断路径-GET)

黑名单变成白名单了,要求扩展名为jpg、png或gif。观察到这里的上传路径是可控的,我们可以人为修改save_path的值,通过%00实现截断。
%00截断的条件:
- php版本小于5.3.29
- php.ini中magic_quotes_gpc设置为Off,这样就不会在敏感字符前加反斜杠。

这样在上传路径就变成了shell.php。
Pass-13(00截断路径-POST)

get变post,看似一样,实际上并不一样。get的值会放在url中,自动进行一次url解码;但post传数据不会进行url解码,所以不能直接修改save_path加%00,我们在hex模式下修改对应位置16进制值为00才可以生效。
Pass-14(图片马制作)
copy aaa.png/b + bbb.php/a ccc.png
/b表示以二进制方式打开,/a表示以ascii方式打开,合成得到的图片马需要配合文件包含漏洞使用,这里合成三种图片马即可。
审一下源码:


getRealFileType函数是读取文件头的2字节内容来判断文件类型,其他没什么好看的。
Pass-15(图片马制作)

这里用了一个判断图片是否为图片的函数isImage,getimagesize函数返回值如下:

image_type_to_extension盲猜是把图像类型的编号转换成对应扩展名(确实),还是合成图片马。
Pass-16(图片马制作)

换了种判断方式,exif_imagetype,获取图像第一个字节检查其签名,还是合成图片马。
Pass-17(图片马制作-二次渲染绕过)


真长,不过核心的东西就一样——二次渲染。
我对于图片相关知识了解的不多,关于二次渲染可以看这位dalao的文章:https://blog.csdn.net/weixin_45588247/article/details/119177948
用不同格式图片写一下就好,注意jpg易损,对图片要求很苛刻,有的图片经过二次渲染之后亲妈都不认得了,多选一些图片看看渲染效果。(在二进制编辑器里看,不是用眼睛看)

浙公网安备 33010602011771号