web89
查看代码
preg_match
过滤0-9,即发现有0-9
,就输出no no no
然而intval函数的作用是返回变量的整数值,两者相互矛盾
这里可以通过数组绕过,构造payload: ?num[]=
成功获取flag
web90
查看源码,第一个if是验证num是否被设置,第二个if验证num是否是4476
,如果是,就输出no no no ,第三个if验证num取整后是否等于4476
看到取整,还不好做吗~,直接输入小数取整绕过第二个if的验证
payload?num=4476.1
web91
查看源码
首先是
if(preg_match('/^php$/im', $a)){
这个if的意思是匹配$a
开头和结尾是php
,如果是php
,进入下一个if
/^php$/im
^表示开头 $
表示结尾 /i
不区分大小写 /m
表示多行匹配
preg_match('/^php$/i
这个if的意思是匹配$a开头和结尾是php,不区分大小写,如果开头是php,那么就输出hacker
仔细对比发现,第二个if的过滤对比第一个,少了一个多行匹配/m,这可以用到Apache HTTPD换行解析漏洞(CVE-2017-15715)
师傅的传送门:传送门
大概意思是:以前的1.php
可以用1%0aphp
访问,%0a
表示换行符,那么综上所述,就可以绕过函数的过滤
构造payload: ?cmd=a%0aphp
a%0aphp
,首先是preg_match
中的$
(匹配结尾)匹配a%0aphp
中的换行符,这个时候会匹配到%0a(将%0a当作换行)
,那么a%0aphp
后面的php
因为preg_match
函数有个/m(匹配多行)
就是单独的一行了,满足第一个if
,要求行开始和结尾都是php
其次是第二个if
,第二个if
要求$a中开头和结尾没有php,而这个preg_match函数中没有/m
匹配多行,所以就直接匹配abc
,abc
不满足第二个if
,所以输出flag