编辑
2024-03-20
web安全
00
请注意,本文编写于 322 天前,最后修改于 308 天前,其中某些信息可能已经过时。

目录

代码级别解析
low
源码
漏洞复现
Medium
源码
漏洞复现
High
源码
漏洞复现
Impossible
源码
漏洞复现

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

反射型XSS攻击需要具备以下条件:

  • 需要向web页面注入恶意代码;
  • 这些恶意代码能够被浏览器成功的执行
  • 用户交互

image.png

代码级别解析

low

源码

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> 进行尝试

image.png

Medium

源码

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>

High

源码

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>

image.png

image.png

Impossible

源码

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依然无法绕过

image.png 最新版本使用了一个替换< >的函数,目前无解

本文作者:Casear

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!