Ctfshow web入门-php特性-web89-91 WP

web89
Ctfshow web入门-php特性-web89-91 WP_第1张图片

查看代码
preg_match过滤0-9,即发现有0-9,就输出no no no
然而intval函数的作用是返回变量的整数值,两者相互矛盾

这里可以通过数组绕过,构造payload: ?num[]=

Ctfshow web入门-php特性-web89-91 WP_第2张图片

成功获取flag

web90

Ctfshow web入门-php特性-web89-91 WP_第3张图片

查看源码,第一个if是验证num是否被设置,第二个if验证num是否是4476,如果是,就输出no no no ,第三个if验证num取整后是否等于4476

看到取整,还不好做吗~,直接输入小数取整绕过第二个if的验证

 payload?num=4476.1

Ctfshow web入门-php特性-web89-91 WP_第4张图片

web91

Ctfshow web入门-php特性-web89-91 WP_第5张图片

查看源码

首先是

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匹配多行,所以就直接匹配abcabc不满足第二个if,所以输出flag

Ctfshow web入门-php特性-web89-91 WP_第6张图片

你可能感兴趣的:(ctfshow)