网络安全:攻击和防御练习(全战课), DDos压力测试

XSS 跨站脚本攻击:

Cross-site scripting(简称xss)跨站脚本。

一种网站的安全漏洞的攻击,代码注入攻击的一种。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

例子:

<script>
$.ajax({url: $(location).attr('href') + "/comments",method: "POST",data: {  comment : { content: "啊哈哈哈~你看看你! (σ゚∀゚)σ゚∀゚)σ゚∀゚)σ" } },dataType: "JSON"
})
</script>

url: window.location.href + "/comments" 生成"http://localhost:3000/events/1/comments"

这主要是因为在views/events/show.html.erb中:

<% raw comment.content%>这行代码中有raw()方法

这个方法会输出所有字符,不会放过tag标签。去掉raw()后,content两边加上引号变为字符串。

但这样就不能插入img等有用的tag了。这时可以使用sanitize()方法。

str.html_safe方法

让字符串不会被检查,即字符串中的特殊字符如tag,不会被脱逸,这样黑客可能利用这点插入<script>脚本。

因此需要谨慎使用html_safe()。

Rails 默认会脱逸 HTML 的关系,所以 Rails 对 XSS 是有了基本的防御

向div标签就会被脱逸,使用content_tag()可以指定某个标签不被脱逸。



跨站请求伪造 Cross-site request forgery

也称为one-click attack, 简称CSRF或XSRF.

是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的

例子:

在任意位置插入恶意代码:如

<img src="/events/92/comments/522/highlight"> 伪装成是用户发送的请求。

防御方法:添加校验token

token是在非get请求中使用。因此需要看代码中关于修改数据库的请求,是否是用了get请求,如果是必须改成非get请求。这样img就不能攻击了。

Rails默认带了protect_from_forgery with: :exception ,⚠️5.2隐藏了这行code。

1. 这样在 Rails 产生的表单form中,就有带这个参数 authenticity_token。表单的提交就会进行token验证

<form class="new_comment" id="new_comment" action="/events/2/comments" accept-charset="UTF-8" method="post">

  <input name="utf8" type="hidden" value="✓">

  <input type="hidden" name="authenticity_token" value="fMv3c2b177kqsy/LuDIARp+RaQWJtBHwfQkbEV8j5wqNVFFSBqvcotvkeV07hiQpWsQY1RIEdpVMvE4vysEHiA==">
  <div class="form-group">
    <label for="comment_content">Content</label>
    <textarea class="form-control" name="comment[content]" id="comment_content"></textarea>
  </div>

  <div class="form-group">
    <input type="submit" name="commit" value="Comment" class="btn btn-primary" data-disable-with="Comment">
  </div>
</form>

2. 如果是Rails.ajax中的请求:就会抓 meta 中的 csrf-token 参数附加到请求中。和form中的value是一样的。

Rails.ajax()方法,会抓取csrfToken。校验token。

在csrf.coffee中:

csrfToken = Rails.csrfToken = ->
   meta = document.querySelector('meta[name=csrf-token]')
 meta and meta.content

得到:

<meta name="csrf-token" content="fMv3c2b177kqsy/LuDIARp+RaQWJtBHwfQkbEV8j5wqNVFFSBqvcotvkeV07hiQpWsQY1RIEdpVMvE4vysEHiA==">

这样,黑客在其他网站上挖的坑因为没有这个authenticity_token或csrf-token(两者值一样),他发送的请求就会被挡住。



SQL Injection 数据库注入攻击structured query language.

@comments = @comments.where( "comments.content LIKE '%#{params[:keyword]}%'")

转换:

SELECT "comments".* FROM "comments" WHERE "comments"."event_id" = ? AND (comments.content LIKE '%这是搜寻关键字%') [["event_id", 95]]

如果收到的参数是

sorry'); DELETE * FROM comments; --

转换为sql就成了3句代码:

SELECT "comments".* FROM "comments" WHERE "comments"."event_id" = ? AND (comments.content LIKE '%sorry');DELETE * FROM comments;   --%') [["event_id", 95]]

第一句是查询,第二句就成了删除了!!, --后面代表了注释。

问题的原因:是查询语法使用string造成的。

这样单引号,\backslash就会起到了它的作用。

可以使用quote_string(s)方法来给一个string逸出单引号和反斜杠。

keyword = ActiveRecord::Base::connection.quote_string( params[:keyword] )

又因为查询语法where经常用到,所以增加了简单的写法, 自动逸出:

@comments = @comments.where( "comments.content LIKE ?", "%#{params[:keyword]}%")
@registrations = Registraion.where( :status => params[:status] ) # Hash 写法,这是安全的
@registrations = Registraion.where( "status = ?", params[:status] ) # Array 写法,这是安全的

但order等语法,没做自动逸出: (点击查看所有需要注意的sql语法)

可以使用白名单:

app/views/events/show.html.erb

<p>
<%= link_to "新留言在上", event_path(@event, :sort => "id DESC") %>
<%= link_to "舊留言在上", event_path(@event, :sort => "id ASC") %>
</p>

app/controllers/events_controller.rb

-  if params[:sort] # 本来这样有漏洞,你太相信用户传进来的参数了
+  if params[:sort] && ["id DESC", "id ASC"].include?(params[:sort])  # 只有白名单内的参数可以用@comments = @comments.order(params[:sort])end

Delete_all和 Destroy_all

都要小心使用!。它们都接受和find()方法相同的条件参数。参数可以是string, array, hash。但Strings不会被脱逸, 所以安全的写法是只用array, hash做参数。

Destroy_all因为会实例化记录并调用destroy方法并调用callbacks,相对比delete_all安全。

params[:admin] = "') OR 1=1--'"
User.destroy_all(["id = ? AND admin = '#{params[:admin]}", params[:id]])

生成:SELECT "users".* FROM "users" WHERE (id = NULL AND admin = '') OR 1=1--')

这会删除所有users。

Exists?()方法。

他用来判断一条记录是否存在。参数一般是一个主键。如果参数是array或hash,它被当成一个条件option。

为了安全,参数最好是一个integer或string。

Group()方法

他可以接受任意的SQL string。因此

params[:group] = "name UNION SELECT * FROM users"
User.where(:admin => false).group(params[:group])

生成 :

SELECT "users".* FROM "users" WHERE "users"."admin" = ? GROUP BY name UNION SELECT * FROM users

因为union了另外一条sql,因此返回所有的users。

Having()方法

容易遭到Sql injection攻击,因为它一般在一条rails查询语句的最后。

Joins方法

它可以接收一个关联数组或直接的SQl string。因此也可能会遭到注入攻击。

Select(*fields)方法

因为select子句一般在一个查询的开头,所以几乎任何sql都可以注入并生效。

params[:column] = "* FROM users WHERE admin = 't' ;"
User.select(params[:column])

Query

SELECT * FROM users WHERE admin = 't' ; FROM "users"

Result:返回的是一个关系对象。

#<ActiveRecord::Relation [#<User id: 84, name: "Admin", password: "supersecretpass", age: 45, admin: true, created_at: "2016-11-11 18:51:41", updated_at: "2016-11-11 18:51:41">]>

select有2种用法:

  1. 修改select声明,检索指定的fields。返回一个对象关系a relation object。可以在后面添加其他查询方法。
  2. 接受一个块{}, 类似Array#select。从数据库中得到一个array对象的集合。

Pluck(*column_names)

从一个table中选择指定的column。接受任何Sql。所以容易收到注入攻击。返回一个array对象集合。



大量赋值(Mass Assignment)的漏洞

rails5增加了strong parameters

params.require(:XXX).permit(:column_name, ...)限定了可以传入什么参数。

但也要谨慎使用。关键的列,即使隐藏,也可以通过url修改。所以应该留意一个column是否是要传入的,如果不是,就别加入白名单。

如果hacker在chrome浏览器的inspect上修改参数,

log上会显示:Unpermitted parameter: role



破解加密 Cookie-based Session(太复杂,只了解了一下)

 密匙不能外泄,如果外泄,必须马上更换。rails可以更换session的存储方法。


 Module: Base64 (defined in lib/base64.rb)

这个模块提供了binary data的编码和解码。

require "base64"enc   = Base64.encode64('Send reinforcements')# -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
plain = Base64.decode64(enc)# -> "Send reinforcements"

Module OpenSSl

这个模块提供了生成密码的算法。它包裹了OpenSSL library.



 DoS 拒绝服务攻击

denial of service attack, distributed denial of service attack分布拒绝服务攻击。

对自己的网站叫做压力测试

安装wrk:(https://github.com/wg/wrk)

执行 brew install wrk

执行 wrk -t12 -c400 -d30s http://localhost:3000/products

t:thread

c: connection, HTTP连接的总数,每个thread处理 connections/threads个连接。

d: duration of the test 例子: 2s, 2m, 2h

如何防御ddos攻击:

可以使用gem 'rack-attack'

# In config/application.rbconfig.middleware.use Rack::Attack

然后新建config/initializers/rack_attack.rb

把这个网址的案例代码粘体过来https://github.com/kickstarter/rack-attack/wiki/Example-Configuration

还有很多具体设置。如果真的面料大量ddos攻击,必须购买专业的网络防火墙。百度安全,云盾ddos高防IP.


安全分析工具

gem 'brakeman'(4800✨) 一个静态分享工具。检查Rails程序的安全弱点。

group :development dogem 'brakeman'
end

然后在程序根目录执行brakeman, 或者在非根目录执行 brakeman /path/to/rails/application

结果是参考,不代表一定是漏洞。需要逐条检查。

另外gem 也可能有安全漏洞,gem 'bundler-audit'可以检查(1700✨)


密码是如何存储的?

散列函数是一种能将数据变成摘要(digest)的算法,Hash function,散列算法,哈希函数。

通过把数据压缩成小的数字,让数据量变小,将数据的格式固定下来。

执行 irb,然后输入以下代码实验看看:

require 'digest'
Digest::SHA1.hexdigest '12345678'

得到 "7c222fb2927d828af22f592134e8932480637c0d"

散列函数有一些特性:

  1. 相同的数据,每次都会得到一样的摘要
  2. 是单向的,无法逆推:只知道摘要的话,没有办法能够透过计算知道本来的数据长怎样。例如给你 7c222fb2927d828af22f592134e8932480637c0d,没有算法可以逆推回来。除非有一个对照的字典

散列函数的用途:

可以用来比较两个文档是否相同,而无需实际比较文档内容:

1.git commit每次都会产生digest。不同的digest代表了不同的内容。

2.网络传档,也可以透过比较digest,看是否下载了完整的档案。

3.Rails中,Asset pipeline会将CSS和javascript压缩。档案就是透过散列函数产生的。

4.devise中的密码,也是使用散列函数生成的.

User model中,users table的实际字段是 t.string "encrypted_password"。用户注册时输入的密码在储存入数据库时会先变为散列函数,digest。数据库并不储存明码。

因此,数据库管理员也不会知道用户的真正密码。一旦数据库泄露,密码也安全。

判断一个网站是否使用明码做密码,可以请求忘记密码,看是否是邮寄给你源码还是重设。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch学习篇18_《检索技术核心20讲》LevelDB设计思想

目录 一些常见的设计思想以及基于LSM树的LevelDB是如何利用这些设计思想优化存储、检索效率的。 几种常见的设计思想 索引和数据分离减少磁盘IO读写分离分层思想 LevelDB的设计思想 读写分离设计分层设计与延迟合并LRU缓存加速检索 几种常见设计思想 索引与数据分离 索引…

LabVIEW Real-Time 的特点

LabVIEW Real-Time&#xff08;简称 LabVIEW RT&#xff09;是为实时系统设计的软件平台&#xff0c;结合 NI 硬件&#xff08;如 CompactRIO 和 PXI 系列&#xff09;&#xff0c;能够在高可靠性、高性能要求的场景中实现稳定的实时控制与数据处理。以下是它的主要用处和特点&…

使用脚本实现hadoop-yarn-flink自动化部署

本文使用脚本实现hadoop-yarn-flink的快速部署&#xff08;单机部署&#xff09;。 环境&#xff1a;①操作系统&#xff1a;CentOS 7.6&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 1.前置条件 把下面的的脚本保存到“pre-install.sh”文件&#x…

【JUC-Interrupt】中断相关概念

线程中断 一、相关概念二、API2.1、isInterrupted方法2.2、interrupted方法2.3、interrupt 三、总结&#xff1a; 一、相关概念 一个线程不应该由其他线程中断或停止&#xff0c;应该有线程自己来决定。 在Java中没有办法立即停止一个线程&#xff0c;因此提供了用于停止线程…

javascript基础学习

什么是伪代码 伪代码(Pseudocode)是一种介于自然语言和编程语言之间的算法描述方式。它使用类似自然语言的语句来描述程序的逻辑和流程,但又采用了编程语言中的一些结构和控制语句,如循环、条件判断等。 伪代码的目的是在不涉及具体编程语言语法细节的情况下,清晰地表达…

Django+Nginx+uwsgi网站Channels+redis+daphne多人在线聊天实现粘贴上传图片

在DjangoNginxuwsgi网站Channelsredisdaphne多人在线的基础上&#xff08;详见DjangoNginxuwsgi网站使用Channelsredisdaphne实现简单的多人在线聊天及消息存储功能-CSDN博客&#xff09;&#xff0c;实现在输入框粘贴或打开本地图片&#xff0c;上传到网站后返回图片路径&…

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷&#xff1a;循环引用问题 3. shared_ptr 和 unique_…

vulnhub靶场之breakout

empire靶场2 前言 靶机&#xff1a;breakout 攻击&#xff1a;kali 续接上个靶场empire1的继续学习 主机发现 使用arp-scan扫描或者直接查看虚拟机的ip地址 信息收集 使用nmap扫描 端口80apache 2.4.51开启smb服务的两个端口139、445&#xff0c;版本4.6.2两个http服务采…

今天你学C++了吗?——C++中的类与对象(第二集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

聚划算!一区算法!双分解+牛顿拉夫逊优化+深度学习!CEEMDAN-VMD-NRBO-Transformer多元时序预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CEEMDAN-Kmeans-VMD-NRBO-Transformer融合K均值聚类的数据双重分解牛顿-拉夫逊优化算法Transformer多元时间序列预测&#xff08;完整源码和数据&#xff09;运行环境Matlab2023b及以上。 2.CEEMDAN分解…

C++设计模式-中介者模式

动机(Motivation) 多个对象相互关联的情况&#xff0c;对象之间常常会维持一种复杂的引用关系&#xff0c;如果遇到一些需求的更改&#xff0c;这种直接的引用关系将面临不断的变化。在这种情况下&#xff0c;可以使用一种”中介对象“来管理对象间的关联关系&#xff0c;避免…

滑动窗口篇——如行云流水般的高效解法与智能之道(2)

前言&#xff1a; 上篇我们介绍了滑动窗口的含义并结合基础题型加以练习&#xff0c;本篇将以进阶难度的题目为索引&#xff0c;深化对于滑动窗口的运用与理解。 一. 将x减到0的最小操作数 题目链接&#xff1a;1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&am…

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks 学习笔记

1 Contributions 混合显式-隐式网络架构&#xff1a;提出了一种 Tri-plane 的3D表征方法&#xff0c;结合显式体素网格与隐式解码器的优点 速度快&#xff0c;内存效率高&#xff1b; 支持高分辨率生成&#xff0c;保持3D表征的灵活性和表达能力。与纯显式或隐式方法相比&#…

⭐ Unity 资源管理解决方案:Addressable_ Demo演示

一、使用Addressable插件的好处&#xff1a; 1.自动管理依赖关系 2.方便资源卸载 3.自带整合好的资源管理界面 4.支持远程资源加载和热更新 二、使用步骤 安装组件 1.创建资源分组 2.将资源加入资源组 3.打包资源 4.加载资源 三种方式可以加载 using System.Collections…

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现&#xff0c;那么接下来我们将进一步的学习二叉树&#xff0c;在此会先后学习到二叉搜索树、AVL树、红黑树&#xff1b;通过这些的学习将让我们更易于理解后面set、map、哈希等…

使用VisualStudio编写C++程序输出helloWorld

文章目录 1. C简介1.1 历史背景1.2 特点1.3 应用领域 2. 操作过程和代码2.1 打开Visual Studio(默认你下载了C的相关文件)2.2 创建新项目2.3 输入名字&#xff0c;创建2.4 右击源文件->添加->新建项2.5 命名好&#xff0c;进行添加2.6 输入代码2.7 输出结果 3. 总结 1. C…

万能的无人机锁定目标投放程序

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

LayaBox1.8.4实现UV滚动

实现思路&#xff1a; 在片元着色器采样时&#xff0c;增加一个随时间变化的偏移值&#xff0c;由于uv是一个二维向量所以加的偏移值也需要一个二维向量。注意&#xff1a;在Laya的 shader中除了0&#xff0c;输入其它数字必须输入带有小数的数字&#xff0c;否则报错 。 &quo…

Next.js- App Router 概览

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 一&#xff1a;App Router与Page Router 在 v13 版本中&#xff0c;Next.js 引入了一个基于 React 服务器组件 构建的新的 App Router&#xff0c;而在这之前&#xff0c;Next.js 使用的是Page Router。 目录结构 pages …

milvus es

ES 与 Milvus 结合实现高效文档搜索的实战指南 原文链接 目录 背景介绍场景与效果概述架构对比与问题分析Milvus 向量搜索架构ES Milvus 搜索架构详细流程解析Milvus 搜索配置详解ES 搜索策略与 DSL 配置结果合并与排序策略总结与未来优化 1. 背景介绍 随着团队和公司的发…