CTFHub-技能树-文件上传

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

posted @ 2020-03-17 18:06  R3col  阅读(3045)  评论(0编辑  收藏  举报