文件上传训练:
在做完了sqli-labs 之后,咋们来看看这个上传文件的题。
第一关:
他的界面直接提示着,请选择上传的图片,肯定就会有过滤的,咋们先上传一个.php文件试试水。果然,报错了,说是上传jpg,gif,png 格式的文件,好办,去bp上修改一下,查看源码,这儿是前端验证。如果是前端验证,咋们就把php文件的后缀改为他支持的格式,然后在bp 上再改回来就欧克了。
上传成功,然后用菜刀连接,直接连接成功。
第二关:
在这一关咋们看了一下源码,发现这一关是检查文件扩展名Content-type, , 照片的文件扩展名是 image/jpeg/gif/png。php 的文件扩展名是application/octet-stream,所以这边就有两种上传方法,第一种是上传图片马,然后在bp上修改文件后缀名,就和上一关一样了,还有一中是直接上传php文件,在bp修改文件扩展名为照片的文件扩展名。用菜刀可以连接。
第三关:
这一关看了源代码,发现过滤挺多的,首先是过滤文件名的空格,然后删除文件名的最后的点,删除空格和删除点这个是为了防止iis7.5的解析漏洞,就是在文件名后面加上点或者空格会被windows解析成正常的,不是iis本身的漏洞。 然后匹配到点的后面的字符串,也就是保留文件名。 然后再将文件名转换成小写,这就是防止大小写过滤,再去去除字符串 ::$DATA ,,,这个也是为了防止解析漏洞,因为::$DATA会将后面的内容转换为文字流,这个只能在widows上有,最后再去除一下空格。然后判断这个文件名是不是在黑名单中,如果在,上传不成功,如果不在,将文件重新命名为时间戳文件后上传。
这边我尝试我几种绕过姿势,发现都是可以,接下来我们一一讲解:
- 咋们可以发现把::$DATA过滤了,但是只是过滤了一遍,所以我们可以双写来建立这个字符 修改文件名为 test.php: