XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10排名一直属于前三的江湖地位
XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户
XSS漏洞可以用来进行钓鱼攻击、前端js挖矿,用户cookie获取。甚至可以结合浏览器本身的漏洞对用户主机进行远程攻击

跨站脚本漏洞常见类型
反射型
交互数据一般不会被存在在数据库里,一次性,所见即所得,一般出现在查询类页面
存储型
交互数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面
DOM型
不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型
xss漏洞形成原因
形成xss漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
注意:
首先在输入框输入“‘kaikai<>”,在下面会把输入的信息不做处理的输出出来。

在这里输入的时候我们可以看见字符的限制,但是前端的限制是不靠谱的,我们可以通过前端的开发者工具修改限制

我们把这里的值修改为200,然后在这里输入
界面就会有弹窗显示

GET和POST请求的区别:
GET是以url方式提交数据
POST是以表单方式在请求体里面提交
GET方式的XSS漏洞更加容易被利用,一般利用的方式是将带有跨站脚本的URL伪装后发送给目标
POST方式由于是以表单方式提交,无法直接使用URL方式进行攻击
在留言板可以填写"<>"kaikai
在源代码可以看出来是没有经过处理

可以输入之后每次进入这个界面都会弹出这个界面

Dom的类型

通过JavaScript,可以重构整个HTML文档,你可以通过添加、移除、改变或重排页面上的项目。DOM可以理解为一个一个访问HTML的标准编程接口。
首先通过看前端源码
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "what do you see?";
}
</script>
<!--<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>
这里输入的数据会触发 js 里面的domxss() ,domxss函数会获取输入的数据然后补充到
what do you see? 里面的+str+部分,然后显示在div中间
这样就给我们机会了,我们可以闭合
#' onclick="alert('xss')">
#' onclick='alert("xss")
然后点击生成的链接就可以弹出 弹窗

在DOM漏洞利用情况下,有的访问是通过URL进行请求的,可以通过伪装url诱导用户进行访问,触发危险的js
再进行这个测试之前,需要打开xss的管理页面

按照要求进行初始化,登录

在xss漏洞输入
可以在后台获取到cookie

然后就可以通过cookie进行操作了

通过伪装的页面进行post请求
做这个测试之前,必须先登录

伪装界面源码为,把这个界面发送给用户

获取到cookie,账户,密码
这个在phpstudy部署的情况下面是无法实现的,原因是完成下面的条件是php必须以模块方式运行,但是这里的phpstudy使用的是CGI协议模式,所以无法获取用户名与密码。按照下面的文章就可以实现这个功能。
Pikachu漏洞靶场系列之XSS钓鱼攻击后续 - 腾讯云开发者社区-腾讯云 (tencent.com)

攻击者伪装正常界面,用户把账户密码等重要信息输入,被发送伪装站点在存储的xss的漏洞的地方,可以填写
理论上,用户填写之后,会把账户密码发送给后台的xss管理站点

需要修改代码中的地址

键盘的操作已经被发送到后台了


在一些环境下,我们不知道自己的信息是否被提取,我们可以通过把攻击的js直接进行提交,如果对方没有对存入的数据进行处理,那么在管理员登陆管理员界面的时候就可以盗取管理员的cookie或者账户密码。
可以在提交界面输入入侵的js代码
登陆管理员账户,可以在管理员后台获取管理员cookie和信息
这里使用我们上面的cookie获取

现在登录留言板的后台
http://127.0.0.1/pikachu/vul/xss/xssblind/admin_login.php
点击登录之后,cooke就会不上发送到后台了

转换
pt>alert(111) pt>pt>alert(111)ript> 编码/使用html编码
可以把alert('xss')进行html编码
htmlspecialchars()函数把预定义的字符转换我HTML实体
&:转换为&
":转换为"
':转换为成为 '
<:转换为<
>:转换为>
ENT_COMPAT:默认。仅编码双引号。
ENT_QUOTES:编码双引号和单引号。
ENT_NOQUOTES:不编码任何引号。
由于标签可以
可以在输入 javascript:alert(111)这样就没有编码问题
解决措施:
在输入标签内容的时候,只允许其通过http,https的协议内容
<script>
$ms='111';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
把数据放入到$ms=‘tesx’;中间,但是可以在构造闭合。
$ms='x'';
我们输入的部分是x'
解决措施:
js的输出点应该使用\的特殊字符进行转义
输入做过滤,输出做转义
过滤:只允许输入指定的格式的东西
转义:所有的输出到前端都进行编码