欢迎光临
我们一直在努力

[CTF]Day 1

重操旧业!

[极客大挑战 2019]EasySQL

进入后发现是账号登录的界面,尝试一些特殊字符串,如单引号,发现报错,内容如下:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'admin'' at line 1

这说明存在注入点,我们输入账号为以下值,密码随意输入后,即可拿到flag。

Payload

test' or 1;#

[极客大挑战 2019]Havefun

进去后是只猫,点击后没什么反应,只能先审计源代码。在根目录发现如下代码:

                <!--
        $cat=$_GET['cat'];
        echo $cat;
        if($cat=='dog'){
            echo 'Syc{cat_cat_cat_cat}';
        }
        -->

直接在url内带参,即可得到flag。

Payload

/?cat=dog

[HCTF 2018]WarmUp

进去后是个滑稽,老样子先审计代码,发现HTML注释内带着一个文件名:source.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 . '?', '?')
            );
            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\" />";
    }  
?>

代码审计

checkFile函数

开头定义了一个类,里面有个checkFile函数,传参page

  • 判断page,如果为空或不为字符串,则返回false
  • 检测page是否在白名单列表内,如果在,则返回true
  • 新建一个_page变量,拼接page和问号,然后截取page从开头到第一个问号出现的位置赋值。如果_page变量在白名单列表内,则返回true。下同,只是进行了url转码,提高兼容性。

我们看到白名单列表里还有个hint.php,访问后提示:flag not here, and flag in ffffllllaaaagggg,说明flag在一个名为ffffllllaaaagggg的文件内。

接着我们看看代码运行的流程。先判断url传参file是否不为空、是否为字符串、然后将file传入checkFile函数判断,如果以上条件都成立,则使用include调用file。

我们可以根据函数,传入一个白名单文件名,然后在文件名后添加问号,这样截取出来的就是白名单文件名,后面构造可以ffffllllaaaagggg,在后面include。第一次没成功引用,后面访问到了更深的目录,终于获取到了flag。

Payload

/?file=source.php?../../../../../ffffllllaaaagggg

[ACTF2020 新生赛]Include

进入后只有个超连接tips,查看源码没发现什么,点击后带file=flag.php参数访问了根目录,然后输出了Can you find out the flag?

题目提示了是include,于是先将value改成index.php,但是重复输出了很多meta charset,判断应该是重复调用了,得加密输出。

准备使用php://input执行命令,但是被拦截了:

应该是加了防护。使用了filter加密输出:

?file=php://filter/read=convert.base64-encode/resource=index.php

解码后代码如下:

<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
	exit('hacker!');
}
if($file){
	include($file);
}else{
	echo '<a href="?file=flag.php">tips</a>';
}
?>

原来过滤了这么多协议。同理,可以读取flag.php,获取flag。

Payload

/?file=php://filter/read=convert.base64-encode/resource=flag.php

[ACTF2020 新生赛]Exec

进去后有一个输入框,可以进行ping IP的操作,下面输出回显。

题目提示了exec,推断代码为ping IP,在IP后面添加Linux命令:

猜想正确,接下来进入到根目录,然后查看文件

127.0.0.1&&cd /&&ls

看到回显中有flag,查看即可

Payload

127.0.0.1&&cat /flag

[GXYCTF2019]Ping Ping Ping

进入后提示/?ip=,尝试在url后输入?ip=127.0.0.1,输出了ping的结果。

在IP后加入ls命令正常执行,发现有index.phpflag.php两个文件。直接cat flag.php后提示不能有空格。使用$IFS代替后发现不能使用flag这个关键字,想到了base64加密执行:

?ip=;a=Y2F0IGZsYWcucGhw;echo$IFS$a|base64$IFS-d|bash

输入后提示bash不能用,然后使用了花括号、小括号、星号,都不能使用,最后使用反引号成功,查看源代码后得到flag。

Payload

/?ip=;a=Y2F0IGZsYWcucGhw;echo$IFS$a|base64$IFS-d

[SUCTF 2019]EasySQL

进入后是一段话:Give me your flag, I will tell you if the flag is right.下面有个输入框。

输入flag后,提示NONONO;输入双引号,也提示NONONO,推断应该是搞了屏蔽词。经测试,还有and、or、from;输入数字后,会给你返回Array ( [0] => 1 ),构造查表Payload后,发现可以查表,但是语句中不能出现屏蔽词,就很便秘。

卡住了,怎么办?百度呗!

看了大佬们的WP,发现有两种方法解决。

第一种方法需要推断SQL查询语句。在输入数字时有回显,输入字符串时无回显,说明存在OR的逻辑,在输入数字时短路了后面的代码,大概语句如下:

select cmd || flag from flag

那么,当cmd=*,1时,SQL查询语句变成了:

select *,1 || flag from flag

这样,1短路了第一个flag,我们就可以查询到flag了。

第二种方法是利用sql_modesql_mode是控制 SQL 语法和数据验证的配置选项,它影响着数据库的行为,包括如何处理错误、是否启用特定的 SQL 语法、以及数据的验证规则等。

PIPES_AS_CONCAT是 MySQL 的一个 SQL 模式选项,用于将 || 运算符解释为字符串连接运算符,而不是逻辑“或”运算符。

Payload

*,1
1;set sql_mode=PIPES_AS_CONCAT;select 1

今天学到很多,睡觉睡觉。

赞(6) 打赏
未经允许不得转载:跑路博客 » [CTF]Day 1