unset(MOCTF)
题目直接给出了源码
-
waf
我们看到waf函数使得变量a中不得出现‘flag’,但预计flag存在于flag.php当中,出现了矛盾。 -
foreach函数
foreach函数是php中对于数组进行处理的常用函数。
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
有几点需要注意的,首先是if()中的内容,两个符号表示括号中的内容其实不是_post,_get和_cookie而是_post,_get和_cookie中的内容,在确保有效传入值后会进入下一个foreach中。
在下一个foreach当中如果_post,_get和_cookie的key值的值及value值相同的话,会把key值的值直接消除掉,也就为我们绕过waf提供了条件。 -
extract
extract的对象内的键名会成为一个新的变量,而这个新变量的值就是这个键名的值,后面的参数EXTR_SKIP避免了变量覆盖。extract函数会恢复我们unset的值,这样便可以实现对waf的完全绕过。 -
实现
题目需要我们传入三个值,分别为flag,daiker和file,其中file是需要对waf进行绕过的,这里到了解决问题的关键,首先我们修改url为:http://119.23.73.3:5101/index.php?flag=s878926199a&daiker=s155964671a&file=php://filter/read=convert.base64-encode/resource=flag.php (其中flag和daiker不能相同,但flag和daiker的md5值需要相等,注意到判断md5值时使用了==的方式,可以利用php的弱类型判断。file利用php://filter伪协议进行读取)
然后,我们还需要post一系列数据,payload:_GET[flag]=s878926199a&_GET[daiker]=s155964671a&_GET[file]=php://filter/read=convert.base64-encode/resource=flag.php。此时我们对情况进行分析在进行_POST的foreach时,_k的值为_GET[flag],其值的值为我们在url中get进去的flag的值,这与我们post进去的值相同。unset()起作用,_GET[flag]的值消失,waf失效。