XSS漏洞

分类及原理

跨站脚本攻击XSS(最全最细致的靶场实战)_xss靶场-CSDN博客

它允许恶意用户将代码注入网页,其他用户在浏览网页时会受到影响,恶意用户利用XSS代码攻击成功后,可能得到很高的权限、私密网页内容、会话和cookie等各种内容。

黑盒XSS手工分析:

  1. 页面中显示的数据找可控的(有些是隐藏的)。
  2. 利用可控的地方发送JS代码看执行情况。
  3. 成功执行即XSS,不成功则分析显示的输出。
  4. 分析为什么不能执行(实体化、关键字被删除等)。

反射型XSS

攻击者构造一个恶意链接,诱导用户传播和打开 。发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,所以称反射型XSS。

劫持流量实现恶意跳转:

<script>window.location.href="http://www.baidu.com";</script>

那么所访问的网站就会被跳转到百度的首页。早在2011年新浪就曾爆出过严重的xss漏洞,导致大量用户自动关注某个微博号并自动转发某条微博。

真实的XSS攻击语句,需要考虑输入和输出的格式。

输入可能会有过滤,输出可能会有其他符号的拼接造成攻击语句执行失败。如下图:

注意标签闭合,可以参考这篇文章:https://www.freebuf.com/articles/web/340080.html

存储型XSS

存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求目标页面时不用再提交XSS代码。最典型的例子就是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言就会从数据库中加载出来并显示,于是触发了XSS攻击。

DOM型XSS

DOM型XSS - FreeBuf网络安全行业门户
不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,大部分属于反射型。


DOM就是一个树状的模型,你可以编写Javascript代码根据DOM一层一层的节点,去遍历/获取/修改对应的节点,对象,值。

[!NOTE]
可能触发DOM型XSS的属性:
document.referer属性
window.name属性
location属性
innerHTML属性
document.write属性

XSS-Lab(安全防御-XSSFilter)

如何绕过过滤触发JS代码?

  1. 无过滤

  2. 标签闭合

查看源码,发现<>被HTML字符实体化。

输入的payload被赋值给value且未被实体化,可以考虑闭合value的参数值,和sql注入原理相同。

"><script>alert()</script>//
  1. 单引号闭合并添加事件

发现value也被实体化。

利用onfocus事件绕过:

' onfocus=javascript:alert() ' //注意空格

然后再点击输入框触发onfocus事件即可。

  1. 双引号闭合并添加事件

发现依旧实体化,且value删除了<>

同样添加onfocus事件可以绕过,注意闭合方式是双引号。

" onfocus=javascript:alert() " //注意空格
  1. 事件关键字过滤,利用其他标签调用,双引号闭合

实体化,script被添加下划线,onfocus同样也被添加下划线。

因此我们可以换一个标签来执行js代码:

href属性的意思是 当标签a被点击的时候,就会触发执行转跳,上面是转跳到一个网站,我们还可以触发执行一段js代码:

"> <a  href=javascript:alert()>xss</a>//

之后点击xss,触发a标签href属性即可。

6. 大小写绕过

发现href也被添加下划线:

查看服务器端源码:

str_replace不区分大小写,所以可以利用大小写绕过:

"> <a  hRef=javascript:alert()>xss</a>//
  1. 双写绕过

发现关键字被删除:

利用双写绕过:

"> <a  hrhrefef=javascscriptript:alert()>xss</a>//
  1. unicode编码绕过

输入的值被插入到<a>标签的href属性值中:

 href属性自动解析Unicode编码:
 

  1. 内容检测

发现不合法,猜测这里可能对url地址做了匹配。只有包含正常的url地址才能添加到href属性值。

查看源码:

因此要向传入的值里面添加http://并用注释符注释掉否则会执行不了无法弹窗:

javascript:alert()//http://

此外还存在其他过滤,要将javascript:alert()进行unicode编码。

  1. 输入数据被隐藏

查看源码,发现还有其他传参方法,且过滤了<>

因为这里输入框被隐藏了,需要添加type=”text”,构造payload:

?t_sort=" onfocus=javascript:alert() type="text

成功执行XSS:

  1. http头传值

猜测第四个名为t_ref的input标签是http头referer的参数。

BurpSuite抓包,添加Referer头,payload为:

" onfocus=javascript:alert() type="text