一、一行代码
首先审题:
echo !(!(include "flag.php")
||(!error_reporting(0))
||stripos($_GET['filename'],'.')
||($_GET['id']!=0)
||(strlen($_GET['content'])<=7)
||(!eregi("ctfsho".substr($_GET['content'],0,1),"ctfshow"))
||substr($_GET['content'],0,1)=='w'
||(file_get_contents($_GET['filename'],'r') !== "welcome2ctfshow"))?$flag:str_repeat(highlight_file(__FILE__), 0);
这个整体是三目运算符,所以需要前面的表达式为真才能返回$flag,但在开头有一个!,所以要使里面的表达式为false,但又都是 | | 连接的,所以要使表达式全为false,逐个观察。
三目运算符:
语法:retvalue = expression ? retvalue1 : retvalue2;
说明:如果表达式 expression 的值为真,那么就返回 retvalue1,否则,就返回 retvalue2。
stripos($_GET['filename'],'.'):filename中不能存在小数点;
($_GET['id']!=0):id=0;
(strlen($_GET['content'])<=7):content的长度大于7;
(!eregi("ctfsho".substr($_GET['content'],0,1),"ctfshow")):没匹配为真,则匹配为假;content=ww
substr($_GET['content'],0,1)=='w':content为W
(file_get_contents($_GET['filename'],'r') !== "welcome2ctfshow")):用data伪协议绕过;
在网址输入:?id=0&content=W1111111&filename=data://text/plain,welcome2ctfshow
先记录一下,以后阶段性补充,不懂的知识很多,目前只是知其然而不知所以然.