跨站脚本攻击XSS通过将恶意得Script代码注入到Web页面中,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
可以理解为网站的注入攻击,将恶意脚本注入到网页,别的用户访问时,浏览器就会对网页进行解析执行,达到攻击网站的其它访问者。
XSS主要基于JavaScript完成恶意的攻击行为,由于JS可以非常灵活地操作html、css和浏览器。
所以XSS漏洞的攻击对象并不是网站,,而是访问网站的用户。
通过对原理的理解,以及攻击流程的思考,XSS注入网站的位置需要满足一下特征:
可以主要关注网站收集用户信息输入信息的地方,并且可以展示给其它用户。
比如:用户的信息页面,聊天,评论区等地方。
XSS漏洞主要有三类,反射型,存储型,DOM型。还有一些别的XSS类型比如:Flash XSS,PDF XSS等,这些现在几乎都看不见了,因为前者是一种针对视频格式.swf的XSS,后者是基于浏览器的,当然不排除存在0day漏洞的情况,比如一些浏览器上的漏洞。去年爆出来一个浏览器的漏洞,但是网上并没有公布利用手法。所以我们就不对这些进行讨论,主要针对这三大主流常见的XSS漏洞进行讨论。
反射型XSS是非持久性、参数型跨站脚本。反射型XSS的JS代码在web应用的参数(变量)中,如搜索框的反射型XSS。
XSS代码常常出现在URL请求中,当用户访问带有XSS代码的URL请求时,服务器端接收请求并处理,然后将带有XSS代码的数据返回给浏览器,浏览器解析该段带有XSS代码的数据并执行,整个过程就像一次反射,故称为反射型XSS。
比如:这样一篇文章的网址,后面那一串长的代码就可以构造为XSS,再把链接伪装一下发给用户
https://blog.csdn.net/m0_64378913/article/details/124654153?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168196520116800192227163%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168196520116800192227163&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-124654153-null-null.142^v85^insert_down28,239^v2^insert_chatgpt&utm_term=XSS%E6%BC%8F%E6%B4%9E&spm=1018.2226.3001.4187
从这个流程图就可以看出攻击是一次性的,无法持久生效。这种情况下一般结合社工进行,被攻击者'不得不'点开。
攻击者提交一段XSS代码后,服务器接收并存储,当其他用户访问包含该XSS代码的页面时,XSS代码被浏览器解析并执行。
这类攻击的一个典型场景是留言板、博客和论坛等,当恶意用户在某论坛页面发布含有恶意的Javascript代码的留言时,论坛会将该用户的留言内容保存在数据库或文件中并作为页面内容的一部分显示出来。当其他用户查看该恶意用户的留言时,恶意用户提交的恶意代码就会在用户浏览器中解析并执行。
从攻击特点上看是可持久的。
使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式 。HTML 的标签都是节点,而这些节点组成了 DOM 的整体结构一一节点树。也就说我们可以通过Js脚本修改html代码。
owasp关于DOM型XSS的定义是基于DOM的XSS是一种XSS攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。其特殊的地方就是payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也就使得DOM型XSS比较难以检测。
也就是说DOM型的XSS是纯粹前端的漏洞,不涉及服务器。
使用phpstudy启动一个本地环境
代码如下:这里是通过js脚本生成了一个超链接,还声称了innerhtml
<div class="page-content">
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value; //获取输入字符串
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>"; //制造一个innerhtml,在what do you see加上超链接,链接内容就是你输入的字符串。
}
</script>
// 下面是一个点击提交的功能,之后触发domxss()方法
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>
</div>
输入任意字符串:
访问链接:
利用手法:
输入 javascript:alert(1)
在实例代码中通过js操作用户输入的字符串,并制作了一个超链接,会被浏览器进行解析。
反射型XSS:主要体现在URL里,但是一次性的
存储型XSS:主要关注网站一些类似留言框,评论的地方
DOM型XSS:与其说是XSS更像是逻辑漏洞,主要需要对前端代码进行审计,需要懂js代码