01. 前端JS过滤绕过
意思很简单,就是在前端对文件后缀进行了检查过滤。
可以看到只能上传jpg、jpeg、png等图片。但是我们可以使用bp进行重放达到成功上传任意文件的目的。
可以看到上传成功,我们可以访问uploads/b.php验证一下。
可以看到php代码已经执行了。同时可以看一下uploads目录
02. 文件名过滤绕过
后端对文件名进行了过滤。
可以看到后端只是过滤了php,我们可以使用大小写,php4等绕过
注:大家刚开始可能找上传路径的时候会有点迷,如果使用bp可以在响应框里面仔细看一下,一般就是在最后,或者在浏览器按F12后,上传正常文件查看路径,看下图,可以很简单的就拿到上传的路径信息。(在Network)部分查看,截图截少了。
03. Content-Type过滤绕过
简单来说就是文件类型过滤,我们可以通过抓包修改文件的Content-Type达到成功上传任意文件的目的。
我们可以看一下源码,发现确实就单纯过滤了Content-Type
04. 文件头过滤绕过
什么是文件头呢?每个不同类型的文件都有不同的文件头,大家可以使用010或者其他软件打开查看一下
我们常加的是gif的文件头,因为比较好记。GIF89a
可以看到源码里面使用exif_imagetype函数来判断。
05. .htaccess文件上传
.htaccess文件上传是利用.htaccess文件可以对Web服务器进行配置的功能,实现将扩展名.jpg、.png等的文件当作PHP文件解析的过程。同时该文件起作用的有效时间我记得是限制的,好像是五分钟(不确定)。噢,对了,大家要先上传.htaccess文件后再上传.jpg文件
06. 文件截断上传
文件截断上传原理是,上传路径可控。后端又对上传的文件名进行截取然后拼接后缀名存储。
可以看到,就算我们上传a.php的话,最终也是随机数+jpg的格式存储到up目录下。
但是由于上传路径可控,这就可以使用%00来进行截断了。这里有个技巧就是在路径后面随便添加一些字符,以便修改为00
最后访问test.php即可
07. 条件竞争文件上传
条件竞争的原理很简单,就是上传文件的时候,会先把该文件存储在该目录下,然后检测文件是否合理。两者间就会有一段空闲的时间,所以在这个时间段我们就可以访问这个文件,但是这个间隔很小,需要使用bp的重复功能进行爆破。大家可以看一下源码
所以说,条件竞争产生的原因就是代码写的不够严谨
先使用bp,拦截上传页面以及访问a.php的页面
然后使用暴力破解模块进行攻击
最终可以发现有一些访问到了的请求。
注意:这个只是演示存在条件竞争,我们真正利用在实际中,是写一个可以创建另外一个php文件的脚本达到上传木马的目的。毕竟就算访问成功,文件还是会被删除的,所以我们要在文件删除前创建一个新的木马。
如:
<?php fputs(fopen("shell.php","w"),"<?php @eval($_POST[123]);?>");?>
完结,写的比较仓促,可能有一些会没有注意到。大家如果对文件上传路径迷惑的话,可以看一下第二关结尾的部分。因为前面忘记有一些人可能会找不到上传路径的问题。