数据与代码分离”可以解决注入攻击
注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。
7.1 SQL注入
SQL注入第一次为公众所知,是在1998年的著名黑客杂志《Phrack》第54期上,一位名叫rfp的黑客发表了一篇题为“NT Web Technology Vulnerabilities”的文章。(http://www.phrack.org/issues.html?issue=54&id=8#article)
下面是一个SQL注入的典型例子。
- <SPAN style="FONT-SIZE: 18px">var shipcity;
- shipcity=Request.form("shipcity");
- var sql = "select * from OrdersTable where ShipCity='"+shipcity+"'"</SPAN>
变量shipcity的值由用户提交,在正常情况下,假如用户输入“Beijing”,那么SQL语句会执行
- <SPAN style="FONT-SIZE: 18px">SELECT * FROM OrdersTable WHERE ShipCity='Beijing'</SPAN>
但假如用户输入一段有语义的SQL语句,比如:
- <SPAN style="FONT-SIZE: 18px">Beijing';drop table OrdersTable--
- </SPAN>
那么,SQL语句在实际执行时就会如下:
- <SPAN style="FONT-SIZE: 18px">SELECT * FROM OrdersTable WHERE ShipCity = 'Beijing';drop table OrdersTable--'</SPAN>
以上语句执行有问题
我们看到,原本正常执行的查询语句,现在变成了查询完后,再执行一个drop表的操作,而这个操作,是用户构造了恶意数据的结果。
再回过头来看看注入攻击的两个条件:
1) 用户能够控制数据的输入---在这里,用户能够控制变量shipCity
2)原本要执行的代码,拼接了用户的输入:
- <SPAN style="FONT-SIZE: 18px">var sql = "select * from OrdersTable where ShipCity='"+shipCity+"'"</SPAN>
这个拼接的过程很重要,正是这个拼接的过程导致了代码的注入。
在SQL注入的过程中,如果网站的Web服务器开启了错误回显,则会为攻击者提供极大的便利。
7.1.1 盲注(Blind Injection)
所谓“盲注”,就是在服务器没有错误回显时完成的注入攻击。
最常见的盲注验证方法是,构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行。
比如,一个应用的URL如下:
http://newspaper.com/items.php?id=2
执行的SQL语句为:
SELECT title,description,body FROM items WHERE ID=2
如果攻击者构造如下的条件语句:
http://newspaper.com/item.php?id=2 and 1=2
实际执行的SQL语句就会变成
SELECT title,description,body FROM items WHERE ID=2 and 1=2
因为 and 1=2 永远是个假命题,所以这条SQL语句的 and 条件永远无法成立。对于Web应用来说,也不会将结果返回给用户,攻击者看到的页面结果将为空或者是一个出错页面。为了进一步确认注入是否存在,攻击者还必须再次验证这个过程,因为一些处理逻辑或安全功能,在攻击者构造异常请求时,也可能会导致页面返回不正常。攻击者继续构造如下请求:
http://newspaper.com/items.phpp?id=2 and 1=1
当攻击者构造条件"and 1=1"时,如果页面正常返回了,则说明SQL语句的and 成功执行,俺么就可以判断id参数存在SQL注入漏洞了
未完待续...