点击劫持
点击劫持,clickjacking,也被称为UI-覆盖攻击。
<iframe style="opacity:0"src="http://localhost:1521/post/15" width="800" height="600"></iframe>
- 用户亲手操作
- 用户不知情
- 盗取用户资金(转账、消费)
- 获取用户敏感信息
解决方案
- 判断当前的窗口有没有被嵌套在别的窗口中
top == window
top.location == window.location
if(top.location != window.location){
top.location = window.location;
}
- H5新增属性,sandbox可以禁止脚本的运行
sandbox="allow-forms"
- X-FRAME-OPTIONS禁止内嵌
ctx.set('X-FRAME-OPTIONS','DENY');
- 其他辅助:加验证码
- 当小偷的投入比利益更大的,估计没有小偷会这样干。
- PHP:
header('X-FRAME-OPTIONS','DENY');
传输安全问题
HTTP传输明文带来的窃听
- 传输链路窃听篡改
- 浏览器-代理服务器-链路-服务器
- tracert
- 因为localhost是环形链路,所以使用AnyProxy代理
- HTTP窃听
- 用户名密码
- 传输敏感信息
- 个人资料(银行卡……)
- HTTP篡改
- 插入广告
- 重定向网站
- 无法防御XSS和CSRF
- 运营商和局域网劫持
- 解决方案
- TLS(SSL)加密
- 但是TLS可以中间人攻击的(条件:加密会话的初始化阶段)
- 如何确认服务器身份?
- CA(证书颁发机构)
- 前提:
- 证书无法伪造
- 证书私钥不能被泄露
- 域名管理权不能泄露
- CA坚守原则(一定要验证证书,不能乱发证书)
- Let’s Encrypt的最大的意义就是推动基础DV HTTPS证书的普及,换句话说就是,推动HTTPS的普及。
- 查看证书是否受信任
- Mac keycha
- Win mmc
- 验证返回指定网站内容
- 设置DNS记录(对域名有管理权)
- 设置DNS记录(对域名有管理权)
- TLS(SSL)加密
接入层
上传
- PHP
- 上传文件
- 再次访问上传的文件
- 上传的文件被当成程序解析
方案
- 限制上传后缀
- 可欺骗,改后缀
- 文件类型检查
- 可欺骗(浏览器检查,可以使用其他工具上传)
- 文件内容检查(文件头信息)
- 可欺骗(先把头信息写入,后面写程序)
- 程序输出(读,写,性能有影响)
- fs.readFileSync(filepath);
- 权限控制-可写可执行互斥
- 可写不可执行(PHP)
- 低权限用户
SQL注入
- 关系型数据库(access(mdd),sqlite(嵌入式设备.db),mysql,mssql server)
- 存放结构化数据
- 可高效操作大量数据
- 方便处理数据之间的关联关系
select*from table where id=$(id); 1 or 1 = 1
select*from table where id =1 or 1=1;
select*from user where username='TooBug'and password='1'or '1'='1'
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 猜版本号
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" 利用mid猜测密码
爆密码,账号,猜解字段长度
- 判断注入(数据变逻辑)
- 猜解密码(工具)
- 获取数据
- 删库删表
- 脱裤
and 1=1
and 1=0
and 1=1 and ""="
and 1=0 and ""="
返回不同结果
方案
-
关闭错误输出(判断注入是否正确)
-
检查数据类型,参数(parseInt())
-
对数据进行转义(npm install mysql 手工麻烦)
-
使用参数化查询(npm install mysql2)
-
使用ORM(对象关系映射)
- npm install sequelize
- npm install sequelize
-
PHP
- 关闭错误输出(判断注入是否正确)
- 检查数据类型,参数
- 对数据进行转义
- 使用参数化查询
- 使用ORM(对象关系映射)
NoSQL注入
- 支持传入对象
- 解决:
- 检查数据类型
- 类型转换
- 写完整条件(验证对象内容)