条件:后端对后缀名(.asp/.aspx/.php/.jsp)做限制(黑名单)
可以上传.phtml .phps .php5 .pht
前提是apache的httpd.conf中有如下配置代码
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
条件:.htaccess绕过
黑名单拒绝了几乎所有有问题的后缀名,除了.htaccess
前提条件(1.mod_rewrite模块开启。2.AllowOverride All)
因此先上传一个.htaccess文件,内容如下:
SetHandler application/x-httpd-php
可以用第十关的方法来进行绕过也就是点空格点绕过(. .),因为它的验证首先会删除文件名两端的空格,但是我们构造的后缀名的两端没有空格,所以此验证无效,接着它会删除我们后缀名中最后的一个点,然后又会过滤掉我们的一个空格,此时上传文件的后缀名为.php.不在黑名单里面,所以可以成功被上传,而且又因为windows操作系统的原因,文件后缀名最后的点也会被删除,所以我们就完成了绕过。
补充:其实这道题要考察的是通过**.user.ini**进行绕过,但尝试了几次,没成功,以后成功了,在补充这一种方法。
条件:空格绕过
这题没有对后缀名进行去空,因此可以在后缀名加空格绕过
条件:点绕过
没有对后缀名末尾的点进行处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过:
没有对后缀名中的’:: D A T A ’ 进 行 过 滤 。 在 p h p + w i n d o w s 的 情 况 下 : 如 果 文 件 名 + " : : DATA’进行过滤。在php+windows的情况下:如果文件名+":: DATA’进行过滤。在php+windows的情况下:如果文件名+"::DATA"会把:: D A T A 之 后 的 数 据 当 成 文 件 流 处 理 , 不 会 检 测 后 缀 名 . 且 保 持 " : : DATA之后的数据当成文件流处理,不会检测后缀名.且保持":: DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::DATA"之前的文件名。利用windows特性,可在后缀名中加” ::$DATA”绕过:
代码先是去除文件名最后所有的.,再去除文件名前后的空格,再通过strrchar函数来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过
黑名单过滤,将黑名单里的后缀名替换为空且只替换一次,因此可以用双写绕过
白名单判断,但$img_path是直接拼接,因此可以利用%00截断绕过。
截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态。
save_path参数通过POST方式传递,还是利用00截断,因为POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改
通过读文件的前2个字节判断文件类型,因此直接上传图片马即可,制作图片马:
直接访问图片并不能把图片当做PHP解析,因此还需要利用文件包含漏洞
这题是用getimagesize函数判断文件类型,还是可以图片马绕过,方法同pass-14
这里用到php exif_imagetype模块来判断文件类型,用图片马绕过,方法同pass-14
判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,具体可以参考链接: 这篇文章 。可是在复现的时候还是因为二次渲染以后php代码还是出被修改。
这里是条件竞争,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此我们可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可。
也存在条件竞争的问题,不过这题对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,因此可以通过不断上传图片马,由于条件竞争可能来不及重命名,从而上传成功。
move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过