Go语言基础之网站常见安全漏洞(上) | 青训营

47 阅读4分钟

青训营笔记9之网站常见安全漏洞(上)

一、简单了解网络漏洞

1、一个网站的基本构成

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

关系示意图如下 image.png

2、安全事件

  1. 数据泄露:公共卫生系统数据大规模泄露导致百万人受其影响,个人信息泄露
  2. 服务瘫痪:航空公司系统被黑客攻击导致瘫痪,受损巨大
  3. 成果失窃:入侵者窃取企业机密数据并泄露信息
  4. 系统劫持:网络攻击导致某国导弹袭击警报持续响彻云霄

3、网站攻击的意图

  1. 政治目的:出于政治目的实施黑客攻击。可能涉及窃取关键系统的机密数据,破坏关键系统正常运行
  2. 经济目的:网站数据具有很高的经济价值,攻击者通过万盏漏洞违法获取数据并进行售卖
  3. 竞争目的:同类厂商之间可能由于竞争原因,对竞品网站进行一些攻击,以达到让对方站点无法运行的目的
  4. 炫技、泄愤:用攻击对方网站的方式彰显自己的技术实力,或者对一些仇恨的系统发起攻击

4、学习目的

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

5、漏洞的分类

image.png

二、服务端漏洞

1、SQL注入

1.1、SQL注入错误

定义:攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。

例如:错误使用语言框架,或者是语言框架本身存在安全问题。使用Mybatis-plus的危险函数,比如inSql,支持直接SQL拼接,存在SQL注入风险

//通过在用户名处传入参数 ' or 1=1--进行万能密码登陆
SELECT username,password FROM users WHERE username = 'textvalue 'or 1=1-- '
AND password = 'textvalue2'
//输入字符:
//        formusr = 'or 1=1 -- 
//        formpwd = anything
//实际查询代码

1.2、Golang常见错误写法

业务场景经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到Order则会产生SQL注入,假设GORM语句为:db.Order(param).Find(&products)

//正常情况用户输入维度字段即可实现自定义排序,如:
param: code
SELECT*FROM`products`WHERE`products`.`deleted_at`IS NULL ORDER BY code
//但是攻击者可以输入以下SQL语句,改变原始SQL语义
param: if(1,sleep(10),'code')
SELECT*FROM`products`WHERE`products`.`deleted_at`IS NULL ORDER BY if(1,sleep(10),'code')

1.3、防护方式:

  1. 尽量不要基于DB的Raw方法拼接构造SQL语句,而是要使用预编译、ORM框架
  2. 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致的SQL注入问题
  3. 在复杂场景一定要使用拼接SQL,需要对外输出进行转义

2、越权漏洞 *

2.1 未授权。 解决方案:只要输入正确的网址就可以直接访问,例如/admin默认是登录,登录后跳转到user.php,然后你直接访问user.php,发现你直接有后台权限

2.2 水平越权: 同一级别用户本不能操作对方个人信息,但是若用户越权操作其他用户的个人信息情况则称为平行越权操作

2.3 垂直越权: 权限较低的用户去执行高权限用户的操作。

2.4 修复建议: 越权访问漏洞产生的主要原因是因为没有对用户的身份做判断和控制,防护这种漏洞是可以使用session来控制,例如用户在登录成功后, 将用户名写入session中,当用户查看个人信息时,通过session中取出username,而不是从GET或者POST中取到username,那么此时的username就不会被篡改了

注:当访问服务器某个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做SESSION

3、SSPF

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

  • 服务端流程:服务端请求stockApi,获取结果返回
  • 攻击者:将stockApi参数改为内网地址,访问内网资源
  • 防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址。