XSS漏洞原理及攻击

XSS漏洞原理

XSS介绍

XSS漏洞介绍

1、 跨站脚本(Cross-Site Scripting),简称为XSS或CSS或跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响。恶意用户利用XSS代码攻击成功后,可能得到很高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。可以用于钓鱼攻击,挂马,cookie获取,前端js挖矿等攻击行为,而且广泛适用于和其他漏洞结合,达到攻击服务器的目的。

2、 XSS漏洞一直被认为是web安全中危害较大的漏洞,在owasp一直处于top3。而在对sql注入防范越来越严密的今天,xss也成了绝大部分黑客更喜欢的漏洞利用方式。

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

XSS漏洞原理

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

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

XSS漏洞利用流程

1、用firefox和chrome的右键菜单进入html编辑器或者直接查看网页源代码
2、寻找输入点,在输入点输入特殊字符<>’’等,查看是否存在拦截,并且通过编辑器查看输入后存放的位置
3、发现没有过滤特殊字符后,就要考虑如何构造payload进行xss攻击了。开始分析漏洞页面,构建payload
4、是一个空元素,所以在元素内是无论如何不能写入内容的,所以我们先要把闭合掉,然后再插入我们的xsspayload
5、输入一个">将input元素闭合,其次将后面的,我们尝试输入一下,成功弹窗

反射性XSS

反射性XSS又称非持久型XSS,这种攻击方式往往具有一次性。

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

储存型XSS

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

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

DOM型XSS

DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

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

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

攻击方式

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

XSS常用的语句及绕过

XSS常用的测试语句:





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

A:JS编码
JS提供了四种字符编码的策略,如下所示:
三个八进制数字,如果个数不够,在前面补0,例如“e”的编码为“\145”。
两个十六进制数字,如果个数不够,在前面补0,例如“e”的编码为“\x65”。
四个十六进制数字,如果个数不够,在前面补0,例如“e”的编码为“\u0065”。
对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)。

B: HTML实体编码 htmlspecialchars(string):
把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素
命名实体:以&开头,以分号结尾如 “<”的编码是“<”。
字符编码:十进制、十六进制ASCII码或Unicode字符编码,样式为“&#数值”。例如”<”可以编码为“<”和“<”。

C: URL编码
这里的URL编码,也是两次URL全编码的结果,如果alert被过滤,结果为
%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34
在使用XSS编码测试时,需要考虑HTML渲染的顺序,特别是针对多种编码组合时,要选择合适的编码方式进行测试。

D:大小写绕过


获取Cookie实战

1.编写获取cookie的代码cookie.php,并将其放在phpStudy/WWW下。

cookie.php内容如下:

  
  • date(‘y-m-d h:i:s’,time());表获取当前时间
  • file_put_contents(‘cookie.txt’,”hello”)表将hello保存到cookie.txt文件中
  • FILE_APPEND表追加到末尾的意思
  • document.location为重定向

2.构造如下URL,并发送给被攻击者:

原始URL:

网址登录:http://172.16.11.103/book/input.php

输入框构建Payload:

注:IP为攻击者的IP

3.别人访问http://172.16.11.103/book/input.php时就成功抓取cookie

用cookie登录

1、先用账号密码成功登录,抓包获取cookie值

http://172.16.11.103/book——登录——登录成功——抓包查看留言:http://172.16.11.103/book/browse.php

保存抓包的Cookie:PHPSESSID=20s4i4slcsd2jcsi4eavp5u3v3

2、抓包——更改cookie——拦截禁用

打开网页:http://172.16.11.103/book/browse.php——抓包
(注:这里打开的网页必须是上面抓包的网页browse.php)

将抓包的Cookie: PHPSESSID=ium53pr05juoie3nthv6gjrof6更改为上面的cookie:
Cookie:PHPSESSID=20s4i4slcsd2jcsi4eavp5u3v3

——拦截禁用(反转消息拦截)
返回浏览器查看已经登录成功

方法二

打开网页F12
控制台输入:
var strCookie = prompt("请输入Cookie");
var arrCookie = strCookie.split(";");
for(var i = 0; i < arrCookie.length; i++)
{document.cookie = arrCookie;}

弹窗输入cookie:
20s4i4slcsd2jcsi4eavp5u3v3

XSS的防御

XSS防御的总体思路是:

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

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

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

XSS修复

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

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

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

1、trim(string,charlist) : 移除string字符两侧的预定义字符,预定义字符包括\t 、 \n 、\x0B 、	    \r以及空格,可选参数charlist支持添加额外需要删除的字符
2、stripslashes(string): 去除掉string字符的反斜杠\
3、mysqli_real_escape_string(string,connection) :函数会对字符串string中的特殊符号            (\x00,\n,\r,\,‘,“,\x1a)进行转义。
4、addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL
5、strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签
6、htmlspecialchars(string): 把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为 	HTML 实体,防止浏览器将其作为HTML元素当我们再次输入1 和  	,strip_tags函数把
                    
                    

你可能感兴趣的:(Web安全)