《白帽子讲Web安全》| 学习笔记之注入攻击

第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注入

  1. 找到所有的SQL注入漏洞;
  2. 修补这些漏洞。

一般来说,防御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、小结

注入攻击是应用违背了”数据与代码分离原则“导致的结果。

在对抗注入攻击时,只需牢记”数据与代码分离原则“,在拼凑发生的地方进行安全检查,就能避免此类问题。

猜你喜欢

转载自blog.csdn.net/qq_42646885/article/details/95314190