通关攻略
靶场通关
先准备一个shell.php文件
Pass-01(前端校验)
当直接上传php文件时,页面进行了弹窗
方法:浏览器禁止JS
1.对于chrome浏览器,设置–隐私设置和安全性–JavaScript
2.刷新页面,上传shell.php文件
3.复制图片地址进行打开
Pass-02(Content-Type)
知识点
Content-Type用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
Content-type 标头告诉客户端实际返回的内容类型
常见的媒体格式类型:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
通关
1.同样先上传shell.php文件,提示为文件类型不正确
2.通过Burp抓取shell.php的上传流量
4.上传成功,访问图片地址
Pass-03(黑名单)
知识点-php扩展名
默认状态下.php3,.php4,.php5,.phtml 都是会被解析为php
能被解析的文件扩展名列表:
jsp jspx jspf
asp asa cer aspx
php phtml php3 php4 php5
exe exee
通关
1.上传php文件后,提示不允许上传.php后缀文件
2.将.php后缀修改为.phtml后缀
3.上传成功,访问图片地址
提示
当上传的phtml没有解析时
在phpstudy中,其他选项菜单–打开配置文件–http-conf
将#号去掉,就可以解析phtml文件为php文件
保存文件,重启phpstudy即可
Pass-04(.htaccess文件)
知识点
.htaccess文件–>分布式配置文件
提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于次目录及其所有子目录
.htaccess的功能:
可帮助我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、禁止目录列表等一些功能
靶场
1.用编辑器将下列指令写入.htaccess文件中
AddType application/x-httpd-php .png
指令表示 .jpg文件会当做php来解析
2.先上传.htaccess文件
3.将木马文件的php后缀修改为jpg后缀,进行上传,打开图片
Pass-05(大小写)
从给出的提示来讲,过滤了很多后缀,但是仔细观察没有过滤PHP
故修改文件后缀PHP,上传成功,访问图片地址
Pass-06(空格)
通过观察源代码,文件上传后的大致流程为:
获取上传的文件名
删除文件名末尾的.
返回最后一次小数点出现的位置到字符串结束之间的字符
转换大小写
去除字符串::$DATA
故可以构造payload
a.php+空格
a.php+空格=>.php+空格
对于黑名单而言 a.php+空格与a.php是不一样的
但对于Windows,a.php+空格与a.php是一样的
1.上传php文件后通过burp抓包,在后缀php后面添加一个空格
2.访问图片地址
Pass-07(点)
利用strrchr()函数绕过,strrchr()函数:查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
1.上传php木马文件,抓包将php文件后缀处多加一个.
2.访问图片地址
Pass-08(:: D A T A ) 1. : : DATA) 1.:: DATA)1.::DATA Windows文件流
对于Windows而言
a.php 与a.php::$DATA 是一样的
但是对于黑名单检测来讲是不一样的
2.将PHP上传,抓包修改php文件后缀
3.访问图片地址后显示 访问时将文件后缀名 ::$DATA后缀删除即可
Pass-09(点空格点)
1.关键函数
大致流程
获取上传文件名
删除文件名末尾的点
返回最后一次点出现的位置到字符串结束之间的字符串
转换为小写
去除字符串::$DATA
首尾去空
构造payload
构造函数名:a.php.空格.
删除文件名末尾的点:a.php.空格
返回最后一次点出现的位置:.空格
转换小写、去除::$DATA、首尾去空: .
最后文件名为a.php. 在Windows中,文件名最后的点可以被自动忽略
2.上传文件,修改文件后缀名
3.访问上传后的图片地址
Pass-10(双写)
1.主要利用点为str_ireplace() 函数
str_ireplace() 函数:替换字符串中的一些字符(不区分大小写)
如果上传文件名中出现了黑名单中的后缀名就会将后缀名替换为空
2.构造payload:.phphpp –> .php
3.,修改上传的文件后缀名
4.访问上传后的图片地址
Pass-11(%00截断)
环境准备
php版本低于必须为5.2.x
php.ini配置中magic_quotes_gpc = Off
关键代码
函数:
strrpos():查找字符串在另一字符串中最后一次出现的位置
substr():返回字符串的一部分,substr(string,start,length)
in_array():搜索数组中是否存在指定的值
substr(
F
I
L
E
S
[
′
u
p
l
o
a
d
f
i
l
e
′
]
[
′
n
a
m
e
′
]
,
s
t
r
r
p
o
s
(
_FILES['upload_file']['name'],strrpos(
FILES[′uploadfile′][′name′],strrpos(_FILES[‘upload_file’][‘name’],“.”)+1); //获取上传文件名的后缀名
代码大致流程:
大概意思为 截取上传文件的后缀名,如果符合ext_arr数组,将会把文件移动到指定目录并且进行重命名操作
如果文件的后缀名不再ext_arr数组中,会提示上传失败
url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
1.抓取数据包,上传的是shell.php,但是抓包时要改为png或者jpg等图片格式,在改upload存储路径,用%00隔开
2.访问图片链接 直接访问shell.php
Pass-12(%00截断)
与Pass11大致相同,只不过是GET传参,改为了POST
URL编码==》16进制编码
GET会对URL编码(16进制)进行解码
POST并不会对16进制进行解码
可以使用burp抓包工具改16进制
1.抓取文件上传包
2.在Hex中修改a的16进制为00
3.修改后
上传成功
4.访问图片地址
Pass-13(图片马)
图片马
一句话木马和图片 结合在一起
1.制作图片马
cmd命令:copy
2.以16进制方式打开2.png
注意:由于图片马的使用场景问题,故只要我们上传的图片马上传成功,下载到本地后,一句话木马依然存在,则算通关
3.上传图片马,上传成功
4.访问图片地址
.jpg/.gif的制作方式和png相同
Pass-14(getimagesize)
关键代码
getimagesize获取图像信息
1.使用上一关的图片马进行上传
注意,此关需要用png图片木马
2.访问图片地址
Pass-15(exif_imagetype)
关键代码
exif_imagetype函数:判断一个图像的类型
需要开启php_exif模块
在 php.ini配置文件去掉;
重启phpstudy
1.使用上一关的图片马,上传成功
2.访问图片地址
Pass-16(二次渲染)
代码部分
二次渲染–后端重写文件内容
basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
1.二次渲染 通常用gif绕
木马写在 GIF图片中间空白处
2.上传成功
Pass-17(条件竞争)
1.关键代码
大致流程:先上传,再检测,重命名,不符合条件则unlink删除文件
2.先上传普通图片,获取文件路径
http://127.0.0.1/xxx/upload/2420230225150906.png
3.既然是先上传后检测,则再文件被删除之前生成一个新的文件即可
先上传一句话木马.php,再443.php删除之前,访问到443.php,利用PHP中file_put_contents()函数,把一个字符串写入文件中
4.上传443.php文件并且抓取到,放到跑包模式中
再抓取访问443.php的包,同样放到burp跑包模式中
6.两个数据包同时进行null payload 跑包
7.访问成功
Pass-18(二次竞争)
关键代码
逻辑顺序
1、服务器先将文件与白名单作对比
2、检查大小看文件是否已经存在
3、再进行重命名
保存到重命名之间,会有一段时间差
在这段时间内,文件还是能被访问到的,并被解析执行
于Pass-17相同操作
Pass-19(黑名单检测)
关键函数
image-20220816141452411
move_uploaded_file() 函数把上传的文件移动到新位置。
如果成功该函数返回 TRUE,如果失败则返回 FALSE。
对上传的文件,没有任何检测,但对其保存的文件名进行检测
1.构造木马文件shell.php
2.使用.绕过,使用Burp抓取上传的数据包
3.访问图片地址
Pass-20(白名单检测)
关键代码
三目运算符:(expr1) ? (expr2) : (expr3); 如果条件expr1 成立,执行expr2,否则执行expr3;
explode() 函数:把字符串打散为数组
end()函数:删除数组中最后一个值
count()函数:统计数组个数
reset()函数:将内部指针指向数组中的第一个元素,并输出
可使用 数组绕过
1.抓取数据包,改包,用%00截断
2.上传成功,
3.访问图片地址