WEB漏洞-XSS跨站之原理分类及攻击手法

WEB漏洞-XSS跨站.png

image.png

XSS 跨站漏洞

XSS简介

  • 跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
  • 攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。
  • xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数

20210415201555.png

20210415201534.png

产生层面

  • 产生层面一般都是在前端,JavaScript代码能干什么,执行之后就会达到相应的效果
  • 比如说php中的常见的输出函数:print,print_r,echo,printf,sprintf,die,var_dump,var_export

危害影响

  • 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  • 盗窃企业重要的具有商业价值的资料
  • 非法转账
  • 强制发送电子邮件
  • 网站挂马
  • 控制受害者机器向其它网站发起攻击

出现场景

  • 利用这个漏洞需要浏览器版本和内核没有过滤XSS攻击,文章发表、评论、留言、注册资料的地方、修改资料的地方等

XSS 跨站漏洞分类

反射型

  • <非持久化>攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面

储存型

  • <持久化>代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)

DOM型

  • 基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞

XSS 漏洞原理

在黑盒测试中,这种类型比较容易通过漏洞扫描器直接发现,我们只需要按照扫描结果进行相应的验证就可以了。相对的在白盒审计中, 我们首先要寻找带参数的输出函数,接下来通过输出内容回溯到输入参数,观察是否过滤即可。无案例不足以求真,这里我们选用echo()函数作为实例来分析

<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>XSS</title> 
</head> 
<body> 
<form action="" method="get"> 
<input type="text" name="input">     
<input type="submit"> 
</form> 
<br> 
<?php 
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?> 
</body> 
</html>
  • 这是一个很简单、也很常见的页面.变量$XssReflex获取get方式传递的变量名为input的变量值(值为一个字符串),然后直接通过echo()函数输出,注意这中间并未对用户输入进行任何过滤
  • 当我们输入hello时,页面返回 hello

QQ截图20220119102934.jpg

  • 以上都为正常的输出,但如果我们输出一些JavaScript代码呢?
  • 比如我们输入 :<script>alert('xss')</script>

QQ截图20220119103036.jpg

  • 可以看到浏览器成功弹窗,说明我们输出的JavaScript代码成功被执行了
  • 这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫

QQ截图20220119103121.jpg

存储型XSS

  • 和反射性XSS的即时响应相比,存储型XSS则需要先把利用代码保存在比如数据库或文件中,当web程序读取利用代码时再输出在页面上执行利用代码。但存储型XSS不用考虑绕过浏览器的过滤问题,屏蔽性也要好很多。
  • 存储型XSS攻击流程

QQ截图20220119103232.jpg

  • 存储型XSS的白盒审计同样要寻找未过滤的输入点和未过滤的输出函数
  • 这个页面采用POST提交数据,生成、读取文本模拟数据库,提交数据之后页面会将数据写入sql.txt,再打开页面时会读取sql.txt中内容并显示在网页上,实现了存储型xss攻击模拟
<span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>  
    <html>  
    <head>  
    <title>XssStorage</title>  
    </head>  
    <body>  
    <h2>Message Board<h2>  
    <br>
    <form action="XssStorage.php" method="post">  
    Message:<textarea id='Mid' name="desc"></textarea>  
    <br>  
    <br>  
    Subuser:<input type="text" name="user"/><br> 
    <br>
    <input type="submit" value="submit" onclick='loction="XssStorage.php"'/>  
    </form>  
    <?php  
    if(isset($_POST['user'])&&isset($_POST['desc'])){  
    $log=fopen("sql.txt","a");  
    fwrite($log,$_POST['user']."\r\n");  
    fwrite($log,$_POST['desc']."\r\n");  
    fclose($log);  
    }  

    if(file_exists("sql.txt"))  
    {  
    $read= fopen("sql.txt",'r');  
    while(!feof($read))  
    {  
        echo fgets($read)."</br>";  
    }  
    fclose($read);  
    }  
    ?>  
    </body>  
    </html></span>
  • 我们随意输出一些内容

QQ截图20220119103639.jpg

  • 可以看到页面正常显示页面留言信息。当我们在Message中输入<script>alert('xss')</script>时,页面成功弹窗

QQ截图20220119103716.jpg

  • 并且我们重启浏览器之后再加载该页面,页面依然会弹窗,这是因为恶意代码已经写入数据库中,每当有人访问该页面时,恶意代码就会被加载执行
  • 这就是所谓的存储型XSS漏洞,一次提交之后,每当有用户访问这个页面都会受到XSS攻击,危害巨大

QQ截图20220119103748.jpg

DOM XSS

  • 特殊的存储型XSS

XSS 常规攻击手法

  • 平台,工具,结合其他等
  • 攻击成功的条件:对方有漏洞,浏览器存有cookie,浏览器不进行拦截,不存在带代码过滤和httponly,对方要触发这个漏洞地址

cookie session

  • 用户凭据:通过凭据可以判断对方身份信息
  • cookie 存储本地 存活时间较长 小中型
  • session 会话 存储服务器 存活时间较短 大型
  • session会占用服务器的资源,但是比较安全。比如说javaweb中的session序列化和反序列化。

涉及资源