Web_php_include

源码

1
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>

看源码,绕过两个函数拿到动态flag,一个比较简单的文件包含

先看第一个函数strstr()

1
2
1、strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。如果是,返回字符串及剩余部分,否则返回false。
2、找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;

str_replace()函数

定义和用法:
以其它字符替换字符串中的一些字符(区分大小写)
语法:

1
str_replace(find,replace,string,count)

find,必需,要查找的值
replace,必需,要替换的值
string,必需,被搜索的字符串
count,可选,替换次数

在这个题目中,就是匹配page变量中的php://替换为空

1
2
3
while (strstr($page, "php://")) {     //查找page中的php://,若存在则返回为空
$page=str_replace("php://", "", $page); //匹配page变量中的php://替换为空
}

方法1(大小写绕过):

利用php伪协议大小写绕过

1
?page=PHP://input

先get传进去

之后写命令执行

方法2(data://上传木马)

第一种链接方式:

第二种链接方式:

真的服了真个题了,那个base64编码再连蚁剑,那个密码1和a我都试了就是不行,用cxk就可以,妥妥的小黑子

大概跟base64编码有问题,以后面留长一点点,长记性

方法3(data://命令执行)

只是data://协议的其中一个用法

data://协议跟php://input类似,可以让用户来控制输入流,当他与包含函数时,用户输入的data://流会被当做PHP代码执行

构造方式跟input一样,不过变成了GET传参