第7章 注入攻击
注入攻击的本质是,把用户输入的数据当作代码执行。有两个关键的条件:一是用户能够控制输入;二是原本程序要执行的代码,拼接了用户输入的数据。
1、SQL注入
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。SQL注入攻击是一种比较常见的针对数据库的漏洞攻击方式。在SQL注入的过程中,如果网站的Web服务器开启了错误回显,错误回显披露的敏感信息,对于攻击者构造SQL注入提供了极大的便利。
2、盲注(Blind Injection)
盲注,就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,所以攻击者必须找到一个方法来验证注入的SQL语句是否得到执行。
最常见的盲注验证方法是,构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否执行。
列如:id=2 and 1=2,攻击者看到的页面结果将为空或者是一个出错的页面。输入id=2 and 1=1时,如果页面正常返回,说明SQL语句的and成功执行,可以判断id参数存在SQL漏洞。
3、Timing Attack
MYSQL中利用BENCHMARK()函数,可以让同一函数执行若干次,使得返回结果的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种边信道攻击,这个攻击在盲注中被称为Timing Attack。在不同的数据库中,都有类似于BENCHMARK()的函数,可以被Timing Attak利用。
4、数据库攻击技巧
SQL注入可以猜解出数据库的对应版本,在下面这段payLoad如果Mysql的版本是4,则会返回TURE.
http://www.site.com/news.php?id=5 and substring(@@version,1,1)=4
下面这段payload,利用union select 来分别确认表名admin是否存在,列名passwd是否存在。
id=5 union all select 1,2,3 from admin
id=5 union all select 1,2,passwd from admin
sqlmap.py是一个非常好的自动化注入工具。
5、命令执行
在MYSQL中,除了可以通过导出webshell间接地执行命令外,还可以利用“用户自定义函数”的技巧,即UDF(User-Defined Function)在执行命令。
6、攻击存储过程
存储过程必须使用CALL或者EXECUTE来执行。
xp_cmdshell:执行系统命令(在SQL Server2000默认开启,在2005以及以后版本则被默认禁止)
xp_regread:可以操作注册表。
xp_servicecontrol:允许用户启动、停止服务
xp_dirtree:允许获得一个目录树
xp_loginconfig:获取服务器安全信息
存储过程本身也可能存在注入漏洞。
7、编码问题
当数据库使用了“宽字符集”时,可能会产生一些意向不到的漏洞。比如当MYSQL使用了GBK编码时,oxbf27和oxbf5c都会被认为是一个字符(双字节字符)。
数据库字符最好统一设置为UTF-8。
8、正确的防御SQL注入
- 找到所有的SQL注入漏洞;
- 修补这些漏洞。
一般来说,防御SQL注入的最佳方式,就是使用预编译语句,绑定变量。
使用存储过程:将SQL语句定义在数据库中,尽量避免在存储过程中使用动态的SQL语句。如果无法避免,应该使用严格的输入过滤或者是编码函数来处理用户的输入数据。
检查数据类型
使用安全函数
9、其他注入攻击
XML注入:Xml注入是通过改写xml的数据内容来实现。
代码注入:往往由一些不安全的函数或者方法引起。如eval()、PHP、JSP的动态include()、system()。
CRLF注入:就是回车(CR, ASCII13, \r) 换行(LF, ASCII10, \n)。
\r\n这两个字符是用于表示换行的。其十六进制编码分别为0x0d、0x0a。
对抗CRLF的方法非常简单,只需处理好“\r"、"\n"这两个保留字符即可。
10、小结
注入攻击是应用违背了”数据与代码分离原则“导致的结果。
在对抗注入攻击时,只需牢记”数据与代码分离原则“,在拼凑发生的地方进行安全检查,就能避免此类问题。