[祥云杯2020]云比赛记录
前两天祥云杯师傅们大力输出,我大力划水看了一个题,今天比赛结束看wp开始学习
学习之前先批评一下这个比赛的py程度,可能是20w的烂钱太过诱人,导致大家的py程度前所未有的高,py的具体内容见这篇知乎回答
flaskbot
是先猜数字再SSTI,SSTI经典过滤,然后额外过了了通配符和flag
猜数字是在限制范围内二分猜50次,理论上必然猜对
但是我可以直接进行一个NAN的输入,很有意思的是NAN不大于任何数,也不小于任何数,但你把它当数字输入也不报错,这样子就直接过了猜数字
SSTI只会抄payload,过滤了一下没调通,抄的任意文件读能用,读了下源码看过滤,flag位置没找到,还是要拼字符串去执行命令
经典字符串加法过过滤{{joiner.__init__.__globals__.__builtins__['__impo'+'rt__']('o'+'s')['po'+'pen']('c'+'at /super_secret_fl'+'ag.txt').read()}}
学习点
之前猜数字乱输的时候会报错,进debug界面,看了null的wp,任意文件读就可以直接读log文件获取PIN码,在debug界面直接RCE
这里读的是/var/log/app.log
不过这个是log默认目录吗,还是看了proc的cmdline知道log写到这了?
Command
经典命令注入,过滤比较多,可以使用经典管道符加base64命令执行
学习到的新技巧:
xargs参数输入
如果直接输入echo L2ZsYWc=|base64 -d|/bi?/ca?
的话,等于是使用无参数的cat命令,echo的内容是在管道符中是以标准输入的形式传递的,可以在命令行里测试,这种情况下cat将会读取标准输入进行输出,就是输入什么输出什么,完全不能读文件
root@myserver:~# echo L2ZsYWc=|base64 -d|/bi?/ca?
/flagroot@myserver:~#
菜鸟教程的xargs简介有这么一句话,很直白
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要
所以需要使用这个xargs命令,这个命令将标准输入作为命令行参数输入,这样子我们执行的命令就是cat /flag
,而不是cat
再标准输入flag了
root@myserver:~# echo L2ZsYWc=|base64 -d|xargs /bi?/ca?
flag{test}root@myserver:~#
~~比赛没打,后来看其他队伍的WP,好像`反引号也没过滤,那样的话就不需要xargs也行吧
sed读取文件
这个东西我真的不会用。。。印象里是个很难用的文本编辑软件,按行数或者规则增删查改之类的
但是还可以读文件真是太牛逼了
root@myserver:~# sed '' /flag
flag{test}root@myserver:~#
trick+1
剩下的题目没看云了也没用,咕咕咕