【日常】ctfshow-一行代码
我是大菜鸡!
打开题目
可以看到两行代码
这里用了三目表达式,所以只有让前面的内容为真,才会echo $flag,但是在最前面还有一个!,所以要让括号里的内容全为假。
开始看代码:
error_reporting(0)//不太懂,但是本地执行后发现是int类型,所以加上!后应该就是假了
stripos($_GET['filename'],'.') //filename不能带'.',所以空置就行
$_GET['id']!=0 //让id=0
strlen($_GET['content'])<=7 //让conten的长度大于7
(!eregi("ctfsho".substr($_GET['content'],0,1),"ctfshow")) //eregi()如果前面的参数在后面参数的内容中存在则返回true,但是不会匹配大小写,所以conten的第一个字符为'W'
substr($_GET['content'],0,1)=='w' //同上,让conten的第一个字符为'W'
(file_get_contents($_GET['filename'],'r') !== "welcome2ctfshow") //让file_get_contents读取的内容为welcome2ctfshow。捏嘛,这个要用php://input来绕过,不能直接在get里面输入,因为file_get_contents()这个函数时将整个文件读入一个字符串中。
然而php://input

把这个文件的内容变成post的内容(其实我也不太懂。。。就大概这个意思吧)
在本地测试的时候,创建一个名为flag.txt的文件。
用两种不同的方式会得到不同的结果
1.?a=flag.txt。得到
2.?a=php://input 并用burp改包
得到的却是字符串。
所以payload: