DVWA XSS (Reflected) 反射型跨站脚本
XSS 漏洞:
全称Cross Site Scripting,跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss分类:
反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。
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>';
}
?>
源码分析:
对name 的 传 参 没 有 做 任 何 的 过 滤 , 只 是 检 测 了 name的传参没有做任何的过滤,只是检测了name的传参没有做任何的过滤,只是检测了name存在且不为空就直接输出在网页中
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标签,使用str_replace函数将输入中的script替换为空。可以使用事件类型标签绕过
大小写绕过:
双写方式绕过str_replace()函数:
<scr
使用非script标签的xss payload:
img标签:
<img src=1 onerror=alert(‘xss’)>
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() 函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效,但依旧可以使用事件类型标签
<img src=1 onerror=alert(‘xss’)>
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();
?>
源码分析:
PHP htmlspecialchars()函数
把预定义的字符转换为HTML实体:
& (和号)成为 &
” (双引号)成为 “
‘ (单引号)成为 ‘//生效需要加ENT_QUOTES参数
< (小于)成为 <
(大于)成为 >
可以看到,Impossible Security Level的代码使用htmlspecialchars函数把预定义的字符:& ” ‘ < >转换为HTML实体,防止浏览器将其作为HTML元素。
防护总结:
转义字符输出
白名单验证
HTML实体化
来源:freebuf.com 2021-06-28 14:17:19 by: wakemeup
请登录后发表评论
注册