为了账号安全,请及时绑定邮箱和手机立即绑定

接入层(SQL注入,上传),点击劫持,传输安全问题

标签:
安全

点击劫持

点击劫持,clickjacking,也被称为UI-覆盖攻击。

<iframe style="opacity:0"class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="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记录(对域名有管理权)
                图片描述

接入层

上传

  • 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
      图片描述
  • PHP

    • 关闭错误输出(判断注入是否正确)
    • 检查数据类型,参数
    • 对数据进行转义
    • 使用参数化查询
    • 使用ORM(对象关系映射)
      图片描述

NoSQL注入

  • 支持传入对象
  • 解决:
    • 检查数据类型
    • 类型转换
    • 写完整条件(验证对象内容)
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
1.6万
获赞与收藏
1807

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消