一、SQL注入
Web服务器执行攻击者期望的SQL语句,以便得到数据库中的感兴趣的数据或对数据库进行增删改查操作。
SQL注入的常规套路在于将SQL语句放置于Form表单或请求参数之中提交到后端服务器,后端服务器如果未做输入安全校验,直接将变量取出进行数据库查询,则极易中招。
案例1:据用户ID获取用户信息的接口
- 后端的SQL语句一般是这样:
select name,[...] from t_user whereid=$id
- 前端的请求是这样:
GET xx/userinfo?id=1%20or%201=1
其中请求参数id转义后就是1 or 1=1,如果后端不做安全过滤直接提交数据库查询, - SQL语句就变成了:
select name,[...] from t_user whereid=1or1=1
其结果是把用户表中的所有数据全部查出,达到了黑客泄露数据的目的。
案例2:无限制登录
- 登陆页面输入用户名:admin' –,密码随意输入
- 后台的SQL语句会由原来的SELECT * FROM user WHERE username='admin' AND psw='password';就会变为SELECT * FROM user WHERE username='admin' –' AND psw='xxxx';
- 这就相当于密码部分被注释了,成了万能不需要密码登陆了。
- 严格限制Web应用的数据库操作权限,如权限仅够满足工作即可
- 后端代码检查输入的数据是否安全合规,如正则匹配
- 对入库的特殊字符进行转义处理或者编码转换
- 所有的查询语句建议是同数据库提供的参数化查询接口
二、XSS 攻击(跨站脚本攻击)
将可执行的前端脚本代码(js/ts等)植入到网页中,也就是说攻击者让你的浏览器执行他写的JS代码。当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或者其他侵犯用户安全隐私的目的。
利用虚假输入表单骗取用户个人信息;利用脚本切取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求;显示伪造的文章或图片。XSS攻击可分为持久型(存储型XSS)和非持久型(反射型XSS)
- 转义字符:用户的输入永远不可信任,对引号、尖括号、斜杠、进行转义
function escape(str) { str = str.replace(/&/g, '&'); str = str.replace(/</g, '<'); str = str.replace(/>/g, '>'); str = str.replace(/"/g, '&quto;'); str = str.replace(/'/g, "'"); str = str.replace(/`/g, '`'); str = str.replace(/\//g, '/'); str = str.replace(/<\/script>/,'') return str }
- CSP内容安全策略(CSP,Content Security Policy):本质上就是建立白名单,配置规则告诉浏览器那些资源可以加载和执行
我们可以通过这种方式来尽量减少XSS攻击
Content-Security-Policy: default-src 'self' 只允许加载本站资源 Content-security-Policy: img-src https: 只允许加载https协议图片 Content-security-Policy:child-src 'none' 不允许加载任何来源框架
- HttpOnly Cookie:预防XSS攻击窃取用户cookie最有效的防御手段,Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端javaScript窃取,保护用户cookie信息
设置方法:response.addHeader('Set-Cookie','uid=12;path=/; HttpOnly')
- HEAD ctx.set('X-XSS-Protection',0) //禁止XSS过滤
- 0:禁止XSS过滤
- 1:启用XSS过滤(通常浏览器是默认的)
三、CSRF 攻击
利用用户登录状态,完成其他网站的业务请求,盗取用户资金(转账,消费),冒充用户发帖背锅,损害网站声誉。
CSRF,跨站请求伪造,在打开A网站的情况下,另开Tab页面打开恶意网站B,此时在B页面的“唆使”下,浏览器发起一个对网站A的HTTP请求。
- 二个条件
- 受害者已经登录到了目标网站并且没有退出(保持登录状态)
- 受害者访问了攻击者发布的链接或者表单
- 禁止第三方网站带cookie,IOS目前已经默认阻止了
Referer Check ----Https不发送referer app.use(async(ctx,next)=>{ koa中间件实现 await next() const referer = ctx.request.header.referer })
- Same Site:对Cookie设置Same Site属性,不随着跨域请求发送;
- Referer Check:通过检查HTTP包头Referer的值是不是这个页面的,来判断是不是CSRF攻击;
- Anti CSRF Token:比较完善的解决方案,即在发送请求时在HTTP请求总以参数的形式加入一个随机产生的Token,并在服务器建立一个拦截器来验证这个Token,服务器读取浏览器当前域cookie中这个token值,进行校验。
- 验证码:应用程序和用户交互过程中,特别是账户交易这种核心步骤,强制用户输入验证码,才能完成最终的请求,这样能够很好的遏制CSRF攻击
四、ddos 攻击
DDOS(分布式拒绝服务攻击)拒绝攻击服务顾名思义,让服务不可用,常用于攻击对外提供服务的服务器。
攻击者不断地提出服务请求,让合法用户的请求无法及时处理,这就是 DoS 攻击。攻击者使用多台计算机或者计算机集群进行 DoS 攻击,就是 DDo。S 攻击是一大类攻击的总称,它有几十个类型,新的攻击方法还不断发明出来,网站运行各个环节,都可以是攻击目标,只要把一个环节攻破,使得整个流程、跑不起来,就得到瘫痪服务的目的。
现在的服务器早已不是一台服务器那么简单,你访问一个www.baidu.com的域名,背后是数不清的cdn节点,数不清的Web服务器。这种情况下,还想靠单台计算机去试图让一个网络服务满载,兼职异想天开。
- 备份网站:备份网站不一定是全功能的,如果能做到全静态浏览,就能满足需求,最低限度应该可以显示公告,告诉用户,网站出看问题,正在全力抢修
- HTTP请求拦截:硬件,服务器,防火墙,带宽扩容,CDN ,提高犯罪成本
五、DNS劫持
顾名思义,DNS服务器(DNS解析各个步骤)被篡改,修改了域名解析的结果,使得访问的不是预期的ip。
- 互联网公司准备两个以上的域名,一旦黑客进行DNS攻击,用户还可以访问另一个域名。
- 手动修改DNS
- 修改路由器密码
六、JSON 劫持
JSON是一种轻量级的数据交换格式,而劫持就是对数据进行窃取(或者应该称为打劫、拦截比较合适)。恶意攻击者通过某些特定的手段,将本应该返回给用户的JSON数据进行拦截,转而将数据发送回给恶意攻击者,这就是JSON劫持的大概含义。一般来说进行劫持的JSON数据都是包含敏感信息或者有价值的数据。
一些web应用会把一些敏感数据以json的形式返回到前端,如果仅仅通过cookie来判断请求是否合法,那么就可以利用类似csrf的手段,向目标服务器发送请求,以获得敏感数据。
比如下面的链接在已登录的情况下会返回json格式的用户信息:
攻击者可以在自己的虚假页面中,加入如下标签:<script src="http://www.test.com/userinfo"></script>
如果当前浏览器已经登录了www.test.com,并且cookie未过期,然后访问了攻击者的虚假页面,那么该页面就可以拿到json形式的用户敏感信息,因为script标签会自动解析json数据,生成对应的js对象。然后再通过Object.prototype.__defineSetter__
这个函数来触发自己的恶意代码。
但是这个函数在当前的新版本chrome和firefox中都已经失效了。
七、点击劫持
点击劫持是一种视觉欺骗的攻击手段,攻击者将需要攻击的网站通过iframe嵌套方式嵌入自己的网页中,并将iframe设置为透明的,在页面中透露出一个按钮诱导用户点击 通过用于各种网站,使用iframe技术,图片点几进入一个其他网址,导致用户信息泄密
用户在登陆A网站的系统后,,被攻击者诱惑打开第三方网站,而第三方网站通过iframe引入了A网站的页面内容,用户在第三方网站中点击某个存在点击劫持的按钮,实际上就是点击了A网站的按钮。
点击劫持的特点:隐蔽性较高,骗取用户操作;“UI-覆盖攻击”;利用iframe或者其它标签的属性。
- X-FRAME-OPTIONS:X-FRAME-OPTIONS 是一个HTTP响应头,在现代浏览器有一个很好的支持。
参数:- DENY:表示页面不允许通过iframe的方式展示;
- SAMEORIGIN:表示页面可以在相同域名下通过iframe的方式展示;
- ALLOW-FROM:表示页面可以在指定来源的iframe中展示。
- JavaScript防御:当通过ifrmae的方式加载页面时,攻击者的网页直接不显示所有内容了。
<style id="click-jack"> html{ display: none; } </style> <script> if(self == top) { var style = document.getElementById('click-jack') document.body.removeChild(style) } else { top.location = self.location } </script>
八、OS命令注入
- 与sql注入类似,只是OS命令是针对操作系统的。
- OS命令注入攻击指通过Web应用,执行非法的操作系统命令达到攻击的目的。
- 主要在能调用shell函数的地方就存在被攻击的风险。
- OS命令注入攻击可以向shell发送命令,让操作系统的命令行启动程序、安装程序等。
以node.js为例,假如在接口中需要从github下载用户指定的repo const exec = require('mz/child_process').exec; let params = {/*用户输入的参数*/} exec(`git clone ${params.repo} /some/path`) 如果传入参数是会怎么样 https://github.com/xx/xx.git && rm -fr /* &&
- 后端对前端提交的内容进行规则限定,如正则表达式
- 点调用系统命令前对所有传入参数进行命令行参数转义过滤
- 不要直接拼接命令语句,最好借助一些工作做拼接、转义处理,如Node.js的shell-escape npm包
九、URL跳转漏洞
URL跳转漏洞是指借助未验证的URL跳转,将应用程序引导到不安全的第三方区域,从而导致的安全问题。
黑客利用URL跳转漏洞来诱导安全意识低的用户点击,导致用户信息泄露或者资金流失。其原理是黑客构建恶意链接,发送到QQ群、微信群或者贴吧/论坛中,安全意识低的用户点击后,经过服务器或浏览器解析后后,跳转到恶意的网站中,简单来说就是钓鱼网站。
实现方式:Header跳转、JavaScript跳转、meta标签跳转。
Referer的限制
加入有效性验证Token
这个一般针对密码而言,弱密码(Weak Password)很容易被别人(对你很了解的人等)猜到或被破解工具暴力破解。
解决方案
密码复杂度要足够大,也要足够隐蔽 限制尝试次数
HTTP/1.1(RFC2616)规范定义了 HTTP TRACE 方法,主要是用于客户端通过向 Web 服务器提交 TRACE 请求来进行测试或获得诊断信息。
当 Web 服务器启用 TRACE 时,提交的请求头会在服务器响应的内容(Body)中完整的返回,其中 HTTP 头很可能包括 Session Token、Cookies 或其它认证信息。攻击者可以利用此漏洞来欺骗合法用户并得到他们的私人信息。
解决方案
禁用 HTTP TRACE 方法。
由于 Web 服务器或应用程序没有正确处理一些特殊请求,泄露 Web 服务器的一些敏感信息,如用户名、密码、源代码、服务器信息、配置信息等。
解决方案
应用程序报错时,不对外产生调试信息 过滤用户提交的数据与特殊字符 保证源代码、服务器配置的安全
攻击者向 Web 服务器发送请求,通过在 URL 中或在有特殊意义的目录中附加 ../、或者附加 ../ 的一些变形(如 ..\ 或 ..// 甚至其编码),导致攻击者能够访问未授权的目录,以及在 Web 服务器的根目录以外执行命令。
如果对文件上传路径变量过滤不严,并且对用户上传的文件后缀以及文件类型限制不严,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。
解决方案
在开发网站及应用程序过程中,需严格限制和校验上传的文件,禁止上传恶意代码的文件 限制相关目录的执行权限,防范 webshell 攻击
SSLStrip 攻击
OpenSSL Heartbleed 安全漏洞
CCS 注入漏洞
证书有效性验证漏洞
一般业务漏洞是跟具体的应用程序相关,比如参数篡改(连续编号 ID / 订单、1 元支付)、重放攻击(伪装支付)、权限控制(越权操作)等。
原文链接:https://blog.csdn.net/weixin_42232156/article/details/121693964
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/18134