Perface
在内网使用Docker搭建了几个靶场
其中文件上传靶场是Uploads-labs,其中记录着文件上传各种姿势
准备一个个通关并记录通关
Pass-01 / 前端后缀绕过
首先第一关比较简单,直接上传个shll收到提示:
收到提示只能上传图片,但是没有截到数据包
于是可以确定是前端验证文件后缀,所以在截取到的数据包处修改文件后缀
上传后通过蚁剑成功连接
Pass-02 / MIME绕过
这是个典型的MIME绕过题目
常见的MIME类型如下:
#text表明文件是普通文本
text/plain
text/html
#image表明是某种图像或者动态图(gif)
image/jpeg
image/png
#audio表明是某种音频文件
audio/mpeg
audio/ogg
audio/*
#video表明是某种视频文件
video/mp4
#application表明是某种二进制数据
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
上传成功,用冰蝎连上
Pass-03 / 后缀黑名单绕过
很明显是后缀黑名单上传,于是理论上很简单,只要上传php其他后缀例如php3、php4、phphtml等格式.
php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf
于是上传shell后缀改为php3,例如webshell.php3
Pass-04 / htaccess绕过
这题试图上传pass3的php3文件,提示该文件不允许上传,查看提示发现,上述所有文件全部被禁止上传,有严格的文件上传后缀黑名单。
于是试图添加新的解析后缀,也就是上传.htaccess文件
<FilesMatch "sj">
SetHandler application/x-httpd-php
</FilesMatch>
上面这个文件直接上传上去,其作用就是将文件名中带有sj的文件全部当作php解析
于是我们继续上传一句话,并取名为sj.sj
成功获得shell
Pass-05 / user.ini绕过
下方的配置的意思是在.user.ini相同的目录下,所有的php文件都包含test.gif这个文件
所以之后我们就可以利用到readme.php包含一个我们上传的木马文件,再连接readme.php文件达到连接一句话木马的目的
所以我们上传一个.user.ini文件内容为:
auto_prepend_file=test.gif
然后上传这个文件到服务器,之后再编写一个一句话木马,并命名为test.gif,然后上传
这个好像要10mins才能生效
Pass-06 / 后缀大小写绕过
刚拿到题目没头绪,看了眼提示,以为是文件包含之类的,使用input上传,但是看了眼源码发现,依旧是上传黑名单,.htaccess也被加进去了,但是对php文件后缀的大小写没有进行限制,于是直接上传pass-05.PHP
比较简单,不放图了
Pass-07 / 空格绕过
这是空格上传,在文件后面加空格即可,windows会忽略后缀后面的空格,但有的系统不行
此环境就不兼容,文件上传成功,但未解析
Pass-08 / 加.过滤
文件后缀大小写、去除::$DATA、关键词过滤,在这里可以发现所有的都考虑到了,但是却没有考虑后缀为.的情况,在windows中PHP会自动去除后缀名中最后的“.”,我们可以通过这种方式来绕过:
文件上传成功,可以顺利连接
Pass-09 / ::$DATA绕过
上传文件在后面加::$DATA绕过
系统兼容性问题,无法复现,不解析,了解学习下即可
Pass-10 / 双点绕过
上传php文件,在后面加. .绕过
系统原因,对空格不忽略,无法复现,学习了解即可
Pass-11 / 双写后缀
看了下题目,上传了文件发现文件后缀被去除了,那么就很简单,使用双写后缀,上传了一句话图片马。
kaka.pphphp
上传成功
查看文件发现文件解析,成功连上
Pass-12 / 00截断
查看源码和提示,上传路径可控,并且是最终文件的存放位置是以拼接的方式,可以使用%00截断,但需要php版本<5.3.4,并且magic_quotes_gpc关闭。原理是:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
系统兼容性问题,没办法上传
Pass-13 / 二进制00绕过
上传.jpg文件,后在sava_path处修改,修改完之后,在Hex处找到+对应的2b,将其修改为00即可
但是我这里还是显示上传失败,应该php版本问题,了解学习下即可
Pass-14 / 图片马
这个主要是测试,图片马是否能正常连接的,上传你制作好的图片马
然后访问 http://xxxxx:8083/include.php?file=./upload/xxxxx.png
Pass-15 / 图片马getimagesize()检测
这题是用getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
用这个函数验证是否是图片马,一样有文件包含,题目的意思就是为了让大家可以的伪造你的图片马
Pass-16 / 文件头检测
之前做过这样的题目,会验证图片头
exif_imagetype()此函数需要开启php的exif模块,属于php的内置函数,用于读取一个图像的第一个字节并检查其签名。
制作图片马的时候要注意是否有这个文件头