xss基础知识-LMLPHP

  • XSS
  1. 概述

指攻击者利用网站程序对用户的输入输出过滤不足,导致恶意代码在页面执行,对受害者造成cookie资料窃取、会话劫持、钓鱼欺骗等危害;

 

 

  1. XSS危害

1.网络钓鱼,盗取各类用户的账号,如机器登录帐号、用户网银帐号、各类管理员帐号;

2.窃取用户Cookie,获取用户隐私,或者利用用户身份进一步执行操作

3.劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志等

4.强制弹出广告页面,刷流量等

5..进行恶意操作,例如任意篡改页面信息,删除文章等,传播跨站脚本蠕虫,网页挂马等

6.进行基于大量的客户端攻击,如DDOS攻击

7.结合其它漏洞,如CSRF漏洞。

8.进一步渗透网站

9.获取客户端信息,例如用户的浏览历史、真实IP、开放端口、盗窃企业重要的具有商业价值的资料等;

10.控制受害者机器向其他网站发起攻击;

11传播跨站脚本蠕虫等;

 

  1. XSS分类

xss攻击可以分成两种类型:

1.非持久型攻击
2.持久型攻击

 

非持久型xss攻击:顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

 

持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。

也可以分成三类:

反射型:经过后端,不经过数据库

存储型:经过后端,经过数据库


DOM:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,

Dom - xss是通过url传入参数去控制触发的。

 

  1. 反射型

使用方法:

它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被 打开时,特有的恶意代码参数被HTML解析、执行。

它的特点是非持久化,即不存入数据库。。

 

缺点:

  1. 必须用户点击带有特定恶意脚本代码参数的链接才能引起;
  2. 恶意代码存放URL,只有当用户点击恶意链接打开时执行恶意代码,隐蔽性差;
    xss基础知识-LMLPHP 
     
     
  1. 存储型

存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie;

  1. DOM

归属于反射型,DOM型XSS是基于DOM文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。

客户端的脚本程序可以通过DOM动态地检査和修改页面内容,它不依赖于服务器端的数据,而从客户端获得DOM中的数据(如从URL中提取数据)并在本地执行。

另一方面,测览器用户可以操纵DOM中的一些对象,例如URL、 location等。用户在客户端输入的数据如果包含了恶意 JavaScript脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于DOM的XSS攻击。

伪静态页面是可以产生DOM型XSS的。假设一个名为domXSS1.html的网页,内容如下:

<html>

<head>

<title>DOM-XSS1 test</title>

</head>

<body>

<script>

var temp = document.URL;//获取url

var index = document.URL.indexOf("a=")+2;

var par = temp.substring(index);//截取url中a=后所有字符a的内容

document.write(decodeURI(par));//将获取的字符进行url解码

</script>

</body>

</html>输入http://www.any.com/xss/domXSS1.html?a=test,页面上只输出test。页面如下:

xss基础知识-LMLPHP 

输入domXSS1.html?a=<script>alert(‘XSS’)</script>,应该出现弹窗。

 

 

  • XSS漏洞挖掘点
  1. 反射型&存储型

数据交互(即输入/输出)的地方最容易产生跨站脚本,因此,我们可以着重对网站的输入框、URL参数处进行·测试。当然,所有来自cookie、post表单、HTTP头的内部都可能会产生xss。

反射型XSS通常出现在网页的URL中,必须用户点击带有特定参数的连接,才能引起。Payload在响应页面中。

存储型和反射型漏洞挖掘,主要步骤先在页面中执行命令,然后在通过查看页面源代码,找到正确的变换姿势,最终触发弹框。

接着分析其中的函数,最终找到出现该漏洞的原因,。即先利用黑盒测试找出跨站脚本漏洞,再利用白盒技术分析一下该漏洞的原因。

反射型常用测试方法:

一般是存在于URL中,也可对整个输入(特别强调的是,整个HTTP请求都是输入,数据库取来的数据其实也是输入。HTTP请求包括GET、POST参数,COOKIE,URL,头部的REFERER等等(但这些参数的数值必须在返回页面中出现))中每个地方都可以如下操作,

1.        自己构造一个唯一的串,例如:myxsstestxxxx

2.        将某个输入项(比如某个参数)替换为上面的串

3.        查看HTTP相应中是否有这个串,并记录下来

4.        根据HTML上下文决定,用哪种类型串来尝试,尝试攻击串,然后重新提交请求

5.        如果能够找到相应的攻击串说明漏洞是存在的 这里的关键在于第四步,因为服务器端可能会做一些限制,比如encode或者长度限制,测试的时候需要想办法看看是否能绕过限制。

 

  1. DOM

发掘基于DOM的跨站脚本漏洞,主要关注两方面:脏数据的输入和脏数据的输出。

脏数据的输入

着重检查用户的输入源,eg:可能触发DOM XSS的属性,

比如:

windows.name属性

document.referer属性

location 属性

  1. document.referer属性
    该属性设置了用户的来源url(即上一个url)
    <html>
    <head>
    <title>DOM-XSS2 test</title>
    </head>
    <body>
    <a href="http://127.0.0.1/9.html">Demo</a><p>
    from:
    <script>
    document.write(decodeURI(document.referrer));//url解码上一次网址
    </script>
    </body>
    </html>
    页面的访问网址应带有?XSSXSS<script>alert(‘XSS’)</script>XSSXSS第一次访问页面的结果是页面中还有一个Demo超级链接,该链接指向页面本身。点击该链接,此时浏览器弹出一个对话框。
     
  2. location属性
    location是JavaScript管理地址栏的无内置对象,使用location.href能管理页面法人URL,如果想引发一个DOM型XSS,可以在含有上述代码的HTML文档的URL后输入JavaScript代码,比如#<script>alert(‘XSS’)</script>,然后脚本会使用document.write进行输出。
     
    <html>
    <head>
    <title>DOM-XSS3 test</title>
    </head>
    <body>
    <script>
    document.write("Site:"+decodeURI(document.location.href));
    </script>
    </body>
    </html>
    脏数据的输出
    输出在这里指的是能使字符串在页面中输出的方法或函数,譬如innerHTML、document.write等。
    测试和发掘DOM型XSS输出对象的流程是:跟踪输出函数的变量,比如首先找到document.write等会造成危害的地方,然后回溯变量与函数的调用过程,查看用户能否控制输入。
     
    主要两点:
    1对于反射型能在URL中调用其对象
    2 能在页面中对对象的属性值能显示出来;
     
     
  • XSS绕过
  1. 字符绕过

转换HTML标签

•     直接嵌入html:<script> alert(‘XSS’); </script>

•        元素标签事件<body onload=alert(‘XSS’)>

•        图片标签<audio/video/img src="javascript:alert('XSS');">

•        其他标签<iframe>, <div>, and <link>

 

HTML标签属性支持为伪协议

应用场景:标签的属性支持javascript:[code]为协议

对应防御:过滤javascript关键字

<iframe src=”javascript:alert(1)”>

PS:这个特殊的协议类型声明了URL的主体是任意的Javascript代码,由javascript解释器运行;

 

利用空字符

常用字符:[空格]、[回车]、[tab]键位符、%00

应用场景:对javascript关键字做了过滤

<iframe src=java script(1)>

<scri\x00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>

PS:javascript语句通常以分号结尾,如果语句后面没有分号,但是有换行符时,javascript引擎会自动判断该语句是否结束.如果到换行处判断并不是一个完整语句,那么javascript会继续处理后面的内容,直到遇到一个分号或发现语句完整为止.

利用事件

javascript与html之间是通过事件来实现的,事件就是用户或浏览器自身执行的某种动作,比如click、mouseover、onload等,而响应事件的函数就叫做事件处理函数。

<input type=”button” value=”click me” onlick=”alert(1)”>

既然事件能让js代码运行,那就意味着也能执行XSS

<img src=”x” onerror=alert(1)>

xss基础知识-LMLPHP 

“ onfocus=alert(1) autofocus;//    约等于onclick

“ oninput=alert`1 ` //  输入新内容时

“ onchange=alert`1` //    内容改变确认时

" > <body onload=alert(2)>加载完成时

warning:注意闭合,要么闭,要么蔽

<input name=keyword  value="" onfocus=alert(1) autofocus "">

PS绝大部分会被过滤:但是任有少量未被过滤,eg:onmouseenter事件:

<div onmouseenter=”alert(‘xss’)”>当用户鼠标移动到div上时就会触发代码.

或  在属性和=之间插入空格:<div onclick =”alert(‘xss’)”>

 

  1. 大小写混写

<ScRipt>ALeRt(“XSS”);</sCRipT>

 

  1. 引号的使用及限制绕过

<script>alert(/xss/)</script>//可以使用”xss”、/xss/代替’xss’;

限制绕过

真实环境中,‘、“、(、),如果遇上以上四个字符被过滤的情况,name我们就需要使用其他字符去替换,或者编码方式去绕过;

  1. 不使用 "  <input onfocus=alert('1') autofocus/>
  2. 不使用 '  <input onfocus="alert(/1/)" autofocus/>
  3. 不使用( ) <input onfocus=”alert`’2’`” autofocus/>
  4. 不使用’ “ () <input onfocus=alert`1` autofocus/>
  5. 使用html实体编码绕过 <input onfocus="alert('1')" autofocus/>
  6. 使用html实体编码绕过变形 <input onfocus="alert('1')" autofocus/>
     
  1. 编码绕过

当服务器对代码中的关键字进行过滤,我们可以尝试对关键字编码,不过直接显示编码是不会被浏览器执行的,我们可以用另一个语句eval()实现,eval()会将编码过的语句解码后再执行.

  1. HTML字符实体类型转换
    HTML某些属性值支持html十进制a、十六进制a编码表示
  2. javascript(支持 Unicode 、十进制、十六进制;、八进制、HTML)
  3. href=
  4. action=
  5. formaction=
  6. location=
  7. on*=
  8. name=
  9. background=
  10. poster=
  11. src=
  12. code=
  13. data= //只支持base64

 

  • 防范
  1. 使用XSS Filter

xss filter的作用是过滤用户提交的有害信息,从而达到防范xss攻击的效果.

  1. 定制过滤策略

业内防御跨站脚本攻击的方式一般有两种:input Filtering 和 Output Filtering.

  1. 输出编码

HTML编码在防止XSS攻击上起很大的作用,它主要是用对应的HTML实体替代字面量字符,这样做可以确保浏览器安全处理可能存在的恶意字符,将其当作HTML文档的内容而非结构加以处理.

一些常见的可能造成问题的字符的HTML编码如表所示。

 

编码函数

,如ASP Server.HTMLEncodeo函数、

ASP.NET的 Server.HtmlEncode()函数等。

PHP的 htmlspecialchars(),该函数可以将HTML特殊字符转化成在网页上显示的字符实体编码。

htmlspecialchars()函数可以将以下五种HTML特殊字符转成字符实体编码:

<转成&It;

>转成>

&转成&

“转成"

‘转成'。

 

  1. 黑白名单

 

两种形式的特点:

  1. DOMXSS防御

防范基于DOM的XSS攻击要注意两点。

①避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务端使用动态页面来实现。

②分析和强化客户端 Javascript代码,尤其是一些受到用户影响的Dom对象。

另外,要注意能直接修改DOM和创建HTML文件的相关函数和方法。

此外,在把变量输出到页面时要做好相关的编码转义工作。如要输出到<script>中,可以进行JavaScript编码;要输出到HTML内容或属性,则进行HTML编码处理。需要根据不同的语境采用不同的编码处理方式。

 

  1. HttpOnly Cookie

web应用程序在设置Cookie时,将其属性设为 HttpOnly,就可以避免该网页的 Cookie被客户端 JavaScript存取,也可以保护用户的 Cookie不被盗取。

HttpOnly Cookie只是某些浏览器所支持的一种防御机制,并不是所有;

 

 

 

10-03 10:51