注意:文章原创作者:健人卢,转载请注明出处 https://blog.csdn.net/lujianhao_ios/article/details/79747327
本文中将涉及以下类型的安全漏洞
SSRF跨站服务端请求伪造
SSRF(Server-Side Request Forgery:服务请求伪造)是一种由攻击者构造,从而让服务端发起请求的一种安全漏洞,
它将一个可以发起网络请求的服务当作跳板来攻击其他服务,SSRF的攻击目标一般是内网。
当服务端提供了从其他服务器获取数据的功能(如:从指定URL地址获取网页文本内容、加载指定地址的图片、下载等),
但是没有对目标地址做过滤与限制时就会出现SSRF。
危害
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息
- 攻击运行在内网或本地的应用程序(比如溢出)
- 对内网web应用进行指纹识别,通过访问默认文件实现
- 攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等)
- 利用file协议读取本地文件等
解决方案
在此推荐一篇好文,在这篇文章中,非常详细的解释了SSRF攻击:
http://www.freebuf.com/articles/web/20407.html
CSRF请求伪造
CSRF攻击就是 攻击者利用受害者的身份,以受害者的名义发送恶意请求。与XSS(Cross-site scripting,跨站脚本攻击)不同的是,XSS的目的是获取用户的身份信息,攻击者窃取到的是用户的身份(session/cookie),而CSRF则是利用用户当前的身份去做一些未经过授权的操作。
危害
CSRF可以盗用受害者的身份,完成受害者在web浏览器有权限进行的任何操作,想想吧,能做的事情太多了。
- 以你的名义发送诈骗邮件,消息
- 用你的账号购买商品
- 用你的名义完成虚拟货币转账
- 泄露个人隐私
发生CSRF的场景如下:
- 用户小明在你的网站A上面登录了,A返回了一个session ID(使用cookie存储)
- 小明的浏览器保持着在A网站的登录状态,事实上几乎所有的网站都是这样做的,一般至少是用户关闭浏览器之前用户的会话是不会结束的
- 攻击者小强给小明发送了一个链接地址,小明打开了这个地址,查看了网页的内容
- 小明在打开这个地址的时候,这个页面已经自动的对网站A发送了一个请求,这时候因为A网站没有退出,因此只要请求的地址是A的就会携带A的cookie信息,也就是使用A与小明之间的会话
- 这时候A网站不知道这个请求其实是小强伪造的网页上发送的,而是误以为小明就是要这样操作,这样小强就可以随意的更改小明在A上的信息,以小明的身份在A网站上进行操作
利用CSRF攻击,主要包含两种方式,一种是基于GET请求方式的利用,另一种是基于POST请求方式的利用。
- 使用GET请求方式的利用是最简单的一种利用方式,其隐患的来源主要是由于在开发系统的时候没有按照HTTP动词的正确使用方式来使用造成的。对于GET请求来说,它所发起的请求应该是只读的,不允许对网站的任何内容进行修改。
- 相对于GET方式的利用,POST方式的利用更加复杂一些,难度也大了一些。攻击者需要伪造一个能够自动提交的表单来发送POST请求。
解决方案
- 漏洞本质原因是重要操作的所有参数都被攻击者猜测到
- 使用CSRF Token去防御:
Token的生成一定要足够随机,需要使用安全的随机数生成器生成Token
Token和Session绑定,用户A的Token只能用于A用户的Session
Token应该有生命周期,需要有超时机制 - 所有敏感的操作,比如收货地址修改、修改密码、修改个人资料,都使用POST方式
重要操作做二次认证,如短信认证,二次密码认证,验证码等,或CSRF TOKEN防范
SQL注入
SQL注入漏洞起因是由于开发人员创建动态数据库语句时拼接了来自用户的不可信的输入而导致的。SQL注入攻击能够读取数据库中的敏感数据,修改数据库(插入/更新/删除)数据等。
登陆场景
服务器运行:
String query = "SELECT * FROM users WHERE userName = '"+ 用户名变量 +
"' AND password = '"+ 密码变量 + "'";
ResultSet rs = stmt.execute(query);
攻击者通过添加恶意数据' or '1'='
,迫使服务器拼接并执行了恶意的SQL语句,那么攻击者可以通过这种方式登录任何用户的账户:
Select * from users where userName = '' or '1'='1' and password = '123';
解决方案
- 绑定变量,使用预编译语句
使用预编译语法,可以使SQL语句和变量绑定。预编译语句强制了开发人员首先定义SQL语句,然后对每个参数传递用户数据,以此分离数据与代码。 - 检查变量数据类型和格式
如果你的SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。 - 过滤特殊符号
对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。以PHP为例,通常是采用addslashes函数,它会在指定的预定义字符前添加反斜杠转义,这些预定义的字符是:单引号 (‘) 双引号 (“) 反斜杠 () NULL。
暴力破解/重放攻击
暴力破解
- 用户名枚举
- 账号登录
- 优惠券序列号
- 短信验证码
- 密码修改
顾名思义,暴力破解的原理就是使用攻击者自己的用户名和密码字典,一个一个去枚举,尝试是否能够登录。因为理论上来说,只要字典足够庞大,枚举总是能够成功的!
重放攻击
- 短信轰炸
- 邮箱轰炸
- 无限点赞
- 重复领取奖励
- 注册
解决方案
- 限制请求的间隔时长。 比如: 30 秒后, 才能进行第二次登录的请求
- 请求锁定。一旦用户请求次数(包括失败请求次数)超过设定的阈值,则在一段时间内拒绝对该IP用户发过来的验证请求
恶意文件上传
- 在许多场景中,提供了用户上传文件的功能,如上传身份证,用户头像等。
如果用户上传的图片的过程中,上传了涉及色情违法相关的图片,系统不能及时将图片识别并禁止,将造成不可预估的严重后果。 - 若在用户上传文件时,服务器没有对用户上传的文件进行验证,就可能会导致恶意文件被上传。
解决方案
- 在服务端,对上传文件的后缀名进行校验,只允许用户上传安全的文件名。
- 对上传文件音频、视频、图片分析识别,禁止黄赌毒在系统内的存留。
《Web安全测试常见漏洞解析(上)》链接地址 https://blog.csdn.net/lujianhao_ios/article/details/79733833