1.注入攻击
注入攻击的本质,是把用户输入的数据当做代码执行。两个关键条件:一是用户能够控制输入,二是原本程序要执行的代码,拼接了用户输入的数据。
1.1SQL注入
SQL注入,是构造SQL执行语句拼接在输入参数中,从而执行SQL。若Web服务器开启了错误回显,则会披露敏感信息,为攻击者提供更大便利。
SQL盲注,是在服务器没有错误回显时完成的注入攻击。常见验证方法是构造简单的条件语句,根据返回页面是否发生变化,来判断SQl语句是否得到执行。
Timing Attack,利用BENCHMARK()测试函数性能函数,让同一个函数执行若干次,使得结果的返回结果比一般长,通过时间长短的变化,判断注入语句是否执行成功。
1.2数据库攻击技巧
1)常见攻击技巧
sqlmap:SQL注入可以猜测出数据库的对应版本,验证表名是否存在,进而验证用户名密码等更多信息。这可通过sqlmap.py自动化注入工具帮助完成整个过程。链接:https://github.com/sqlmapproject/sqlmap
读写文件:在MySQL中通过load_file()读取系统文件,通过INTO DUMPFILE写入本地文件,再通过LOAD DATA INFILE将文件导入创建的表中,最后通过一般的注入技巧直接操作表数据。其中INTO DUMPFILE适用于二进制文件,它会将目标文件写入同一行内,也可使用INTO OUTFILE写入文本文件。写入文件的技巧常用于导出一个Webshell,为攻击者进一步攻击做铺垫。
因此在设计数据库安全方案时,可以禁止普通数据库用户具备操作文件的权限。
2)命令执行
利用用户自定义函数UDF(User-Defined Functions)来执行命令。
通过lib_mysqludf_sys提供的函数执行系统命令,主要是sys_eval()和sys_exec()。在攻击过程中将lib_mysqludf_sys.so上传到数据库能访问到的路径下,在创建UDF后,使用sys_eval()等函数执行系统命令。
因此在建立数据库账户时应该遵循”最小权限原则“,尽量避免给Web应用使用数据库的管理员权限。
3)攻击存储过程
xp_cmdshell:执行系统命令, xp_cmdshell在SQL Server 2000中默认是开启的,但在2005及之后的版本默认被禁止了。若当前数据库用户拥有sysadmin权限,则可以使用sp_configure重新开启。
xp_regread:操作注册表
xp_servicecontrol:允许用户启动,停止服务
xp_dirtree:允许获得一个目录树
xp_enumdsn:列举服务器上的ODBC数据源
xp_loginconfig:获取服务器安全信息
4)编码问题
注入攻击中常用单引号,双引号等特殊字符,基于字符集攻击。如当MySQL使用GBK编码时,0xbf27和0xbf5c会被认为是一个字符(双字节字符),而在进入数据库之前。在Web语言中则没有考虑到双字节字符的问题,双字节字符会被认为是两个字节。若攻击者输入“0xbf27 or 1=1”,经过转义后会变成“0xbf5c27”(\的ASCII码为0x5c),原本存在的转义符号在数据库中会被吃掉。
因此在设计时需要统一数据库,操作系统,Web应用所使用的字符集,以避免各层对字符的理解存在差异。建议设置为UTF-8是一个很好的方法。根据系统所使用的不同字符集来限制用户输入数据的字符允许范围,以实现安全过滤。
5)SQL Column Truncation
在MySQL中有一个sql_mode选项,当MySQL的sql-mode设置为default即没有开启STRICT_ALL_TABLES选项时,MySQL对于用户插入的超长值只会提示warning,而不是error。这可能造成越权访问。
1.3正确地防御SQL注入
防御的关键:一是找到所有的SQL注入漏洞,二是修补这些漏洞。
1)使用预编译语句,绑定变量,SQL语句的语义不会发生改变,攻击者无法改变SQL的结构。
2)使用存储过程,使用安全的存储过程对抗SQL注入,尽量避免在存储谷城内使用动态的SQl语句,若无法避免,则使用严格的输入过滤或编码函数来处理用户的输入数据。
3)检查输入数据的数据类型,或者其他的数据格式及类型检查。
4)使用安全函数,参考数据库厂商和OWASP ESAPI的实现。从数据库自