xcguoyu 2020-08-15
一道难得可以看的懂的ctf题。首先在做这道题的时候我的思路是把代码撸到本地测试一下,看看他会有什么样的结果,parse_url的意思是对我们传入的url去做一个切分PHP_URL_QUERY的意思是(127.0.0.1/a/index.php?id=1)把其中的id=1给取出来(也就是后面的参数但是这段参数不可以包含下面正则表达式包含的内容_,0,w)等等...
下面部分的代码是我们必须传入_并且他的值不能为空我们再把他的值赋值给$control,之后的代码其实是_的值必须在他所给的随机数的数组里,值得一提的是虽然他的数组最大值是随机的但是他的最小值始终是0,我在本地测试的时候发现虽然我们将0的值传入但是依旧没有出flag,可能是因为我们没有达到考题的要求。
有以下的考点:
1. 绕过前三个正则 ->运用parse_url()的漏洞 2. 绕过in_array的三个判断 -> PHP弱类型
考点1. parse_url漏洞:在函数 parse_url 内部,如果 url 是以 // 开始,就认为它是相对 url,而后认为 url 的部件从 url+2 开始。下面是他的内部函数:
当我们判断s = /或者s+1 =/的时候就会仍未这是相对的url然后就取,而后认为 url 的部件从 url+2 开始。(其实这u段我没搞懂,大概意思就是当我们使用///分号的时候他的参数会取错使得$url = parse_url($url,PHP_URL_QUERY);)
取不到应该去的值,所以导致过滤没啥用。
考点2.单纯的弱类型,在php中数字和字母作比较的时候,字母(字符串)会变成0.(具体文章可如下:https://www.cnblogs.com/Mrsm1th/p/6745532.html)