08月22, 2017

web安全笔记(3)

接前两篇:

接入层注入问题

a. 关系型数据库

  • 存放结构化数据
  • 可高效操作大量数据
  • 方便处理数据之间的关联关系
  • 常见:access/sqlite/mysql/mysql server

b. SQL语言

  • select * from table where id = 1
  • 标准化
  • 类似自然语言的描述性语言
  • 用于关系型数据库
  • 可完成增、删、改、查以及各种复杂的数据库操作

c. SQL注入

select * from table where id = ${id};

select * from table where id = 1 or 1 = 1

比如:

localhost:1521/post/10" and 1=0 and ""="

d. 一些神奇的SQL语法

  • select * from table where id = "10" and 1=0
  • select * from table where id = "10" or 1=1
  • select * from table where id = "10" and mid(version(), 1, 1) = 5 #检测mysql的版本
  • select 1,2,3 from table
  • select id,1,2,3 from table
  • select * from table union select 1,2,3 from table2
  • select * from table where mid(username, 1, 1) = "t"

e. SQL注入危害

  • 猜解密码
  • 获取数据
  • 删库删表
  • 拖库

f. SQL注入防御

  • 关闭错误输出
  • 检查数据类型
  • 对数据进行转义(有可能覆盖不了所有的情况)
const posts = await query(
    `select * from post where id = ${connection.escape(id)}`
)
  • 使用参数化查询

使用mysql2的包模块

const query = bluebird.promisify(connection.execute.bind(connection));
const posts = await query(
    `select * from post where id = ?`, [id]
)

使用前:(wireshark软件)

使用后:

  • 使用ORM(对象关系映射)

使用sequelize的包模块

// sequelize.js
var Sequelize = require('sequelize');

var sequelize = new Sequelize({
    host: 'localhost',
    database: 'safety',
    username: 'root',
    password: '******',
    define: {
        freezeTableName: true
    }
})

module.exports = sequelize;
// post.js
var sequelize = require("./sequelize");
var Sequelize = require("sequelize");

var Post = sequelize.define('post', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true
    },
    title: Sequelize.STRING(256),
    imgUrl: Sequelize.STRING(256),
    content: Sequelize.TEXT
}, {
    tableName: 'post'
})

module.exports = Post;
// 使用
const Post = require('../models/post');
let post = await Post.findById(id);

g. NoSQL注入和防御

mongoose.findOne({
     username: username,
     password:  password
})

这里的password如果写成了如下的方式:

{
     "&gt": "0"
}

表示password > 0,就可以通过了。

防御:

  • 检查数据类型
  • 类型转换
  • 写完整条件

接入层上传问题

a. 上传问题

  • 上传文件
  • 再次访问上传的文件
  • 上传的文件被当成程序解析

b. 上传问题防御

  • 限制上传后缀
  • 文件类型检查
  • 文件内容检查(检查头,但判断php就不太容易了,因为它可以和HTML混写)
  • 程序输出(原样输出,不做执行)
  • 权限控制 - 可写可执行互斥

社会工程学和信息泄露

a. 信息泄露

  • 泄露系统敏感信息
  • 泄露用户敏感信息
  • 泄露用户密码

b. 信息泄露的途径

  • 错误信息失控
  • SQL注入
  • 水平权限控制不当(A用户可以访问B用户的数据)
  • XSS/CSRF
  • ...

c. 社会工程学

  • 你的身份由你掌握的资料确定
  • 别人掌握了你的资料
  • 别人伪装成你的身份
  • 利用你的身份干坏事
  • ...

d. 社会工程学案例

  • 电信诈骗(徐玉玉案
  • 伪装公检法
  • QQ视频借钱
  • 微信伪装好友

e. OAuth思想

  • 一切行为由用户授权
  • 授权行为不泄露敏感信息
  • 授权会过期

f. 利用OAuth思想防止资料泄露

将敏感信息从业务中剥离出来,业务通过”票据“的方式和敏感打交道。

  • 用户授权读取资料
  • 无授权的资料不可读取
  • 不允许批量获取数据
  • 数据接口可风控审计

其他安全问题

  • 拒绝DOS
  • 重放攻击

a. 拒绝DOS

  • 模拟正常用户
  • 大量占用服务器资源
  • 无法服务正常用户

方式:

  • TCP半连接
  • HTTP连接
  • DNS

b. 大规模分布式拒绝服务攻击DDOS

  • 流量可达几十到上百G
  • 分布式(肉鸡、代理)
  • 极难防御

c. DOS攻击防御

  • 防火墙
  • 交换机、路由器
  • 流量清洗
  • 高防IP(据说要很多money)

d. DOS攻击预防

  • 避免重逻辑业务(有重逻辑的,是不是能拆到另外一台服务器)
  • 快速失败快速返回(而不是总是重试,不断地失败,导致任务不断地堆积)
  • 防雪崩机制
  • 有损服务
  • CDN

e. 重放攻击

  • 请求被窃听或记录
  • 再次发起相同的请求
  • 产生意外的结果

从而有可能导致:

  • 用户被多次消费
  • 用户登录态被盗取
  • 多次抽奖

f. 重放攻击防御

  • 加密(HTTPS)
  • 时间戳
  • token(session)
  • nonce
  • 签名

最后的吐嘈

听完这个课程,收获很多,对web安全有了更深的了解,建议大家可以花钱去买一下这个课程

昨天不小心删除了这篇文章,却发现这个操作是物理删除,并没有说数据还在,但某个字段从1变为0了。。略坑,我又花了半个多小时重新凭着记忆输入。无语。。。

本文链接:www.my-fe.pub/post/web-safety-note-3.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。