美文网首页
dvwa-XSS (Reflected)

dvwa-XSS (Reflected)

作者: id_rsa | 来源:发表于2019-01-06 18:27 被阅读0次

    XSS攻击需要具备两个条件:需要向web页面注入恶意代码;这些恶意代码能够被浏览器成功的执行
    XSS反射型漏洞

    反射型XSS,顾名思义在于“反射”这个一来一回的过程。反射型XSS的触发有后端的参与,而之所以触发XSS是因为后端解析用户在前端输入的带有XSS性质的脚本或者脚本的data URI编码,后端解析用户输入处理后返回给前端,由浏览器解析这段XSS脚本,触发XSS漏洞。因此如果要避免反射性XSS,则必须需要后端的协调,在后端解析前端的数据时首先做相关的字串检测和转义处理;同时前端同样也许针对用户的数据做excape转义,保证数据源的可靠性

    基本原理 就是通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特定的代码参数会被HTML解析,执行,如此就可以获取用户的COOIKE,进而盗号登陆。

    特点是 非持久化 必须用户点击带有特定参数的链接才能引起。
    XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

    XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛、OA、CRM等社交网站上,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击

    LOW

    image.png

    随便输入 admin 出现hello admin


    image.png

    输入<script>alert('xss')</script> 试试


    image.png

    php 输出已经变成了,'<pre>Hello <script>alert('xss')</script></pre>' 然后输出到页面时,直接运行 <script>alert(1)</script> 这就是 XSS,原本这个地方应该是输入数据的,但是却变成运行代码了
    源码

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

    没有对传入的数据进行任何处理

    medium

    输入<script>alert('xss')</script>


    image.png

    应该是过滤了<script>关键字
    输入<scri<script>pt>alert('xss')</script>


    image.png
    另一种方法,大小写混淆绕过:
    输入:<SCriPt>alert(/xss/)</ScRipt>

    源码

    <?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
        $html .= "<pre>Hello ${name}</pre>";
    }
    
    ?>
    

    high

    输入<script>alert('xss')</script>



    <script>和alert()可能都被过滤了
    构造出<scri<script>pt>alalertert('xss')</scr</script>ipt>
    发现无法提交 猜测对提交的数据长度做了限制
    看一下源码

    <?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
        $html .= "<pre>Hello ${name}</pre>";
    }
    
    ?>
    
    

    。。。。。。发现猜测错误
    源码对任何形式的script做了过滤
    所以可以采用不使用 script 的方式。

    比如利用 img 的 onerror 函数 ,意思是说,如果图片的地址是错误的,就执行alert(1)

    函数使用正则表达式的搜索和替换,这样使得双写绕过和大小写混淆不可行。
    我们可以考虑通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
    输入:<img src=1 onerror=alert(/xss/)>


    image.png

    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
        $html .= "<pre>Hello ${name}</pre>";
    }
    
    // Generate Anti-CSRF token
    generateSessionToken();
    
    ?>
    

    不可能级别添加了 anti-token 防御机制,和htmlseecialchars函数来防御


    image.png

    那么什么是HTML实体?
    1、 在 HTML 中,某些字符是预留的。
    2、在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签,当然在HTML中还有其他实体
    3、如果希望正确地显示预留字符,我们必须在HTML源代码中使用字符实体(character entities)。
    4、如需显示小于号,我们必须这样写:< 或 <使用实体名而不是数字的好处是,名称易于记忆。不过坏处是,浏览器也许并不支持所有实体名称(对实体数字的支持却很好)。

    所以输入的语句不会被执行

    image.png

    相关文章

      网友评论

          本文标题:dvwa-XSS (Reflected)

          本文链接:https://www.haomeiwen.com/subject/myisrqtx.html