注入攻击

文章目录

  • 注入攻击
    • 前言
    • 本质
    • 实现注入攻击的两个关键条件(重点)
    • 一、盲注
      • 1 、盲注出现原因
      • 2、什么是盲注?
      • 3、常见的盲注验证方法
    • 二、数据库攻击技巧
      • 1、常见的攻击技巧
      • 2、命令执行
      • 3、数据库存储过程
      • 4、编码问题
      • 5、SQL Column Truncation
    • 三、正确地防御SQL注入
      • 1、使用预编译语句
      • 2、使用存储过程
      • 3、检查数据类型
      • 4、使用安全函数
    • 四、其他注入攻击
      • 1、XML注入
      • 2、代码注入
        • 什么是代码注入
        • 解决方案
      • 3、CRLF注入
        • CRLF的含义
        • CRLF的危险
        • 解决方案
    • 五、总结

前言

  • 安全设计原则“数据与代码分离”原则,可以说就是专门为了解决注入攻击而生的。
  • 注入攻击代指一类攻击,它们通过注入数据到一个网络应用程序以期获得执行,亦或是通过非预期的一个方式来执行恶意数据。

本质

  • 注入攻击的本质,就是把用户输入的数据当做代码执行。

实现注入攻击的两个关键条件(重点)

  • 第一个:用户能控制输入——用户能控制输入变量
  • 第二个:原本程序要执行的代码,拼接了用户输入的数据。(正是拼接的这个过程导致了代码的注入)

一、盲注

1 、盲注出现原因

  • 在SQL注入过程中,如果网站的Web服务器开启了错误回显,则会为攻击者提供极大的便利,为了防止被攻击者利用,网站管理者会关闭错误回显功能。

2、什么是盲注?

  • 简而言之就是在服务器没有错误回显时完成的注入攻击。
  • 服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,所以攻击者必须找到一个办法来验证注入的SQL语句是否得到执行。

3、常见的盲注验证方法

  1. 构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行。利用返回出来的web页面差异,对我们的注入语句进行判断,比如使用1=1与 1=2 、被0除这种故意营造错误
  2. 如果页面没有差异,那么就可以使用时间延迟的注入,设定我们SQL语句如果执行了就晚点返回页面,可以有效判断
  3. 如果上面的技术都没有用,那就剩下BurpSuite的技术:OAST了,这个技术是在Burp Collaborator Client里面的。这个原理大致是,如果语句有效,它会返回给我们的Burp Collaborator Client一些报文,这个相当于DNS服务器一样。

二、数据库攻击技巧

  • SQL注入是基于数据库的一种攻击。不同的数据库有着不同的功能、不同的语法和函数,因此针对不同的数据库,SQL注入的技巧也有所不同。

1、常见的攻击技巧

  1. sql注入猜解出数据库的对应版本
  2. 利用union select来分别确认表名admin是否存在,列名passwd是否存在,想要猜解出username和passwd具体的值,可以通过判断字符的范围,一步步读出来。
  3. 在注入攻击的过程中,常常会用到一些读写文件的技巧。在 MySQL 中,就可以通过LOAD_FILE()读取系统文件,并通过INTO DUMPFILE 写入本地文件。当然这要求当前数据库用户有读写系统相应文件或目录的权限。
  4. 写入文件的技巧,经常被用于导出一个Webshell,为攻击者的进一步攻击做铺垫。

2、命令执行

  • 可以通过导出webshell间接地执行命令。
  • 利用"用户自定义函数"的技巧,即UDF (User-Defined Functions)来执行命令。
  • 一般来说,在数据库中执行系统命令,要求具有较高的权限。在数据库加固时,可以参考官方文档给出的安全指导文档。
  • 在建立数据库账户时应该遵循“最小安全原则”,尽量避免给Web应用使用数据库的管理员权限。

3、数据库存储过程

  • 存储过程与UDF很像。但存储过程必须使用CALL或者EXECUTE来执行。在MS SQL Server和Oracle数据库中,都有大量的存储过程。在注入攻击中,存储过程将为攻击者提供很大的便利。
  • 可以利用存储过程直接攻击,存储过程本身也可能会存在注入漏洞。

4、编码问题

1、有时候,不同的字符编码也可能导致一些安全问题。注入攻击中常常会用到单引号、双引号等特殊字符。在应用中,开发者为了安全,经常使用转义字符“\”来转义这些特殊字符。但当数据库使用了“宽字符集”时,可能会产生一些意想不到的漏洞

解决方法:

  • 需要统一数据库,操作系统,Web应用所使用的字符集,以避免各层对字符的理解存在差异,同意设置为UTF-8是一个很好的方法。

2、基于字符集的攻击并不局限于SQL注入,凡是会解析数据的地方都可能存在此问题。

XSS攻击时,由于浏览器与服务器返回的字符编码不同看,也可能会存在字符集攻击。

解决方法:

  • 在HTML界面的<meta>标签中指定当前页面的charset。

3、如果因为种种原因无法统一字符编码,则需要单独实现一个用于过滤或转义的安全函数在其中需要考虑到字符的可能范围。

5、SQL Column Truncation

MySQL的配置选项中,有一个sql_mode选项。当其设置为default时,即没有开启STRICT_ALL_TABLES选项时,MySQL对于用户插入的超长值只会题是warning,而不是error(error则插入不成功),这可能会导致发生一些“截断”问题。
举例:

  • 插入一个名称为admin[55 space chars]x的用户到数据库中,由于截断,就会有第二个admin用户存在于数据库中。

三、正确地防御SQL注入

需要做的事情:

(1)找到所有的SQL注入漏洞

(2)修补这些漏洞

基于黑名单来过滤字符的方法,都或多或少存在一些问题。

黑白名单与预编译是比较常用的防御SQL注入的手段。

1、使用预编译语句

一般来说,防御SQL注入的最佳方式,就是使用预编译语句,绑定变量。

在不同的语言中,都有着使用预编译语句的方法。

2、使用存储过程

使用安全的存储过程对抗SQL注入,值得注意的是存储过程中也可能存在注入问题,因此应该尽量避免在存储过程内使用动态的SQL语句。如果无法避免,则应该使用严格的输入过滤或者编码函数来处理用户的输入数据。

3、检查数据类型

检查输入数据的数据类型,在很大程度上可以对抗SQL注入。

例如:

  • 用户在输入邮箱时,必须严格按照邮箱的格式;输入时间、日期时,必须严格按照时间、日期的格式,等等,都能避免用户数据造成破坏。但数据类型检查并非万能,如果需求就是需要用户提交字符串,比如一段短文,则需要依赖其他的方法防范SQL注入。

4、使用安全函数

我们需要一个足够安全的编码函数。数据厂商往往都对此做出了“指导”。

对于数据库自身的角度来说,应该使用最小权限原则,避免Web应用直接使用root、dbowner等高权限账户直接连接数据库。Web应用使用的数据库账户,不应该有创建自定义函数、操作本地文件的权限。

四、其他注入攻击

除了SQL注入外,在Web安全领域还有其他的注入攻击,这些注入攻击都有相同的特点,就是应用违背了“数据与代码分离”原则。

1、XML注入

  • XML是一种常用的标记语言,通过标签对数据进行结构化表示。XML与HTML都是SGML( Standard Generalized Markup Language,标准通用标记语言)。
  • XML 与 HTML一样,也存在注入攻击,甚至在注入的方法上也非常相似。
  • XML注入,也需要满足注入攻击的两大条件:用户能控制数据的输入;程序拼凑了数据。在修补方案上,与 HTML 注入的修补方案也是类似的,对用户输入数据中包含的“语言本身的保留字符”进行转义即可

2、代码注入

什么是代码注入
  • 代码注入与命令注入往往都是由一些不安全的函数或者方法引起的,其中的典型代表就是eval()。
  • 存在代码注入漏洞的地方,与“后门”没有区别。
  • 严格来说,PHP、JSP的动态include(文件包含漏洞)导致的代码执行,都可以算是一种代码注入。
  • 代码注入多见于脚本语言,有时候代码注入可以造成命令注入 (Command Injection)。
解决方案
  • 对抗代码注入、命令注入时,需要禁用eval()、system()等可以执行命令的函数。如果一定要使用这些函数,则需要对用户的输入数据进行处理。此外,在 PHP/JSP中避免动态 include远程文件,或者安全地处理它。
  • 代码注入往往是由于不安全的编程习惯所造成的,危险函数应该尽量避免在开发中使用可以在开发规范中明确指出哪些函数是禁止使用的。这些危险函数一般在开发语言的官方文档中可以找到一些建议。

3、CRLF注入

CRLF的含义
  • CRLF实际上是两个字符,CR是Carriage Return (ASCII 13,\r),LF是Line Feed (ASCII 10,\n)。\r \n这两个字符是用于表示换行,其十六进制编码分别为0x0d、0x0a。
CRLF的危险
  • CRLF注入并非仅能用于log注入,凡是使用CRLF作为分隔符的地方都可能存在这种注入,比如“注入 HTTP头”。
  • 在HTTP协议中,HTTP头是通过“\r\n”来分隔的。因此如果服务器端没有过滤“\r\n而又把用户输入的数据放在HTTP头中,则有可能导致安全隐患。这种在HTTP头中的CRLF注入,又可以称为“Http Response Splitting”。可以说HTTP Response Splitting 的危害甚至比XSS还要大,因为它破坏了HTTP协议的完整性。
解决方案
  • 对抗CRLF的方法非常简单,只需要处理好“\r”、“\n”这两个保留字符即可,尤其是那些使用“换行符”作为分隔符的应用。

五、总结

  • 注入攻击是应用违背了“数据与代码分离原则”导致的结果。它有两个条件:一是用户能够控制数据的输入;二是代码拼凑了用户输入的数据,把数据当做代码执行了
  • 在对抗注入攻击时,只需要牢记“数据与代码分离原则”,在“拼凑”发生的地方进行安全检查,就能避免此类问题。
  • SQL注入是Web安全中的一个重要领域.
  • 理论上,通过设计和实施合理的安全解决方案,注入攻击是可以彻底杜绝的。

《白帽子讲Web安全》注入攻击相关推荐

  1. 白帽子讲web安全——认证与会话管理

    在看白帽子讲web安全,刚好看到认证与会话管理:也就是我们在平常渗透测试中遇到最多的登录页面,也即是用户名和密码认证方式,这是最常见的认证方式. 了解两个概念:认证和授权 1):认证的目的是为了认出用 ...

  2. 读《白帽子讲Web安全》之客户端脚本安全(一)

    2019独角兽企业重金招聘Python工程师标准>>> [第2章  浏览器安全] 1.同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也最基本的安全功能. ...

  3. 读白帽子讲WEB安全,摘要

    读<白帽子讲WEB安全>摘要 文章目录 我的安全世界观 安全三要素-CIA 如何实施安全评估 白帽子兵法 客户端安全 浏览器安全 同源策略 浏览器沙箱 恶意网址拦截 高速发展的浏览器安全 ...

  4. 白帽子讲web安全 ——读书笔记:术语和理论

    最近心血来潮,对安全这些略感兴趣,就买了本 白帽子讲web安全 看看 ,这里做个读书笔记吧!方便啥时候忘了再看一下. exploit--漏洞利用代码 Script kids --脚本小子,利用expl ...

  5. 白帽子讲WEB安全读书笔记(慢慢更新)

    道哥写的白帽子讲WEB安全的读书笔记 文章目录 2020.3.23 ◆ 前言 ◆ 第一篇 世界观安全 1.1 Web安全简史 >> 1.1.1 中国黑客简史 >> 1.1.2 ...

  6. 在学习web安全的小白看过来,这本《白帽子讲web安全》强烈推荐,必读!(附PDF)

    Web是互联网的核心,是未来云计算和移动互联网的最佳载体,因此Web安全也是互联网公司安全业务中最重要的组成部分. 前排提醒:文末有pdf领取 下面来看看几种常见的web漏洞: 1.XSS跨站脚本攻击 ...

  7. 《白帽子讲Web安全》读后感 —— 对道哥的致敬

    <白帽子讲Web安全>读后感 --Deep Blue (一个安全小兵的感受) 这是一篇作业:这是一篇读后感:这是一篇记录安全的感悟:这是一篇对道哥的敬仰:这是我安全启蒙的钥匙...... ...

  8. 学习web安全,强烈推荐这本《白帽子讲web安全》!

    Web是互联网的核心,是未来云计算和移动互联网的最佳载体,因此Web安全也是互联网公司安全业务中最重要的组成部分. 下面来看看几种常见的web漏洞: 1.XSS跨站脚本攻击 XSS跨站脚本攻击,通常指 ...

  9. 分享笔记1 之《白帽子讲web安全》

    分享笔记1 之<白帽子讲web安全> 目录 第一篇 世界观安全 第1章 我的安全世界观 2 1.1 web安全简史 2 1.1.1 中国黑客简史 2 1.1.2 黑客技术的发展历程 3 1 ...

  10. 《白帽子讲Web安全》学习笔记

    一.为何要了解Web安全 最近加入新公司后,公司的官网突然被Google标记为了不安全的诈骗网站,一时间我们信息技术部门成为了众矢之的,虽然老官网并不是我们开发的(因为开发老官网的前辈们全都跑路了). ...

最新文章

  1. 怎么DIY一个粒子检测器
  2. java poi 导出 国际化_更好用的excel国际化多语言导出
  3. 转型会员制,云集能否讲好电商下半场故事?
  4. 为什么编程语言初创公司那么少?
  5. java文件下载controller_Java Spring MVC 上传下载文件配置及controller方法详解
  6. vue-cli项目引用文件/组件/库 的注意事项(一)
  7. openMVG跑自定义数据出错
  8. Asp.net 中 Eval 调用后台函数的写法
  9. 用Android UEventObserver监听内核event
  10. LeetCode 744. Find Smallest Letter Greater Than Target
  11. JS数组遍历和获取数组最值
  12. js 基于函数伪造的方式实现继承
  13. 映射文件实现进程通信
  14. 冲击波内幕点滴 (转)
  15. 什么是 Hook 技术
  16. 使用亚马逊云快速托管静态网站
  17. 提升领导力这7个法则,你不得不知道
  18. csv文件转换成xlsx文件方法
  19. STM32编程环境配置(kile5)
  20. 面阵相机以及相机选型公式

热门文章

  1. layui表单验证提交
  2. DSP入门前的背景知识
  3. java语言数据库课程设计_数据库课程设计 人事管理系统 (一)
  4. 计算机硬件 试题,计算机硬件试题150完整版
  5. python 动态执行代码块
  6. H3CNE,H3CSE知识点,重点汇总。
  7. 解决mikumikudance丢失dxdx_43.dll问题
  8. php免杀书籍,php免杀教程【绝对原创+首发】
  9. structs2总结
  10. 学以致提高学生操作计算机能力,学用结合,学以致用