跨站脚本攻击(CrossSiteScript),本来缩写是CSS,但是为了和层叠样式表(CascadingStyleSheet,CSS)有所区分,所以安全领域叫做“XSS”;
XSS攻击,通常是指攻击者通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,对用户的浏览器进行控制或者获取用户的敏感信息(Cookie,SessionID等)的一种攻击方式。
页面被注入了恶意JavaScript脚本,浏览器无法判断区分这些脚本是被恶意注入的,还是正常的页面内容,所以恶意注入Javascript脚本也拥有了所有的脚本权限。如果页面被注入了恶意JavaScript脚本,它可以做哪些事情呢?
可以窃取cookie信息。恶意JavaScript可以通过”doccument.cookie“获取cookie信息,然后通过XMLHttpRequest或者Fetch加上CORS功能将数据发送给恶意服务器;恶意服务器拿到用户的cookie信息之后,就可以在其他电脑上模拟用户的登陆,然后进行转账操作。
可以监听用户行为。恶意JavaScript可以使用"addEventListener"接口来监听键盘事件,比如可以获取用户输入的银行卡等信息,又可以做很多违法的事情。
可以修改DOM伪造假的登陆窗口,用来欺骗用户输入用户名和密码等信息。
XSS攻击可以分为三类:反射型,存储型,基于DOM型(DOMbasedXSS)
反射型
恶意脚本作为网络请求的一部分。
constKoa=require("koa");
constapp=newKoa();
app.use(asyncctx=>{
//ctx.body即服务端响应的数据
ctx.body='';
})
app.listen(3000,()=>{
console.log('启动成功');
});
反射型XSS1
举一个常见的场景,我们通过页面的url的一个参数来控制页面的展示内容,比如我们把上面的一部分代码改成下面这样
ctx.body=ctx.query.userName;
反射型XSS2
通过这个操作,我们会发现用户将一段含有恶意代码的请求提交给服务器,服务器在接收到请求时,又将恶意代码反射给浏览器端,这就是反射型XSS攻击。另外一点需要注意的是,Web服务器不会存储反射型XSS攻击的恶意脚本,这是和存储型XSS攻击不同的地方。
存储型
存储型会把用户输入的数据“存储”在服务器。
存储型攻击大致需要经历以下几个步骤
首先攻击者利用站点漏洞将一段恶意JavaScript代码提交到网站数据库中
然后用户向网站请求包含了恶意JavaScript脚本的页面
当用户浏览该页面的时候,恶意脚本就会将用户的cookie信息等数据上传到服务器
存储型XSS
举一个简单的例子,一个登陆页面,点击登陆的时候,把数据存储在后端,登陆完成之后跳转到首页,首页请求一个接口将当前的用户名显示到页面
客户端代码
.login-wrap{
height:180px;
width:300px;
border:1pxsolid#ccc;
padding:20px;
margin-bottom:20px;
}
input{
varbtn=document.querySelector('.btn');
btn.onclick=function(){
varuserName=document.querySelector('.userName').value;
varpassword=document.querySelector('.password').value;
method:'POST',
body:JSON.stringify({
userName,
password
}),
headers:{
'Content-Type':'application/json'
},
mode:'cors'
.then(function(response){
returnresponse.json();
.then(function(res){
alert(res.msg);
.catch(err=>{
message.error(`本地测试错误${err.message}`);
console.error('本地测试错误',err);