注入的本质:是把用户输入的数据当作代码执行。前提条件一:用户能够控制输入。二:原本程序要执行的代码,拼接了用户输入的数据。
SQL注入:
利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作。
造成SQL注入的原因:
因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
盲注:
就是在服务器没有错误回显时完成的注入攻击。
常见的盲注验证方法:构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行。
常见的数据库攻击技巧:SQL猜解数据库对应版本。
http://www.xxxx.com/news.php?id=5 and substring(@@version,1,1)=4
利用union select确认表名admin是否存在,列名passwd是否存在。
http://www.xxxx.com/news.php?id=5 union all select 1,2,3, from admin
http://www.xxxx.com/news.php?id=5 union all 1,2,,passwd from admin(此为手动注入,自动工具:sqlmap)
防御SQL注入攻击:
1.使用预编译语句:使用预编译语的SQL语句,SQL语句的语义不会发生改变,攻击者无法改变SQL的结构。
2.使用存储过程:尽量避免在存储过程中使用动态SQL语句,如果使用,应使用严格的输入过滤和编码函数来处理用户的输入数据。
3.检查数据类型:限制输入的数据类型。
4.使用安全函数
其他注入攻击
1.XML攻击
2.代码注入
3.CRLF注入
总结:注入攻击是应用违背了“数据与代码分离原则”导致的结果。只需要牢记“数据与代码分离原则”,在“拼凑”发生的地方进行安全检查。就能避免此类问题。