web十大漏洞
1.SQL 注入
原理:
SQL注入攻击行为可以描述为通过通过用户可控参数中注入SQL语法,破坏原有的SQL结构,达到编写程序时预料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的:
程序员在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
未对用户可控参数进行足够的过滤,便将参数内容拼接到SQL语句中。
攻击方式:
- 联合查询
- 报错注入
- 布尔盲注
- 延时注入
- 宽字节注入
- user-agent注入、referer注入、cookie注入,base64注入等。
- sqlmap工具的使用
防御:
- 避免采用拼接的方式构造SQL语句,可以采用预编译等技术;
- 对进入SQL语句的参数进行足够的过滤
- 部署安全设备,比如WAF(安全狗)
- 现在很多开放框架,基本上已经从技术上,解决SQL注入问题。
2.跨站脚本 (XSS)
原理:
攻击方式:
- <script>alert(/xss/);</script>
- <script>confirm(/xss/);</script>
- <script>confirm('xss');</script>
- <script>prompt('xss');</script>
防御:
- 输入过滤(白名单和黑名单)
- 输入验证
- 数据消毒
- 输出编码
3.文件上传
原理:
Web 开放了文件上传功能。
对文件上传功能没有做限制或限制不足。
任意文件上传。
攻击方式:
图片木马
大马
防御:
代码角度:
采用白名单策略,严格限制上传文件的后缀名;
上传文件重命名,尽量少的从客户端获取信息,包括文件名、文件类型、文件内容等;
文件内容检测;
进行二次渲染,过滤掉图片马中的恶意代码;
避免文件包含漏洞;
严格处理文件路径,防御00 截断漏洞;
检测Token 值,防止数据包重放。
业务角度:强口令策略,避免恶意攻击者登录网站后台;
尽量避免Web 用户修改上传白名单。
Web 容器角度:
及时更新Web 容器,防止解析漏洞产生。
禁用Web 容器PUT 方法。
系统角度:避开空格、点`.`、`::$DATA` 等windows 系统特性。
服务器部署:严格控制权限,执行权限与写权限分离。
建立单独的文件存储服务器,类似于站库分离。
4.文件读取
原理:
网站开启的文件读取功能,但是对文件读取没有做限制或限制不足,导致任意文件读取。
攻击方式:
?dir=/etc/passwd
?filepath=../../../../../../etc/passwd
?filename=c:\windows\system32\drivers\etc\hosts
防御:
- 使用白名单,让web 用户只能访问(读取),所需要的文件和路径。
- 不能有文件包含漏洞,目录遍历漏洞或其他漏洞。
- 限定文件访问范围
;php.ini open_basedir = c:\www\
5.文件包含
原理:
PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。
- 动态包含
- 被包含文件路径可控
攻击方式:
- 包含图片木马
- 读取敏感文件
- 读取 PHP 源码
- 执行 PHP 命令
- 包含图片马写 shell
防御:
- 尽量少的使用动态包含。
- 严格过滤被包含文件的路径。
- 将参数 allow_url_include 设置为 Off。
- 使用参数 open_basedir 限定文件访问范围。
- open_basedir = c:\phpstudy_2016\www\
6.暴力破解 / 弱口令
原理:
指用户设置的密码过于简单或者易于猜测,容易被攻击者通过尝试不同的组合进行暴力破解。
攻击方式:
burpsuite爆破
hydar爆破
medusha爆破
防御:
- 设置密码使用复杂的字符串,包括大小写字母、数字和特殊符号,并且长度要足够长。
- 使用两步验证
7.跨站请求伪造
原理:
攻击者可以伪造当前已经登录用户的身份访问正常的网站,执行非本意的操作。正常的网站,没有对来源请求进行严格的验证和过滤,导致攻击者可以伪造正常用户的请求,达到攻击的目的。
攻击方式:
防御:
验证Referer字段
二次验证:在关键操作之前,在输入密码或者验证码。
添加Token 验证:
HttpOnly:某些情况下禁止 JS 脚本访问
SameSite:Cookie 属性,浏览器自带安全机制。
8.服务端请求伪造
原理:
服务器接收用户侧URL 地址时,没有做限制或限制不足。
服务器直接返回URL 请求的结果,让攻击者可以知道更多细节。
攻击方式:
/ssrf_curl.php?url=http://localhost:80
防御:
过滤输入
- 限制协议,仅允许
http
或https
协议;- 限制IP,避免应用被用来获取内网数据,攻击内网;
- 限制端口,限制请求端口为常用端口。
过滤输出
- 过滤返回信息,只要不符合要求的,全部过滤;
- 统一错误信息,让攻击无法对内网信息进行判断。
9.反序列化漏洞
(暂时不会)