这个比赛只有两道web题,一题代码审计,另一题神仙题??贼少人做……….
这篇博客先只讲一题,另一题用另一篇博客讲
题目
1 |
|
这题把所有绕过都绕了就解出来了,考了很多个点,下面一个个解释
绕过file_get_contents
可以看到get方法获得一个msg,然后去读名字为msg的文件,如果内容是Hello Challenge!那就能进入下一步,否则就退出程序
这里可以用php://input去进行绕过,用我们写入的值作为内容,然后就能绕过了
key1
源码要求获得的key1转成int型要能等于1337,又要key1与1337不能相等,这里用字符串就能绕过了
key1=’1337’
key2
key2的长度必须是42,而且key2满足以$结尾,同时不是数字
这里可以用一个长度为42的以美元符号结尾的字符串去绕过,key2=’000000000000000000000000000000000001337$’,这样构造一个符合规则的key2方便我们后面可以利用cc
substr和sha1
可以看到,这里的条件如果可以满足的话,我们就可以进行变量覆盖,也会多了可控的值
这里想要两边都是true是不可能的了,只能让他两边同时为false
substr:这个函数只能处理字符串,如果给他一个数组的话,那就会返回null
sha1:很巧的是,这个函数也是处理数组的时候出错会返回一个null
两边同时为null,恰好可以满足条件,进去下一步
$a !== $k1
这里第一行的代码倒了过来,应该是 $b = “2”; $a = “b”; // ;1 = b
这是一个小的trick,https://rawsec.ml/en/2-less-known-tricks-spoofing-extensions/#rtlo-trick
所以a的值其实是2,因此我们上一步进行变量覆盖的时候可以将k1赋值为2
assert_options
这个考到了assert这些函数,看下官方解释,http://php.net/manual/en/function.assert-options.php
这里利用assert(“$bb == $cc”);
我们可以用 // 注释掉后面的 == $aa”,然后再插入函数,读出flag,也就是assert(“show_source(‘flag.php’); // == $cc”)
至此,完成了整个代码的绕过了,最终payload
?msg=php://input&key1=1337&k1=2&key2=000000000000000000000000000000000001337%ef%bc%84&cc[]=&bb=show_source(‘flag.php’);//
Hello Challenge!