web攻击与防御
跨站脚本攻击
形式
-
直接脚本植入
-
埋置脚本陷阱
影响
-
利用虚假输入表单骗取用户个人信息
-
窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
-
插入伪造的文章或图片
案例
获取用户账号密码


获取用户cookie信息


防御
-
设置X-XSS-Protection头
-
对cookie中设置httponly
-
xss filter(检查输入,设置白名单)
-
输出检查(编码、转义,常用编码:html编码,js编码,16进制等)
-
针对不同位置的输出,使用不同的处理方式
-
处理富文本
-
header中使用content-Sencurity-Policy字段,规定请求js的域名白名单(CSP策略)
跨站请求伪造
形式
- 通过设置好的陷阱,强制对认证的用户进行非预期的状态更新
影响
-
利用已通过认证的用户权限更新设定信息等
-
利用已通过认证的用户权限购买商品
-
利用已通过认证的用户权限在留言板上发表言论
案例

防御
-
检查Referer字段
-
添加校验token
-
在 HTTP头中自定义属性并验证(改动很大,代价较高)
点击劫持
形式
- 利用透明按钮或链接做陷阱,覆盖在Web页面上,诱使用户点击
影响
- 用户在不知情的情况下,执行了非预期和破坏性的操作
案例

防御
-
设置X-FRAME-OPTIONS头
-
对于Firefox的用户,使用NoScript扩展
-
javascript禁止内嵌(有局限性)
会话劫持
形式
-
通过非正规的生成方法推测会话ID
-
通过窃听或XSS攻击盗取会话ID
-
通过会话固定攻击强行获取会话ID
影响
- 伪装成用户登录,进行破坏性操作
案例

防御
-
对cookie中设置httponly,防止会话id被窃取
-
验证HTTP头部信息,检测请求一致性
-
关闭透明化SessionID(不用Cookie存放SessionID,用URL传递)
-
定时更新Session名称
会话固定攻击
形式
- 预先准备好会话id,诱使用户使用和认证,实现身份窃取
影响
- 伪装成用户登录,进行破坏性操作
案例

防御
-
每当用户登陆的时候就进行重置sessionID
-
sessionID闲置过久时,进行重置sessionID
-
大部分防止会话劫持的方法对会话固定攻击同样有效(结合使用)
DoS攻击
形式
-
集中请求,造成服务器资源过载(服务器很难分辨正常请求和攻击请求)
-
攻击安全漏洞使服务停止
影响
- 造成web应用服务瘫痪
案例

防御
-
隐藏服务器的真实IP地址
-
过滤不必要的服务和端口
-
异常流量的清洗过滤
-
分布式集群防御
SQL注入攻击
形式
- 利用查询参数,干扰SQL执行
影响
-
非法查看或篡改数据库内的数据
-
规避认证
-
执行和数据库服务器业务关联的程序等
案例
数据库表结构

查询干扰

防御
-
不要使用动态SQL
-
不要将敏感数据保留在纯文本中
-
限制数据库权限和特权
-
避免直接向用户显示数据库错误
-
对访问数据库的Web应用程序使用Web应用程序防火墙(WAF)
-
定期测试与数据库交互的Web应用程序
-
将数据库更新为最新的可用修补程序
OS命令注入攻击
形式
- 利用命令参数,干扰OS执行
影响
- 窃取和破坏操作系统文件
案例

防御
-
采用白名单,或使用正则表达式进行过滤和校验
-
不要让用户可以直接控制eval()、system、exec、shell_exec等函数的参数
-
在进入执行命令函数和方法前,对变量进行过滤,对敏感字符进行转义
HTTP首部注入攻击
形式
- 通过在响应首部字段内插入换行,添加任意响应首部或主体
影响
-
设置任何Cookie信息
-
重定向至任意URL
-
显示任意的主体(HTTP响应截断攻击)
案例
首部注入攻击

响应截断攻击

防御
-
创建安全字符白名单,只接受白名单中的字符出现在HTTP响应头文件中
-
在将数据传送到http响应头之前,删除所有的换行符
-
使用服务器端验证机制,并禁止全部用户在任何与响应头有关的输入请求中使用回车换行符(即CRLF)
-
对用户的数据进行合法性校验,对特殊的字符进行编码
-
将用户数据放入uri之前应充分过滤,避免特殊字符
邮件首部注入攻击
形式
- 利用非法内容,实现恶意注入
影响
- 对任意邮件地址发送广告邮件或病毒邮件
案例

防御
-
使用正则表达式来过滤用用户提交的数据
-
使用外部组件和库,提供防范这个问题像 ZEND mail、PEAR mail和swift mailer
-
ModSecurity可以阻止服务器级别的电子邮件注入
文件目录遍历攻击
形式
- 通过非法截断其目录路径,实现文件访问
影响
- 非法浏览、篡改或删除Web服务器上的文件
案例

防御
-
合理配置Web服务器的目录权限
-
尽可能采用白名单的形式,验证所有的输入
-
对用户的输入进行验证,特别是路径替代字符如“../”和“~/”
-
当程序出错时,不要显示内部相关配置细节
-
净化数据:对用户传过来的文件名参数进行硬编码或统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝
-
使用chrooted环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,使其即使越权也在访问目录之内