1、SQL注入
注入攻击的本质:把用户输入的数据当做代码执行
条件1:用户可以控制输入;
条件2:代码拼接了用户输入的数据
最简单的恶意输入:beijing';drop table orderstable--
如果web服务器开启了错误回显,将利于攻击者获取敏感信息,为其提供便利。
盲注:服务器关闭回显情况下完成的注入攻击
最常见的盲注验证方法是:构造简单的条件语句,根据返回是否发生变化来判断sql语句是否得到执行
比如将入参设置为:1 and 1=1 和 1 and 1=2
Timing Attack
盲注的高级技巧,通过类似于benchmark()函数结合database()、system_user()、current_user()、last_insert_id()等函数,通过返回时间长短,破解出敏感信息。
如果当前数据库用户具有写权限,攻击者还可以将信息写入本地磁盘文件,比如写入web目录中,然后下载这些文件;此外,通过dump文件的方法,还可以写入一个webshell。
2、数据库攻击技巧
常见的攻击技巧:
1)利用union select来分别确认表名、列名是否存在;
2)通过判断字符的范围猜解出username和password等,工具:sqlmap.py;
3)利用读写文件的技巧,读取敏感信息(如/etc/passwd等),写入到本地文件,或者写入到自行创建的表中;写入文件的技巧经常被用于导出一个webshell,为进一步攻击做铺垫。
4)写入文件操作的区别:into dumpfile,into outfile,前者适用于二进制文件,将目标写入一行;后者更适用于文本文件。
命令执行
在mysql中,除了通过导出webshell间接执行命令外,还可以利用“用户自定义函数”的技巧,及UDF(user-defined functions) 来执行命令;尤其当运行mysql进程的用户为root时,将可能直接获得root权限。
mysql5之后的版本可通过lib_mysqludf_sys提供的几个函数执行系统命令,主要是sys_eval()和sys_exec();注入工具sqlmap已经集成了此功能。
SQL Server,可直接使用存储过程xp_cmdshell执行系统命令
Oracle,如果服务器同时还要java环境,也可能造成命令执行。
建议1:建立数据库账户时应该遵循“最小权限原则”,避免给Web应用使用数据库的管理员权限。
建议2:避免使用root启动数据库
攻击存储过程
在SQL Server和Oracle中存在大量内置存储过程,将为注入攻击者提供便利;同时,存储过程本身也可能存在注入漏洞。
编码问题
如果在数据流转过程中存在字符转换,某些字符可能丢失,从而受到攻击;
解决办法:统一数据库、操作系统、web应用所使用的字符集,比如统一为utf8;如果确实无法统一字符集,则需要单独实现一个用于过滤或转义的安全函数,在其中需要考虑到字符的可能范围,根据系统所使用不同字符集来限制用户输入数据的字符允许范围,以实现安全过滤。
SQL column truncation
Mysql有一个sql_mode选项,当没有开启strict_all_tables时,对于用户插入的超长值则只会提示warning,数据被截断插入,而不是error,这可能导致发生一些“截断”问题,从而可能引起越权访问之类的问题。
比如新建一个admin(55个空格)x的用户,则可能越权访问admin才有权限访问的资源。
3、正确的防御SQL注入
1)找到所有的SQL注入漏洞
2)修补这些漏洞
1)使用预编译语句:只对用户的输入做一些escape处理是不够的,增加一些过滤字符也不是很好的方案,防御sql注入的最佳方式为使用预编译语句,绑定变量。使用预编译语句,变量用?表示,SQL语句的语义不会发生变化。
2)使用存储过程,使用安全的存储过程可对抗SQL注入,但同时存储过程本身也可能存在注入问题;
3)检查数据类型:integer、时间、日期、邮箱;
4)使用安全的函数:根据数据库厂商的“指导”,使用足够安全的编码函数。
总之:
1)为应用分配“最小权限原则”的数据库用户,避免使用root或dbowner等高权限账户;
2)多个应用共用一个数据库,则应该为每个应用分配不同的账户;
3)web应用的数据库账户,不应有创建自定义函数、操作本地文件的权限。
4、其他注入攻击
被攻击应用共性:违背了“数据与代码分离”的原则。
XML注入
代码注入
代码注入和命令注入往往都是由一些不安全的函数或方法引起,如eval()、system();Java的脚本引擎、PHP、JSP的动态include都可能导致代码注入;建议禁用危险的函数,PHP/JSP中避免使用动态include,如果一定要用,需要对输入数据进行处理。
CRLF注入
CR \r LF \n \r\n表示换行符
CRLF常用做不同语义直接的分隔符,注入CRLF字符,可能改变原有的语义。
Http Response Splitting 在HTTP头中的CRLF注入,可能导致XSS攻击;某种程度上HTTP Response Splitting的危害比XSS还大,因为它破坏了HTTP协议的完整性。
对抗CRLF只需要处理好\r \n这两个保留字符即可,尤其是那些使用“换行符”作为分隔符的应用。