注入攻击学习笔记

版权声明:如果喜欢,就点个赞呗 O(∩_∩)O~ https://blog.csdn.net/deniro_li/article/details/85222241

安全设计原则:数据与代码分离。

注入攻击的本质:把用户的输入数据当作代码来执行。

关键条件:

  1. 用户能够控制输入。
  2. 程序要执行的代码拼接了用户输入的数据。

1 SQL 注入

1.1 概述

因为 98 年黑客杂志的一篇文章, SQL 注入第一次为人熟知。

var sql="select * from area where city ='" + city +"'";

正常场景(传入 Shanghai),执行的 SQL 语句:

select * from area where city = 'Shanghai';

黑客传入有语义的参数:

Shanghai'; drop table area--

这时,执行的 SQL 语句为:

select * from area where city = 'Shanghai'; drop table area--

这样的话,查询语句执行后,相应的表也被恶意删除了!

1.2 防御误区

使用那些基于黑名单的方法,比如过滤字符。存在如下问题:

方法 攻击
过滤空格 select/**/city/**/from/**/areaselect(city)from(area)
过滤括号与引号 0x61646D696E
过滤 SQL 保留字 having、order by 可能出现在自然语言中,会造成误杀。

1.3 有效防御

1、预编译语句

这是防御 SQL 注入攻击的最佳方法,因为输入的参数不会改变 SQL 语句的语义。

2、存储过程

使用存储过程的效果与预编译语句相似。但应该尽量避免在内部动态生成 SQL 语句。


如果某些场合,无法使用预编译语句或存储过程,那么可以考虑以下方法:

3、检查数据类型

检查数据类型可以在一定程度上对抗注入攻击。但不是万能的,比如字符串类型,就需要依赖其他防御方法。

4、安全函数

OWASP ESAPI

5.数据库

最小权限原则:Web 应用应该避免使用 root 等最高权限账户(因为这些账户可以创建自定义函数、操作本地文件权限)。

2 其它类型注入

它们的相同特点:都是违反了数据与代码分离。

2.1 XML 注入

注入方式上与 HTML 类似。

2.2 代码注入

都是由一些不安全的函数或者方法引起的。

比如 js 的 eval()eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

在 Java 中可以利用脚本引擎实施 js 代码注入。


安全设计原则:数据与代码分离。

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/85222241