点击source
<?php
include 'config.php'; // FLAG is defined in config.php
if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("I don't know what you are thinking, but I won't let you read it :)");
}
if (isset($_GET['source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
}
$secret = bin2hex(random_bytes(64));
if (isset($_POST['guess'])) {
$guess = (string) $_POST['guess'];
if (hash_equals($secret, $guess)) {
$message = 'Congratulations! The flag is: ' . FLAG;
} else {
$message = 'Wrong.';
}
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Can you guess it?</title>
</head>
<body>
<h1>Can you guess it?</h1>
<p>If your guess is correct, I'll give you the flag.</p>
<p><a href="?source">Source</a></p>
<hr>
<?php if (isset($message)) { ?>
<p><?= $message ?></p>
<?php } ?>
<form action="index.php" method="POST">
<input type="text" name="guess">
<input type="submit">
</form>
</body>
</html>
首先我的方法是利用里面的黑名单来测试在哪里传参,在输入框里输入1可以发现对应的是post方式参数guess
然后我的注意力全部在
random_bytes(num)生成num个随机的字符,bin2hex(str)将字符转化为十六进制数方便我们观察,这里我就想到会不会是之前做过的一个题目,只要种子一样,随机数其实是定下来的,也就是所谓的伪随机数,这里还有一个比较函数hash_squals,比较两个字符串是否一样
这里我就鬼使神差的将64当作一个种子,进行编码进行提交,发现是个wrong,在网上查找random_bytes的漏洞发现没有找到。
最后才知道这里考的是basename这个函数的漏洞basename()绕过小结 - Ye'sBlog - 博客园
include 'config.php'; // FLAG is defined in config.php
if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("I don't know what you are thinking, but I won't let you read it :)");
}
if (isset($_GET['source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
}
$_SERVER['PHP_SELF']代表的当前php文件的绝对路径
比如现在这个文件是在var/www/html/index.php,那么$_SERVER['PHP_SELF']代表的就是index.php,如果自己不太信的话,我们在原网页后面添加一个config.php看看会不会报错输出exit里面的语句
思路正确! 在看到下面if语句有一个highlight_file就肯定是远程文件包含漏洞了,现在我们的步骤是,如何让basename过后的文件名是config.php,再往前,如何让$_SERVER['PHP_SELF']代表config.php的时候同时绕过正则表达式,这就是我们的目标
不仔细看还看不出来,正则表达式其实应该是"/config.php/*$/i",注意这个$,它代表的是字符串末尾,意思就是只要我们config.php/后面加点东西就可以绕过了,现在就是basename的漏洞了
一个脚本跑了一下,发现后面的不可见字符绕过正则的同时而且会被basename忽略掉,从而依然是config.php,忽略不掉的config.php/m经过basename会变成m,但我这里不会在url连接上用不可见字符,看了别人的wp可以知道还有中文也可以绕过,汉字、?、《、》、;等中文字符,因为这里还要有一个source参数,因此我们可以构造payload为index.php/config.php/??source=记得第一个问号是中文的