注入攻击

  • 注入的本质是,把用户输入的数据当代码执行,这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。

  • SQL注入

    • SQL注入的过程中, 如果网站的Web服务器开启了错误回显,则会为攻击者提供极大的便利。
    • 盲注
      • 所谓盲注,就是在服务器没有错误回显时完成的注入攻击。
      • 可以根据返回页面是否发生变化来判断语句是否得到执行。
    • timing attack
      • mysql中benchmark()函数,可以让同一个函数执行若干次,使得结果返回的时间要比平时要长,通过时间长短的变化,可以判断出注入语句是否执行成功。
    • 数据库攻击技巧

      • 一般性技巧
      • 命令执行
        其实都可在mysql中学习
      • 攻击存储过程
        • 在MS SQL Server和Qracle数据库中,都有大量内置的存储过程,在注入攻击的过程中,存储过程将为攻击者提供很大的便利。
        • 除了利用存储过程直接攻击外,存储过程本身也可能会存在注入楼哦对那个。
      • 编码问题
        • 要解决这种问题,需要统一数据库、操作系统、Web应用所使用的字符集,以避免各层对字符的理解存在差异。统一设置为UTF-8是一个很好的方法。
        • 由于浏览器与服务器返回的字符编码不同,也可能会存在字符集攻击,解决办法就是在HTML页面的标签中指定当前页面的charset。
        • SQL Column Truncation
  • 正确地防御SQL注入

    • sql注入的防御并不是一个简单的事情。开发者常常走入一些误区,比如只对用户输入做一些escape处理。
    • 使用预编译语句
      • 防御SQL注入的最佳方式,就是使用预编译的语句,绑定变量。
    • 使用存储过程
      • 我们还可以使用安全的存储过程对抗SQL注入。使用存储过程的效果和使用预编译类似,其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是,存储过程中也可能存在注入问题。因此应该尽量避免在存储过程内使用动态的SQL语句。
    • 检查数据类型
      • 检查输入数据的数据类型,在很大程度上可以对抗SQL注入。
    • 使用安全函数
    • 安全的编码函数,例如OWASP ESAPI中的实现。这个函数由安全专家编写,更值得信赖。
  • 其他注入攻击

    • xml注入
      • xml注入,也需要满足注入攻击的两大条件:用户能控制数据的输入;程序平凑了数据。在修补方案上,与HTML注入的修补方案也是类似的,对用户输入数据中包含的“语言本身的保留字符”进行转义即可。
    • 代码注入
      • 代码注入多见于脚本语言,有时候代码注入可以造成命令注入。
      • 对抗代码注入、命令注入时,需要禁用eval()、system()等可以执行命令的函数,如果一定要使用这些函数,则需要对用户的输入数据进行处理。此外,在PHP/JSP中便面动态include远程文件,或者安全地处理它。
    • CRLF注入
      • CRLF实际上是两个字符:CR是Carriage Return(ASCII 13,\r),LF是Line Feed(ASCII 10,\n).\r\n这两个字符是用于表示换行的,其十六进制编码分别为0x0d、0x0a
      • CRLF注入并非仅能用于log注入,凡是使用CRLF作为分隔符的地方都可能存在这种注入,比如"注入HTTP头"。两次'\r\n'意味着HTTP头的结束。

你可能感兴趣的:(注入攻击)