DVWA--反射型(XSS)

  之前有一篇特殊的反射型XSS,也就是dom型的文章,现在来看看一般反射型的。

 

反射型XSS:

  将脚本代码加入URL地址的请求参数里,

  请求参数进入程序后在页面直接输出,

  用户点击类似的恶意链接就可能受到攻击。

我们了解一下document对象的一些属性以及一些方法。

 

Document 对象属性
属性 描述
body
提供对 <body> 元素的直接访问。

 

对于定义了框架集的文档,该属性引用最外层的 <frameset>。

 

cookie 设置或返回与当前文档有关的所有 cookie。
domain 返回当前文档的域名。
lastModified 返回文档被最后修改的日期和时间。
referrer 返回载入当前文档的文档的 URL。
title 返回当前文档的标题。
URL 返回当前文档的 URL。

---------------------------------------------------------------------------------------------------------------------

Document 对象方法
方法 描述
close() 关闭用 document.open() 方法打开的输出流,并显示选定的数据。
getElementById() 返回对拥有指定 id 的第一个对象的引用。
getElementsByName() 返回带有指定名称的对象集合。
getElementsByTagName() 返回带有指定标签名的对象集合。
open() 打开一个流,以收集来自任何 document.write() 或 document.writeln() 方法的输出。
write() 向文档写 HTML 表达式 或 JavaScript 代码。
writeln() 等同于 write() 方法,不同的是在每个表达式之后写一个换行符。

 

♥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>';
}

?>

 

源码里面直接判断我们输入参数不为空,就直接输出,没有任何防护。

 

直接打payload:

<script>alert(document.domain)</script>

 

 

 

♥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>标签作了替换,替换为空。

 

我们可以选择双写绕过

payload1:<s<script>cript>alert(document.title)</script>

 

当然我们也可以换成其他标签

payload2:<img src=11 onerror=alert(2)>

 

♥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>";
}

?>

这里使用preg_replace 函数执行一个正则表达式的搜索和替换。

比如说匹配输入串A: 101000000000100

使用 1.*1 将会匹配到1010000000001, 匹配方法: 先匹配至输入串A的最后, 然后向前匹配, 直到可以匹配到1, 称之为贪婪匹配。

这里彻底过滤掉了script标签,但是换其他标签就可以了

payload:<body onload=alert('xss')></body>

 

 

 

♥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();

?>

首先加入了token来验证防止csrf跨站,然后用htmlspecialchars函数对预定的字符转化为实体

预定义的字符是:

& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >

这样就没法输入代码来进行攻击了。

 

posted @ 2021-05-28 17:23  Erichas  阅读(23)  评论(0编辑  收藏  举报