Web学习31

  1. 知识点
  2. 案例
    1. Web151
    2. Web152
    3. Web153
    4. Web154
    5. Web155
    6. Web156
    7. Web157
    8. Web158
    9. Web159
    10. Web160
    11. Web161
  3. 思维导图

知识点

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

思维导图