本文主要是介绍DVWA靶场练习-XSS(Reflected),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- low
- 实践
- 源码分析
- 代码运行示例
- Medium
- 实践
- 源码分析
- high
- 实践
- 源码分析
- impossible
- 源码分析
仅用作学习笔记使用,过程中可能存在误区,或者不足,望大佬对不足或错误之处进行指出修订。感谢各位的观看,也希望有道友一起学习。
low
实践
第一个等级,我们可以直接尝试正常xss是否有效
<script>alert("xss")</script>
测试结果,可以看到是存在反射性的XSS注入的,这种就是没有对用户的输入进行过滤。
源码分析
可以看到,代码中只是简单的get请求传过来的参数进行了一个简单的空值判断,没有进行如何的处理
array_key_exists( “name”, $_GET )表示检查 $_GET 数组中是否有名为 “name” 的键名,返回一个布尔值。
&& 是并且运算符,连接两个条件,只有当两个条件都满足时才会返回 true 。
$_GET[ ‘name’ ] != NULL 表示检查 GET 请求中名为"name"的参数的值是否不为空,不为空则返回 true 。
<?phpheader ("X-XSS-Protection: 0");// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Feedback for end userecho '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
代码运行示例
我们创建一个类似的参数传递代码,查看代码的返回值是什么
<?php
$name = "<script>alert('xss')</script>";
echo '<pre>Hello ' .$name. '</pre>';
# 代码运行结果
# <pre>Hello <script>alert('xss')</script></pre>
可以看到,最后将下面的Hello 反馈到了输出的界面,导致页面解析了弹窗。我们查看网页确实是写进去了。
Medium
实践
同样的我们使用后,发现成功执行。
源码分析
可以看到,在这个等级下面,只是在上一个的基础上加了一个str_replace,将
<?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 userecho "<pre>Hello ${name}</pre>";
}
?>
high
实践
在这一关,同样的使用检测,发现无法通过,尝试一下方法:
- <scr
均无果,通过放回的结果,只剩下一个==>,我们便考虑是不是将<>闭合的html标签给过滤掉了,我们将<>z转义尝试一下,<script>==,发现可以输出。
进一步去尝试将,
<script>alert(“xss”)</script>
发现没有报错,但是也没有弹窗,变成了一个字符串输出,至此,感觉script标签不太能行,尝试一下其他标签,例如img、iframe
使用img标签可以正常显示,<img src=javascript:alert(‘xss’)>使用这个代码,依然报错,猜测是有scr的都会过滤掉,这个时候使用不使用伪代码,使用img标签中的onerror属性,<img src=“1” οnerrοr=alert(‘xss’)>
源码分析
通过源码分析,我们可以看出来,代码中添加了一个正则匹配,匹配< 后包含有script的任意字符串,导致我们之前含有< script的内容都被替换成了""字符。
<?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 userecho "<pre>Hello ${name}</pre>";
}
?>
impossible
顾名思义,这个关卡不太可能,所以我们直接来看源码,它是这么样来防御这种注入的
源码分析
在这里,它对传入进来的参数使用了一个方法htmlspecialchars,我们看一下这个方法的解释
htmlspecialchars() 是 PHP 中一个用于编码 HTML 字符串的函数。它将 HTML 特殊字符(例如 <、>、"、’ 和 & 等)转换为等效的 HTML 实体,从而避免了 XSS 攻击,并保证输出的字符串不会破坏 HTML 代码。
此方法接受一个参数:需要进行编码的字符串。可以在使用该字符串时调用此函数,也可以将该字符串存储在数据库中并在显示数据之前调用函数。
例如,假设有一个字符串 $str 包含 HTML 标记和一些 JavaScript 代码:
php
$str = "<script>alert('Hello!');</script>";
如果直接将 $str 输出到 HTML 页面,就会执行其中的 JavaScript 代码,并弹出一个警告框,这是非常危险的。为了防止这种情况发生,应该对 $str 调用 htmlspecialchars() 方法:
php
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
其中,ENT_QUOTES 参数指定单引号和双引号都应该被编码为实体,而 UTF-8 参数指定以 UTF-8 编码输出实体。此时,$str 中的所有特殊字符都将被替换为等效的实体,从而使页面安全地输出。
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$name = htmlspecialchars( $_GET[ 'name' ] );// Feedback for end userecho "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
这篇关于DVWA靶场练习-XSS(Reflected)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!