这一篇博客记录的是服务端安全应用安全的知识,学习内容来自《白帽子讲Web安全》。
承接自上一篇客户端安全之后,包括注入攻击、认证与会话管理和访问控制、访问控制、加密算法与随机数、Web框架安全、应用层拒绝服务攻击DDOS、Web Server安全等方面。
注入攻击
由于应用违背了“数据与代码分离的原则”。两个条件:1.用户能控制数据的输入;2.代码拼凑了用户输入的数据。
SQL注入
盲注
在服务器没有错误回显的时候完成注入攻击。验证方法:构造简单的条件语句根据页面是否发生变化来判断SQL语句是否执行。
Timing Attack
利用数据库中某些特殊的函数,可以有条件地造成延迟。
例如在MySQL中,利用BENCHMARK()函数,可以让同一个函数执行若干次,使得返回的结果比平均时间要长,通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种 边信道攻击 。
eg:
1170 UNION SELECT IF(SUBSTRING(current,1,1) =
CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by
5 seconds')),null) FROM (Select Database()
as current) as tbl;
这段Payload判断库名的第一个字母是否为CHAR(119),即小写的w。如果判断结果为真,
则会通过BENCHMARK()函数造成较长延时;如果不为真,则该语句将很快执行完。攻击者
遍历所有字母,直到将整个数据库名全部验证完成为止。
此外,例如如此的手段还可以获得很多有关数据库的信息。
数据库攻击技巧
常见的攻击机巧
SQL注入可以猜解数据库的版本。有自动化工具完成猜解username和password。。(猜解。。暴力),可以获取到当前用户的身份,从而进行进一步的文件操作,通过LOAD_FILE读出,然后INTODUMOFILE写入系统,最后通过LOAD DATA INFILE将文件导入表中。这种技巧可以导出Web-shell,为进一步攻击做好准备。
自动化注入工具:sqlmap
命令执行
在MySQL中,除了直接导出Web-shell间接执行命令之外,还可以利用UDF(USER-Defined-Functions)来执行命令。若当前用户是root,则可以直接获取到root权限。
攻击存储过程
存储过程为数据库提供了强大的功能,但必须用CALL或者EXECUTE执行。在注入过程中,存储过后才能为攻击者提供很大便利。例如MS SQL Server中,“xp_cmd-shell”执行系统命令。
编码问题
注入攻击中常常用到的单引号和双引号等特殊字符。当数据集采用了“宽字符集”的时候,就会产生一些漏洞,比如几个编码代表一个字符,例如。
0xbf27 or 1=1 经过转义之后 成为 经过转义后,会变成0xbf5c27(“\”的ASCII码为0x5c),但0xbf5c又是一个字符。故原有的转义字符 \ 就会“吃掉”。
统一设置为UTF-8是一个很好的办法,也就是,设置页面meta标签的charset属性。
SQL Column Truncation
MySQL数据库中,strict模式不开启会导致重复数据插入或其他非法数据插入,从而有可能获得越权访问。
正确地防御SQL注入
-
找到所有SQL注入漏洞
-
修补这些漏洞
使用预编译语句:最佳方式是使用预编译语句,绑定变量,用户的输入无法改变语句的结构和语义。
使用存储过程:将SQL语句定义在数据库中,避免使用动态的SQL语句。
检查数据类型, 使用安全函数
从数据库角度来说,应该使用最小权限原则。
其他注入攻击
- XML注入:和HTML注入很相似
- 代码注入: 通过一些执行命令的函数间接执行命令,如eval(), system()
- CRLF注入: 两个字符 \n \t 表示换行,注入换行符改变语义。eg:log日志文件的改写,注入HTTP头(Http Response Splitting),因为HTTP头是\n\t换行的,可能导致安全隐患,可形成XSS攻击。