[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集
- XSS(Reflected)-low level
- 源代码
- 姿势
- XSS(Reflected)-medium level
- 源代码
- 姿势
- 1.双写绕过
- 2.大小写绕过
- XSS(Reflected)-high level
- 源代码
- str_replace函数
- 姿势
- XSS(Reflected)-Impossible level
- 源代码
- 代码审计
- 总结
免责声明:本文仅分享XSS攻击相关知识,不承担任何法律责任。
DVWA请读者自行安装,本文不再赘述。
XSS(Reflected)-low level
源代码
<?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>';
}
?>
无任何过滤 可实施XSS注入
姿势
先提交name1
浏览顶部URL栏发现为GET请求
Payload:GET<script>alert("qiu")</script>
XSS(Reflected)-medium level
源代码
<?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>";
}
?>
使用 str_replace() 函数将 <script> 标签替换为空
姿势
1.双写绕过
Payload:<scri<script>pt>alert("qiu")</script>
由于str_replace() 函数将<script>
标签替换为空,且str_replace函数仅执行一次
Payload将变为<script>alert("qiu")</script>
,从而实现了正常XSS语句的注入
2.大小写绕过
在 PHP 中,变量名、函数名、常量名等标识符都是区分大小写的。
例如,$Qiu
和 $qiu
是两个不同的变量
因此我们可构造Payload如下来绕过限制:
Payload:<Script>alert("qiu")</script>
<sCript>alert("qiu")</script>
及 <ScRIpt>alert("qiu")</script>
均可
XSS(Reflected)-high level
源代码
<?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>";
}
?>
str_replace函数
preg_replace
是 PHP 内置的一个函数,用于使用正则表达式对字符串进行搜索和替换。其语法如下:
preg_replace($pattern, $replacement, $subject);
其中:
$pattern
:表示正则表达式模式,用于指定需要搜索的规则;$replacement
:表示替换后的字符串,可以是字符串、数组或回调函数等;$subject
:表示输入的字符串,需要进行搜索和替换的目标字符串。
preg_replace
函数会在 $subject
中搜索符合 $pattern
的子串,并将其用 $replacement
进行替换。如果 $pattern
中包含捕获分组,可以在 $replacement
中使用 $n
($n 表示第 n 个捕获分组)的形式来引用捕获的内容。
下面是一个使用 preg_replace
函数过滤 HTML 标签的简单示例。
$str = "<p>这是一段<b>加粗</b>的文本。</p>";
$pattern = "/<[^>]*>/";
$replacement = "";
echo preg_replace($pattern, $replacement, $str);
上述代码中,定义了一个包含 HTML 标签的字符串 $str
。
接着,使用正则表达式 $pattern
匹配其中的标签内容,即 /<[^>]*>/
表示匹配任意以 <
开头,以 >
结尾的字符串。
然后,将匹配到的标签内容,即<p><b></b></p>
用空字符串 $replacement
进行替换,即删除所有标签。
最后,使用 preg_replace
函数输出过滤后的字符串,即不包含 HTML 标签的纯文本内容。结果如下所示:
这是一段加粗的文本。
.*
是正则表达式中的一个元字符组合,表示匹配任意数量的任意类型字符。其中.
表示匹配任意一个字符,*
表示匹配该字符的数量是 0 到无限个。
例如,a.*b 表示匹配以字母 a 开始,以字母 b 结尾的字符串,并且两端之间包含了任意数量的字符。如 acbc
、ab
、a-&^%$#@!b
等等都是符合这个正则表达式的字符串。
正则表达式 /<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i
中的 /i
表示忽略大小写。
例如,如果输入的字符串中存在如下标签:
<Script></Script>
那么在未加 /i
修饰符时,由于标签名中大小写混合,<Script>
无法被/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i
完全匹配,因此不会被过滤掉。而当我们加上 /i
修饰符后,就可以忽略大小写,将其正确地匹配并过滤掉。
正则表达式/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i
表示匹配包含任意字符的 <script
标签。使用 preg_replace() 函数时,将会过滤所有以<开头、以t结尾的字符串
例如,以下的字符串均可被上述正则表达式匹配到:
<script></script>
<Scri<script>pt></scriUIXpt>
<SCCRIRIPPTTTTTt></scriIIOpt>
如果正则表达式为/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t(.*)>/i
,则会过滤所有以<
开头,以>
结尾的字符串
姿势
切换XSS语句的标签即可绕过限制
Payload:<img src=1 onerror=alert("qiu")>
,注入成功:
XSS(Reflected)-Impossible level
源代码
<?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();
?>
代码审计
- 检查是否存在名为 name 的 GET 参数,并且该参数不为空;
- 使用 checkToken() 函数对用户提交的 Anti-CSRF token 进行验证,通过比对
$_REQUEST['user_token']
和$_SESSION['session_token']
的值,防止跨站请求伪造攻击(CSRF); - 使用 htmlspecialchars() 函数对用户输入的 name 参数进行 HTML 实体编码,以避免客户端 JavaScript 的执行和 XSS 攻击;
- 输出经过处理的 name 参数,同时包裹在
<pre></pre>
标签中,使其能够以预格式化的方式显示,提升了输出信息的可读性。
另外,在该代码中也出现了一些与 CSRF 防御相关的函数调用:
generateSessionToken() 函数
用于产生随机的 Session Token,用于 CSRF 防御中防止攻击者利用各种手段获取到合法的 token 值;checkToken() 函数
用于验证用户提交的 Anti-CSRF token 是否合法。在其中,会比对用户提交的 token 值和服务器端存储的 token 值是否一致,如果不一致,则将会触发防御机制。
总结
以上为[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集,读者可躬身实践。
后续将分享[网络安全]DVWA之XSS(Stored)攻击姿势及解题详析合集
我是秋说,我们下次见。