代码写的确实丑,echo !()?xxx:yyy,首先这是一个三目运算符问号前面是一个判断语句,若为true则用echo xxx,若为false则echo yyy.
很明显xxx就是flag所在的位置,所以要使得`!()`为真括号内的要为假,即每个数据为假
在绕之前需要了解几个函数:
stripos()
eregi()
file_get_contents()
stripos(string,find,start)
有三个参数,string(必须)是需要操作的字符串,find(必须)是需要查找的字符,start(可选)是开始查找的位置,若start不选即默认从零号位开始查找find数据在string第一次出现的位置
eregi(string,string) 作用:用后一个字符串匹配前一个字符串,若后一个字符串存在前一个则返回true反之返回false。这个函数有个特殊的点就是匹配不区分大小写==>划重点,等会要用
file_get_contents()就不说了,很常见的函数,读取文件内容的
因为是||连接各个条件,因此要将所有的置为false
$_GET['id']!=0 ====》令id=0
substr($_GET['content'],0,1)=='w' ===》不能让content=w
!eregi("ctfsho".substr($_GET['content'],0,1),"ctfshow")===》所以令content=W(因为不区分大小写)
(strlen($_GET['content'])<=7) ===》 让content长度大于7 在content=W基础上随便加若干个字符大于7就行
stripos($_GET['filename'],'.') 字符串中不存在”.“或不操作就是空即为假
最后要绕过的是file_get_contents()
这里因为我对php伪协议不熟,问了我团队的大牛才知道原来可以用php://input绕过
data协议没试有兴趣的可以自己去试试
最后payload为:GET: ?id=0&content=W1111111&filename=php://input
POST:welcome2ctfshow