无验证
直接上传一句话木马
使用蚁剑连接
得到flag
前端验证
上传一个一句话木马,扩展名改成允许上传的扩展名。
在把.jpg改成.php
上传的路径在这里
我们可以使用蚁剑来连接
连接成功,得到flag。
文件头检查
上传.php
把.php改成.jpg
于是我们可以上传一张内容为图片的.png
我们抓包来改内容,把除了文件头其他的图片内容全删了,然后添加一句话木马,然后改.png为.php
然后使用蚁剑来连接
MIME验证
MIME即文件类型检测
上传一个.php文件
吧.php改成.jpg,上传成功,然后使用一句话木马来连接。
得到flag
也可以上传.PHP文件然后修改content-cype
改成image/jpeg,然后发送,在使用蚁剑连接
CTFHub 文件上传 - htaccess
按f12
方法一:
发现使用的是黑名单判断,不能使用一些.php后缀的,但是我们可以大写绕过,我们可以把上传.PHP。
然后使用蚁剑连接。
但是返回数据一直为空。
写这道题目的时候一直想不明白为什么返回空,后来想有可能蚁剑连接里面不能出现大写字母,后来经过测试,发现果然如此。
方法二:
.1.知识点
(1)先简单介绍一下.htaccess文件:
.htaccess文件 (或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。
它提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
作为用户,所能使用的命令受到限制。
管理员可以通过Apache的AllowOverride指令来设置。
.htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的
.htaccess可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件的跳转等功能。
(2).htaccess 文件上传漏洞原理:
一般.htaccess可以用来留后门和针对黑名单绕过
创建一个txt写入
AddType application/x-httpd-php .png
打开另存为
保存类型为所有文件
让 png 解析为 php
还可以把png改成其他图片格式~例如jpeg、gif等等…
另外,还有一个知识~(此题没用到这部分知识)
可以在.htaccess 加入php解析规则
类似于把文件名包含1的解析成php
<FilesMatch “1”>
SetHandler application/x-httpd-php
1.png 就会以php执行
我们先上传一个.htaccess文件
将.png文件当成.php文件来解析。
然后我们在上传一句话木马以.png为扩展名
然后可以使用蚁剑来连接
得到flag
00截断:
选择.php上传,文件类型不匹配。
把.php改成.jpg
上传成功。
根据题目提示,我们使用%00截断,使用上传一个a.php%00.jpg的文件。
上传成功
使用bp抓包
没有出现上传文件的路径地址。
url地址栏出现了?road=/var/www/htm/ 没有返回文件的路径地址,多半是有临时文件名的存在,这就需要00截断,00截断的主要目的就是为了得到上传文件的路径地址,从而可以用蚁剑连接。
<!--
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;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
-->
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension']; //首先取到上传文件的扩展名$ext
$whitelist = array("jpg", "png", "gif"); //将扩展名与白名单进行匹配,为jpg、png或gif才能通过第一次过滤
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext; //扩展名匹配之后,为上传的文件构造了一个新的存储路径$des
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
move_uploaded_file(
F
I
L
E
S
[
′
f
i
l
e
′
]
[
′
t
m
p
n
a
m
e
′
]
,
_FILES['file']['tmp_name'],
FILES[′file′][′tmpname′],des)这个函数就是把上传文件放到
d
e
s
的
路
径
上
并
且
改
了
文
件
名
,
而
des的路径上并且改了文件名,而
des的路径上并且改了文件名,而des中的随机数,当前时间等无法确定,那么,在$_GET[‘road’]后面进行00截断payload:POST /?road=/var/www/html/upload/a.php%00 HTTP/1.1重新上传,这样,上传文件就被保存到了upload/a.php下。
然后使用蚁剑连接。
CTFHub 文件上传——双写绕过:
上传a.php%00.jpg
在上传a.php.php%00.jpg
可以知道是自动把php给消去了,于是可以设置a.pphphp来绕过
上传a.pphphp
然后使用蚁剑连接
连接成功
抓包看响应,发现一段代码。
<!--
$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);
-->
这段代码果然是消去。