一个上传漏洞总结的很全的靶场
因为最近效率比较低(难听点就是懒) 所以国光哥说
可以一天搞完这些东西然后写篇博客 逼自己一下
本来是应该一天搞完的结果学校停电了没网
真的不是在找借口哈
不过也真的学到了很多新姿势呀。
Pass-01
猜测第一关应该比较简单前端验证
创建后缀为jpg的文件
上传 抓包改后缀即可绕过
Pass-02
第二题 也是比较常见的
猜测是验证content-type
于是修改content-type为jpg的类型 即可绕过。
Pass-03
上传一个php文件发现 黑名单上传 立即想到的就是大小写混合绕过
试了一下不可以 查看源码发现都被转换成了小写GG了
把后缀改为php3上传成功解析
貌似是apache里面的设置 会把php3当作php去解析
第一次在mac下搭建环境却一直不能成功
还有另一种姿势 上传.htaccess
。
Pass-04
这就用到了前面说的.htaccess了
因为还是黑名单验证 我们可以上传一个.htaccess
上去
内容为
代码语言:javascript复制<FilesMatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>
把.jpg的文件当作php去解析
Pass-05
还是黑名单验证 不过呢这里也过滤.htaccess
了
但是反过来观察一下 这里却没有进行大小写的转换 PhP直接上传
美滋滋
Pass-06
还是黑名单验证
回头看看思维导图
黑名单验证里的空格绕过 这时候源码里并没有过滤空格 所以在.php后添加空格即可绕过
Pass-07
黑名单验证
这题最开始有点蒙 看了源码也没想到。。太菜了
偷偷看了网上的wp
忽略了本题没有对后缀进行去.的处理
利用windows的特性会自动去掉后面的.
上传07.php.
即可绕过
Pass-08
黑名单验证
这次发现了重点 没有去除字符串::$DATA
这种方法实战没用到过 ctf也没用到过
仔细查了一下涨姿势了
必须是windows, 必须是phpphp在window的时候如果文件名 ”::DATA”会把::DATA之后的数据当成文件流处理,不会检测后缀名.且保持”::
上传xx.php::$DATA发现无法找到此文件
windows会去掉::$DATA 直接访问xx.php即可
Pass-09
到这里又没了思路。。
思维导图是个好东西。
最常用的陌生后缀解析漏洞都给忘了
我上传一个09.php.xxx
apache的特性从右往左依次解析 不认识的后缀会一直往左解析
无法解析xxx就解析成了php。上传成功
Pass-10
到了10题以后源码上就没了注释了
这里我自己写一下注释也为了巩固一下php
代码语言:javascript复制$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");//黑名单
$file_name = trim($_FILES['upload_file']['name']);
//移除字符串两侧的空白字符。也就是这里为什么不能空格绕黑名单的原因喽
$file_name = str_ireplace($deny_ext,"", $file_name);//将问题后缀名替换为空
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
读懂了源码
发现这才是重点
代码语言:javascript复制$file_name = str_ireplace($deny_ext,"", $file_name);//将问题后缀名替换为空
替换为空所以我们双写绕过
Pass-11
白名单验证
代码语言:javascript复制$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file'
['name'],".") 1);
先介绍一下函数
代码语言:javascript复制substr(string,start,length)//返回string从start开始的length长度
代码语言:javascript复制strrpos($_FILES['upload_file'['name'],".")//查找.在文件里最后一次出现的位置
回过头来看题 查找文件名中最后一个点后面的后缀 也就是说这行代码就防止了我们 双后缀名绕过
那么该怎么做呢
博客前面写过类似的方法
在路径上11.php后面进行截断后端则会认为11.php 是文件名 真实文件名被截断了所以改成11.jpg进行绕过即可
get会对 进行自解码所以不用解码
截断条件: php版本小于5.3.4 详情关注CVE-2006-7243 php的magic_quotes_gpc为OFF状态
Pass-12
与上面题目类似
只不过这题save_path是通过post传输的
post不会像get对 进行自动解码 所以 解码
Pass-13
13题与前面都不同 上传图片马 然后利用文件包含漏洞 包含phpinfo
dos下命令制作图片马
代码语言:javascript复制copy 1.jpg /b 1.php /a 13.jpg
参数/b指定以二进制格式复制、合并文件; 用于图像类/声音类文件
参数/a指定以ASCII格式复制、合并文件。用于txt等文档类文件
copy 1.jpg /b 1.php /a 13.jpg
//意思是将1.jpg以二进制与1.php合并成13.jpg
那么2.jpg就是图片木马了。
生成出来这时候利用文件包含漏洞 包含该文件即可
jpg gif是一个道理的。
Pass-14
与Pass-13
是一样的突破方法
唯一不同的是getimagesize获取文件类型
我们直接上传的本来就是图片类型。所以姿势是一样的。
Pass-15
多了个php_exif模块来判断文件类型
突破方法与Pass-13
一致
Pass-16
突破方法与Pass-13
一致
本来以为还是和前面方法一致但是文件包含的时候却不行
查看源代码发现考察的是二次渲染 姿势盲区了 故查了下资料(百度太垃圾什么也没有用google哦)
普通的图片马上传以后
经过imagecreatefromjpeg
函数二次渲染,图片尾部的php一句话被删除
看了一篇类似的文章 可以通过对比上传前后的图片内容
找到上传前没有改变的部分将一句话写道没有改变的这部分尝试一下
由于我这里没有16进制编辑器 就不尝试了 不过应该没有问题。。
google看到的copy过来 对渲染了解的少 需要多了解了解。
将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的。
Pass-17
考察条件竞争
如果你要问条件竞争是什么,可以看一下这篇文章
CTF中的条件竞争漏洞
关于条件竞争不怎么明白 Google了半天发现无法突破本关
于是厚着脸皮让国光哥来远程。。。涨姿势了
总结出来一句话利用burp批量发包 让程序措手不及
上传1.php抓包
线程设置高一点 开始不断发包 在我和国光哥的10分钟不断刷新下果然成功了。。。
产生原因将文件上传,然后判断后缀是否是图片,如果不是图片文件则将其删除。
Pass-18
条件竞争
利用Pass-17
方法一样可以利用
但是我这边一直没有成功呢。。。姿势问题
Pass-19
到了这里发现越来越简单
move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过
感觉这题和12题有点类似