目录
Pass-01(JS 绕过)
Pass-02(文件类型验证)
Pass-03(黑名单验证)
Pass-04(黑名单验证.htaccess)
Pass-05(大小写绕过)
Pass-06(末尾空格)
Pass-07(增加一个.)
Pass-08(增加一个::$DATA)
Pass-09(代码不严谨)
Pass-10(PPHPHP)
Pass-11(0x00 截断)
Pass-12(Post 0x00 截断)
Pass-13(图片木马)
Pass-14(图片木马)
Pass-15(图片木马)
Pass-16(二次渲染绕过)
Pass-17(条件竞争)
Pass-18(解析漏洞)
Pass-19(黑名单)
Pass-20(白名单)
Pass-01(JS 绕过)
1.保存当前页面。
2.使用编辑器打开页面,修改代码。
3.修改成如下内容。
if (1 == -1 )
4.打开我们下载的html文件,上传我们的1.php,上传成功。
Pass-02(文件类型验证)
1.通过下面代码可以看出,他验证的是文件类型。
2.使用 bp 拦截,修改Content-Type: image/png。
3.放包之后就发现上传成功。
Pass-03(黑名单验证)
1.根据代码我们发现是黑名单验证。
2.根据apche服务器能够使用php解析.phtml .php3,我们可以使用php3后缀尝试上传。
Pass-04(黑名单验证.htaccess)
使用.htaccess(超文本访问)是许多 Web 服务器根据目录应用设置的有用文件,允许在运行时覆盖 Apache 服务器的默认配置。使用.htaccess,我们可以在运行时轻松启用或禁用任何功能。
<FilesMatch "loudong.jpg">SetHandler application/x-httpd-php</FilesMatch>






Pass-05(大小写绕过)
代码里面没有验证大写,可以把文件名变成大写
1.我们使用bp抓包进行修改。
2.上传成功。
Pass-06(末尾空格)


Pass-07(增加一个.)


Pass-08(增加一个::$DATA)
在 window 的时候如果文件名+"::$DATA"会把::$DATA 之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA 之前的文件名,他的目的就是不检查后缀名例如:"phpinfo.php::$DATA"Windows 会自动去掉末尾的::$DATA 变成"phpinfo.php"上面代码没有::$DATA,这块的验证

Pass-09(代码不严谨)
借助的是代码不严谨deldot,即从字符串的尾部开始,从后向前删除点.,直到该字符串的末尾字符不是.为止。而如果中间有个空格,就不会继续删除
<?php
include '../common.php';
$file_name = deldot('image.jpg. .');//删除文件名末尾的点
echo $file_name;
?>
使用bp抓包,在文件名后添加 ". ."
Pass-10(PPHPHP)
str_ireplace 函数用于字符串替换操作,不区分大小写其语法是str_ireplace(find,replace,string,count)。参数 find 必需,规定要查找的值;replace 必需,规定替换 find 中的值的值;string 必需,规定被搜索的字符串。


Pass-11(0x00 截断)
这个案例要求php 的 magic_quotes_gpc 为 OFF 状态关键的代码在于这里的’save_path 是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过


00 截断是操作系统层的漏洞,由于操作系统是 C 语言或汇编语言编写的,这两种语言
在定义字符串时,都是以\0(即 0x00)作为字符串的结尾。操作系统在识别字符串
时,当读取到\0 字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通
过修改数据包,插入\0 字符的方式,达到字符串截断的目的。
我们这里上传loudong.jpg。
再使用bp抓包修改。
Pass-12(Post 0x00 截断)
和上面一题代码对比,这里使用的是 Post 方式
但和 get 对比,需要多做一次解码的工作
GET 型提交的内容会被自动进行 URL 解码,在 POST 请求中,%00 不会被自动解码
使用bp抓包修改
我们需要对%00进行url编码,然后放包
Pass-13(图片木马)
这个案例会验证上传内容,确认是图片格式,所以不能简单把 php 转化为 jpg,需要使用图片木马
copy image.png /b + info.php /a webshell.png






Pass-14(图片木马)
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息
Pass-15(图片木马)
PHP 中的 exif_imagetype()函数用于确定图像的类型。此函数读取给定图像的第一个字节并检查其签名。当找到正确的签名时,则 exif_imagetype()返回适当的常量值;否则它返回 False。
和上面的题的步骤一样
Pass-16(二次渲染绕过)
这个案例使用的是 imagecreatefromjpeg、imagecreatefrompng、imagecreatefromgif三个不同的方法来验证不同的文件,绕过格式不正确,会报出异常但这题重新渲染了图片,植入木马的图片实际已经被删除了,这个案例建议使用 gif 的文件来上传木马,gif 最高支持 256 种颜色。由于这种特性,重新渲染改动不会太多!
Nodepad++安装新插件

Pass-17(条件竞争)
这个是白名单验证,unlink 函数是删除文件,rename 函数进行文件的移动(也会删除源文件)
但仔细看这段代码,是不管什么文件都能传,但不管是否图片,后门都删除,可以考虑条件竞争
就是没删除之前,如果文件是打开的状态,可能删除失败,这样就能保留原理的文件
直接上传一个1.php文件,然后进行抓包,将数据包发送至intruder下。
然后发包,用另一个浏览器一直访问1.php地址,只要在上传的一瞬间,他还没来的及删除、修改就可以了。
Pass-18(解析漏洞)
这里的话采用了白名单

Pass-19(黑名单)



Pass-20(白名单)
end() 函数将数组内部指针指向最后一个元素,并返回该元素的值,所以这个函数可以接受数组的
reset() 函数将内部指针指向数组中的第一个元素,并输出,所以这个函数也可以接受数组的
count() 统计数组有多少个元素
既然可以接受数组
save_name[0]=upload-20.php
save_name[2]= jpg
这行代码拼接的名字为
upload-20.php+"." +save_name[1]的数据
由于 save_name[1]没有,结果为 upload-20.php.
使用bp抓包,并如下图修改