网站常见安全漏洞 | 青训营

116 阅读2分钟

一、网站基本组成及漏洞定义

1.网站的基本组成

前端:JavaScript/vue/react
网关:nginx
后端:Go/Java/Node
前后端交互:HTTP/WebSocket

2.安全事件:数据泄露、服务瘫痪、成果失窃、系统劫持等等

3.课程的学习目的

蓝军:反向验证企业内部安全现状,以攻促防
红军:系统建设时候帮助企业提前规避漏洞

4.漏洞的分类

服务端漏洞:SQL、RCE/命令注入、SSRF、文件上传等等
客户端漏洞:XSS、CSRF、点击劫持等等

二、服务端漏洞

1.第三方组件漏洞

当前,很多网站都会使用第三方特定JavaScript库的方式来增强网站的显示应用功能,通常情况下,这种嵌入到网站中的库可以方便直接地从第三方服务提供商的域中加载,实现对当前网站的优化和功能增强。然而,这种嵌入到很多网站中的第三方库往往会是一个致命的攻击面,可以导致嵌入网站更容易遭受一些潜在攻击。

防护方式:针对Java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞。

2.SQL注入

SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些SQL语句关键字(比如:SELECT、DROP等等),这些SQL语句就可以在数据库写入或读取数据时得到执行。

案例

1.[Java]错误使用语言框架,或语言框架本身存在安全问题:使用My-batis-plus的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险。
2.[Java]Mybatis使用[$]构建SQL模板
3.Golang常见错误写法:业务场景经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到Order,则会产生SQL注入。

防护方式:

(1)尽量不要基于DB的Raw方法拼接构造SQL语句,而应该使用预编译、ORM框架。

(2)使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致SQL注入问题。

(3)在复杂场景一定要使用拼接SQL,需要对外部输入进行转义。

3.命令执行

代码中遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接,如果命令拼接没有做好安全过滤,那么将会导致命令注入风险,服务器权限将会被控制。

防护方式:

(1)对动态的值尽可能设置白名单进行验证。

(2)如果某些位置无法白名单,需要尝试对数据类型进行校验。

(3)特殊字符黑名单的过滤,或者转义。

4.越权漏洞

(1)水平越权

黑灰产场景:订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderId获取其他用户的订单信息

防护方式:涉及资源id尽量不要使用短id(遍历难度较小),同时最重要的一定要最好资源属主校验

(2)垂直越权

普通用户访问:前端直接拦截,提示无权限
管理员用户访问:判定是管理员,可以直接访问

黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。

防护方式:如果是简单场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。

5.SSRF

SSRF又称服务端请求伪造攻击,指攻击者利用后端服务器为跳板,让后端服务向非预期网络地址(主要指内网地址)发出恶意请求,获取敏感信息或执行恶意操作。

服务端流程:服务端请求stockApi,获取结果返回。
攻击者:将stockApi参数改为内网地址,访问内网资源。
URL:改为http://localhost/admin,直接访问内网页面

防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址。

6.文件上传漏洞

找到公开的上传点(如视频创作/文章创作/客服反馈等),上传恶意文件(恶意视频、图片),获取图片url,然后直接分享url至外部恶意网站或QQ/微信群。

防护方式:

(1)限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式。

(2)站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储。

(3)防止图床:对图片访问链接进行限制,包括时间限制,访问身份限制等。

三、客户端漏洞

1.开放重定向

某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点。

危害:钓鱼攻击。

修复方案:对重定向严格进行白名单控制,并正确校验匹配白名单。

2.跨站脚本(XSS)攻击

(1)概念:本质是一种Script代码注入,攻击者往目标Web页面插入恶意Script代码,当用户访问页面(有客户端时需要交互)时,嵌入其中Web里面的Script代码会被之星,从而达到恶意攻击用户的目的。

(2)场景:反射型、存储型、Dom型

(3)危害:窃取用户敏感信息,以用户身份执行敏感操作。

(4)漏洞利用步骤:

Step1:构造恶意链接,将username设置为payload。
Step2:攻击者通过网站反馈入口,向管理员/运营人员发送恶意链接。
Step3:攻击者的服务器成功收到管理员/运营人员的Session Cookie。
Step4:浏览器替换cookie为管理员的,获取管理员权限。

(5)防护方法:

①输入过滤:对输入的特殊字符进行拦截,禁止前端提交特殊字符。

②输出过滤: a.当字符输出到Dom时,对危险字符进行html encode,避免XSS。 b.使用vue/react等框架的时候,避免使用危险指令,而应该使用安全指令。v-html/v-text

③富文本场景:比如文章发布场景,本身需要提供富文本功能,这时候需要严格限制tag和attribute,可以在代码层面做白名单或者黑名单。

④CSP:用于缓解XSS,理念是对当前站点允许加载什么样的资源,发送什么请求能进行限制。

3.CSRF

(1)概念:允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。

(2)危害:用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等。

(3)漏洞利用步骤:

Step1:将更改Email的请求生成CSRF表单,并构造钓鱼链接。
Step2:发送链接给其他用户。
Step3:用户点击链接后成功执行email更改操作。

(4)防护方式:核心是判断需求来源(例如:CSRF tokens、SameSite cookies、Refer-based validation等等)

4.点击劫持(clickjacking)

(1)概念:一种在网页中将恶意代码等隐藏在看似无害或者存在诱导的内容(如按钮)之下,并诱使用户点击手段,用户点击后往往会执行一些非预期的操作。

(2)漏洞利用步骤

Step1:参考如下代码构造钓鱼页面链接。
Step2:发送链接给其他用户。
Step3:用户访问链接,点击[Win 300$]时候,实际是点击[Delete Account]

(3)防护方式:核心是不让非预期的网站iframe我的站点(例如:X-Frame-Options、CSP等等)

四、总结及强调网络安全法

1.网站运营者:应当采取技术措施和其他必要措施,确保其收集的个人信息安全,防止信息泄露、损毁、丢失。在发生或可能发生个人信息泄露、损毁、丢失的情况时,应当立即采取补救措施,按规定及时告知用户并向有关主管部门报告。

2.组织/个人:任何个人和组织不得窃取或以其他非法方式获取个人信息,不得非法出售或非法向他人提供个人信息。