反射型XSS可以用来窃取cookie
Low
输入1111进行测试,发现1111被打印
输入<script>alert(document.cookie)</script>
,出现弹窗,获得cookie
Medium
查看后端代码,发现对<script>
进行了转义,但是可以通过双写,大小写等进行绕过
<?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
$html .= "<pre>Hello {$name}</pre>";
}
?>
High
观察后端代码,“*” 代表一个或多个任意字符,“i” 代表不区分大小写,<script>
标签被完全过滤。但是我们可以通过其他的标签例如 img、body 等标签的事件注入。
参考XSS Payload List
<?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>";
}
?>
eg:<img src = 1 onerror = alert(document.cookie)>
Impossible
观察后端代码使用 htmlspecialchars 函数将参数中的特殊字符(如 <, >, &, " 等)转换为 HTML 实体。
<?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
$html .= "<pre>Hello {$name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
我们打印一下输入<script>alert(document.cookie)</script>
转义后的字符串
这样浏览器会将其作为普通文本显示,而不是执行。
防御
1.http-only禁止js语句获取cookie
2.过滤输入的字符,例如 “ ’ ”,“ " ”,“<”,“>” 等非法字符;
3.对输入到页面的数据进行编码