第一关
无法上传以php为结尾的文件
查看前端js代码,发现进行了前端校验,修改判断文件类型的onsubmit 改成return true绕过
第二关
检查源码发现条件判断里['upload_file']['type']只检查了content-type
可以直接将文件后缀改成 .jpg 然后用bp抓包,将发送的。jpg改成.php
第三关
检查代码发现用了黑名单,且将文件后缀名进行了处理,无法用大写绕过,但是黑名单不全,可以将后缀改为 .php5 绕过
第四关
黑名单较全面,无法用第三关方法绕过,但是没有禁用.htaccess文件
补充知识:
.htaccess
作用:分布式配置文件,一般用于URL重写、认证、访问控制等(文件夹密码保护,用户自动重定向,自定义错误页面,改变文件扩展名等)
作用范围:特定目录(一般是网站根目录)及其子目录
优先级:较高,可覆盖Apache 的主要配置文件(httpd-conf)
生效方式:修改后立即生效
常见配法:
Sethander application/x-httpd-php 将该目录及子目录的所有文件均映射为php文件类型
AddHandler php5-script .jpg 使用php5-script 处理器来解析所匹配到的文件
AddType application/x-httpd-php .jpg 将特定扩展名文件映射为php文件类型
.httpd-conf
作用:“包含Apache HTTP 服务器的全局行为和默认设置
作用范围:整个服务器
优先级:较低
生效方式:管理员权限,重启服务器生效
因此可以先上传一个htaccess的文件使扩展名 .jpg 的文件映射为php的文件,然后上传扩展名为.jpg的文件绕过
第五关
本关拒绝上传.htaccess的文件,因此无法用上一关的方法进行绕过
但可以利用.user.ini
补充知识:
.user.ini
作用:特定于用户或特定目录的配置文件,通常位于Web应用程序的根目录下。它用于覆盖或追加全局配置文件(如php.ini)中的PHP配置选项
作用范围:存放该文件的目录以及其子目录
优先级
:较高,可以覆盖 phpini
生效方式:立即生效
前提条件:服务器脚本PHP,服务器使用CGI/FastCGI模式,上传目录下要有可执行的php文件
php.ini
作用:存储了对整个PHP环境生效的配置选项。 他通常位于PHP安装目录中
作用范围:所有运行在该PHP环境中的PHP请求
优先级:较低
生效方式:重启php或web服务器
在.user.ini文件中写auto_prepend_file=123.jpg
使所有的php文件都自动包含123.jpg文件
然后再上传123.jpg里的一句话木马
或者利用取文件扩展名的方式伪造 .php. . (在执行时php后边的.和空格会自动省略) ,这样看可以绕过后端的扩展名检验
第六关
过滤掉了前两关的文件扩展名
检查代码发现没有过滤大小写,可以将扩展名改为.Php进行绕过
第七关
没有去除空格,可以用bp抓包 在扩展名加空格绕过
第八关
没有去除文件末尾的 . 同样可以使用bp抓包添加. 进行绕过
第九关
补充知识:
php在window的时候如果文件名+“::$DATA”会把其之后的数据当成文件流处理,不会检测后缀名,且保持其之前的文件
检查源码发现其并没有过滤 ::$DATA 因此可以通过bp抓包来修改扩展名进行绕过
第十关
检查源代码
发现其用了deldot()函数该函数会从末尾检测字符串删除点,并且遇到空格时会停止,因此可以运用.php. .的构造方式绕过
函数move_upload_file(file,newloc)作用是检查并确保file指定的文件是合法的上传文件,如果其合法,则将其移动为由newloc指定的文件,如果不合法将返回false
第十一关
在这进行了判断
将黑名单里的名字替换为空格,因此可以进行双写绕过
第十二关
补充知识:php的一些函数的底层是c语言,而move_upload_file就是其中之一,遇到0x00会截断,0x表示十六进制,URL中%00解码成16禁制就是0x00
strrpos(string,find[,start]) 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)
substr(string,start[,length])函数返回字符串的一部分(从start开始[长度为length])
magic_quotes_gpc 着重偏向数据库方面,为了防止sql注入,但magic_quotes_gpc开启还会对$_REQUEST,$_GET,$_POST $_COOKIE输入的内容进行过滤
检查代码发现是白名单,不好直接通过修改扩展名绕过
$_GET['save_path']
:这部分代码从$_GET
超级全局数组中获取名为save_path
的参数的值。通常,$_GET
用于从 URL 中获取参数的值。在这里,假设save_path
是一个保存上传文件的目录路径。
因此可以使用bp抓包
?save_path=../upload/
:表示查询字符串,包含了参数save_path
和其对应的值../upload/
。查询字符串通常用来向服务器传递额外的参数。
修改上述内容加入%00是使解析程序在处理文件的时候被误解为文件名的终止符
加上123.php%00,规定文件路径
第十三关
与上类一样,同样是白名单,但文件路径是根据post获取
可以利用bp抓包修改Post内容
在upload路径下加上123.php+,+是为了方便后面修改Hex值,再将filename改为png,最后找到加号的Hex改为00截断
第十四关
补充知识:
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A 即为 .PNG(无损压缩格式,头字节0x89 0x50)
2.JPG图片文件包括2字节:FF D8
3.Gif图片文件包括6字节:47 49 36 38 39 37 61(支持动画的图像格式,头两个字节为0x47 0x49 )
4.Bmp图片文件包括2字节:42 4D即为bm(windows位图格式)
Utf-8中一个英文字符占一个字节,中文(含繁体字)占三个字节
如果通过前两个字节判断文件类型,则可以通过添加不同的头字节标识来进行绕过
可以在这个页面进行测试
?file=./upload/……将这个文件包含在此页面,并以php形式运行