知识点
1、文件上传-前端验证
2、文件上传-黑白名单
3、文件上传-.user.ini妙用
4、文件上传-PHP语言特性
详细点:
1、检测层面:前端、后端等
2、检测内容:文件头,完整性,二次渲染等
3、检测后缀:黑名单,白名单,MIME检测等
4、绕过技巧:多后缀解析,截断,中间件特性,条件竞争等
本章课程内容:
1、文件上传-CTF赛题知识点
2、文件上传-中间件解析&编辑器安全
3、文件上传-实例CMS文件上传安全分析
前置知识点:
后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门(解析漏洞除外),如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门
这节课的一些payload的总结:
案例
CTFSHOW-文件上传-151到161关卡
Web151
第一关就是个简单的前端验证,只要把接受png改成接受php就可以了,然后上传一句话木马
成功得到flag
Web152
MIME检测:这里检测到1.png 他的文件类型是image/png,上传不同格式的时候,他这个文件类型会随着后缀而发生改变。
判断文件类型有两种方法:①直接看文件的后缀,就可以知道
②抓个包看这个Content-Type 也能知道文件的类型
首先要把前端验证这个第一步给过了,不然的话连包都抓不到,所以我们得让前端把接受png格式修改为接受php格式就可以了
他这里之所以会报文件上传失败,不是因为后缀的问题,而是这个content-Type这一栏在检测的时候报出了问题,正常来讲如果是image/png的时候,他就会认为你是正常的,而刚刚是stream什么的,那就是不正常的,他就不会让你上传这个文件,这就是所谓MIME检测。
注:后缀必须得是php,不然他是无法正常解析的,如果是图片的话后门代码就无法执行了,他是什么后缀,你就上传什么后缀的后门,按照本身的脚本语言来选择你的后门格式,否则可能代码是无法解析的。
成功得到flag
Web153
先尝试上传一个png图片看看,主要目标还是上传php后门代码
把允许上传的文件后缀从png改成php
继续修改一下,上传后门代码试试看
但是提示文件类型不合规
把php换成phP,用大小写绕过一下成功上传后门代码,
但是他提示下载,这样是不行的,说明中间件没有办法正常解析这个文件
把后缀修改为php5,也是可以成功解析的,这种绕过方法叫多后缀绕过
但是访问后又提示要下载,说明这种格式也是没有办法去解析的
这道题其实要用到.usr.ini文件,这个文件是和php挂钩的
先上传1.png,发现可以成功上传
然后再上传后门代码,也可以成功上传,这个user.ini
最终成功getshell
总结:user.ini需要在index里去调用才可以,这样才能使user.ini生效
相关文章:https://blog.csdn.net/z13615480737/article/details/89084360
直接上传,如果没有一个文件去使得usr.ini生效的话,这样上传也是没有用的,所以还是得具体分析环境里的代码。
Web154
还是之前的步骤都先跑一遍
但是这次user.ini不管用了,说明这一关他对内容是有检测的
随便上传一段数字是可以成功上传的,说明他对一句话木马里的某些字符是有过滤的
经过测试,他过滤的组合就是php头”<?php”,那么这样后门代码该怎么执行呢?
几种绕过的代码
<? echo ‘123’;?> //前提是开启配置参数short_open_tags=on
<?=(表达式)?> //不需要开启参数
<% echo ‘123’;%> //前提是开启配置参数asp_tags=on
<script language=”php”>echo ‘1’; </script> //不需要修改参数开关
尝试第二种写法,发现是可以上传的,但这里括号的位置加错了,应该是加在($_POST[x])这个位置
成功getshell
Web155
这次连上一关的第二种绕过代码也被过滤了
这题和153关没什么太大的区别,还是上传一个user.ini包含一下1.png就可以了
成功getshell
Web156
两次测试分析出来过滤了”[]”这个符号
可以直接换成<?=eval ($_POST{x});?>,php是支持这个代码的。
Web157
经过测试这次过滤了”;”
我们直接把命令执行的函数给他写进去,但是他还过滤了php这个字符
我们可以用*通配符去绕过他,如果写完整的名称就会被过滤
再用user.ini把这个文件包含一下
成功获取到flag
Web158
和前面的没有什么太大的区别
上传执行代码
上传usr.ini
放包得到flag
Web159
这次把两个括号给过滤掉了
这可以用反引号去绕过括号,这我之前刷nss的时候刷到过,反引号里的代码会优先执行,也就说反引号的代码也是会被执行的,反正只要能够达到执行代码的效果就可以了
payload:<?=`tac ../f*`?>,你可能说这里没有加system呀,为什么这里可以执行呢?
补充:PHP支持一个执行运算符:反引号。注意这不是单引号!PHP将尝试将反引号中的内容作为shell命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`’’地效果与shell_exec()相同
注意:关闭了shell_exec()时反引号运算符是无效的
还是老样子用user.ini去包含test.png,然后再去访问一下地址就可以得到flag
Web160
新的知识点,利用日志包含,Nginx的中间件路径时/var/log/nginx
但是这道题在这里也存在着过滤,所以我们得使用拼接的办法才能成功读取到这个路径,具体payload: <?=include”/var/lo”.”g/nginx/access.lo”.”g”?>
用usr.ini去包含这个日志文件
这个日志文件会去记录浏览器的信息,我们可以通过这个特点,在UA头上写后门代码,这样就可以getshell
发现UA头空了,因为刚刚已经插入了后门代码,后门代码被执行了,所以为空
成功获得flag
Web161
要是连包都没法抓,说明问题出在了前端验证上面,前端就已经判断你这个文件不能上传,所以抓不到数据包
他这一关考核的是文件头
比如说gif文件的开头都有GIF89a的开头
用这个文件头就可以上传
继续狠狠包含后门代码
反正和之前的相比就是要加上个文件头,才可以成功识别
包含日志访问记录
命令执行一下成功得到flag