02服务器安全-注入攻击

注入攻击的本质是: 把用户输入的数据当做代码执行. 这有两个条件:

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

例如: var sql = "select * from OrdersTable where ShipCity = '"+ShipCity+"';

如果用户输入了city名字,比如 Beijing, 那么查询语句是这样的:

select * from OrdersTable where ShipCity = 'Beijing', 但是, 如果用户输入: Beijing';drop table OrdersTable -- 那么 SQL 语句就会变成

select * from OrdersTable where ShipCity = 'Beijing'; drop table OrdersTable --'

在 SQL 注入过程中, 如果网站的 Web 服务器开启了错误回显, 则会为攻击者提供极大的便利, 比如攻击者在参数中输入一个单引号" ' ",那么会引起执行查询语句的语法错误,服务器直接返回了错误信息:

 从错误信息中, 可以看到服务器是 Access 数据库, 查询的表达式可能是 select xxx from table_x where id = $id

盲注

很多时候, web 服务器关闭了错误回显,比如通过构造简单的条件语句,根据返回页面是否发生变化来判断SQL语句是否得到执行. 比如:

一个URL: http://newspaper.com/item.php?id=2

执行的SQL: select title, description, body FROM items where id = 2

攻击者构造如下条件语句  http://newspaper.com/item.php?id=2 and 1 = 2

实际执行: select title, description, body FROM items where id = 2 and 1 = 2, 这样攻击者会看到页面结果为空 或者一个出错的页面。

攻击者可以再尝试 http://newspaper.com/item.php?id=2 and 1 = 1, 此时就可以判断漏洞存在, 是可以注入的.

防御SQL注入

防御SQL注入的最佳方式, 使用预编译语句, 绑定变量, 这样, 即便在变量上做什么改变, 也会看做是变量“整体”. 实际上相当于破坏了第二条即拼接了输入数据,这时就不是把用户输入拼接到代码上了,而是用户输入数据作为了一个整体, 比如如果用户输入  Beijing'; drop table OrdersTable -- , 那边就只表示用户输入的是这个城市

String query = "SELECT account from user_data where user_name = ?";     这里使用了绑定变量.

先编译这条SQL 语句, 然后SQL 语句的语义不会发生改变了,输入的内容, 只能作为变量了.

所以说, 这里的主要区别是, 不是拼接, 而是使用绑定变量替换变量的方式, 无论用户输入什么, 都会是变量的一部分, 永远也无法拼接到 SQL 语句中.

所以, 推荐必须使用绑定变量的方式. 另外就是用户的输入, 必须要有 validation.

其他注入

xml注入 & HTML 注入(比如 javascript)

解决的办法是: 对用户输入数据中包含“语言本身的保留字”进行转义即可.

对抗代码注入,命令注入时,需要禁用 eval(), system() 等可以执行命令的函数.

代码注入旺旺是由于不安全的编程习惯造成的. 即应该尽量避免数据与代码的拼接. 应该更多的是再抽象出来一层, 使得输入真正的作为一个变量整体, 而不是可以作为代码的一部分.

CRLF注入 即换行回车注入

比如注入 HTTP 头中, HTTP头是通过 来隔的,因此如果服务器没有过滤 , 而又把用户输入的数据放在 HTTP 头中,可能导致安全隐患.

例如如果用户输入两次 表示换2行(HTTP头默认的换两行表示 HTTP头结束, 那后面的信息就没有代入)

主要还是要解决: 代码与数据分离的问题.

原文地址:https://www.cnblogs.com/moveofgod/p/12360543.html