[HNCTF 2022 WEEK2]easy_include

开题得到如下提示:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
//WEB手要懂得搜索

if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|flag|data|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=/i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}

可知常见伪协议读取文件已被过滤.而且flag*也用不了

因此常规伪协议读取肯定走不通.

此处想到**日志包含**

通过fuzz报错参数得到如下报错

提示本题中间件为nginx

这里列出两个常见中间件日志文件的存放位置:

1
2
3
apache一般是/var/log/apache/access.log

nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log

直接包含日志文件看看效果

成功读取!

当访问一个不存在的资源时,Apache/nginx日志同样会记录 例如访问http://127.0.0.1/。Apache会记录请求“”,并写到access.log文件中,这时候去包含access.log就可以利用包含漏洞

接着写入一句话木马

再次包含(即执行)日志文件即可得到flag!

[BJDCTF 2020]ZJCTF,不过如此

过了前面那个伪协议传参数后结合伪协议读取得到next.php并提示我们继续

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}


foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}

function getFlag(){
@eval($_GET['cmd']);
}

这里的PHP版本是:5.6.40preg_replace()+/e存在代码执行漏洞

PHP正则表达式的逆向引用与子模式分析

深入研究preg_replace与代码执行