快捷搜索: 王者荣耀 脱发

攻防世界CTF —— PHP本地文件包含漏洞解题思路

原题目如下:

<?php
show_source(__FILE__);
echo $_GET[hello];
$page=$_GET[page];
while (strstr($page, "php://")) {
    $page=str_replace("php://", "", $page);
}
include($page);
?>

0x00 前言 本题考察的是php本地文件包含,训练题尽量通过理解原理来解题,不要使用工具(例如中国蚁剑、御剑等)。本题有两个Get,一个hello,一个page,page会被include函数包含,并被执行,所以,我们有如下几个解题方法。

0x01 方法一:php://input方法 使用php://input的话,php://会被过滤掉,可以通过Php/PHP/phP等绕过str_replace的过滤。Php://input可以访问请求的原始数据的只读流,即可以直接读取POST上没有经过解析的原始数据,用burp抓包,写入php,获得文件列表,找到我们需要的flag文件。

读取fl4gisisish3r3.php文件,我们可以用hello,或者继续用input,我们都试一下

使用hello参数获得文件内容:在地址后面加上?page=http://127.0.0.1/index.php/?hello=<?show_source("fl4gisisish3r3.php");?>

使用input,然后运行system(cat ./fl4gisisish3r3.php)获得内容

0x02 方法二:data://text/plain;base64,[base64之后的代码] 伪协议

从PHP5.2.0起,数据封装流就开始有效,用于数据流的读取。如果传入的都是PHP代码,就会执行任意代码。我们把php代码进行base64之后加到后面,比如<?php system(ls /);?>的base64为:PD9waHAgIHN5c3RlbSgnbHMgLycpOyA/Pg==

运行结果为:

<?php system(ls); ?>的base64为PD9waHAgc3lzdGVtKCdscycpOyA/Pg==

找到了文件,再用之前的方法读出内容即可。

*data://在传递system(cat ./fl4gisisish3r3.php)之后并没有输出内容,知道原因的大佬可以留个言。

经验分享 程序员 微信小程序 职场和发展