低级难度
源代码:
<?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>';
}
?>
可以看到系统直接使用了name参数,没有做任何过滤
<script>alert(/一个嚣张的XSS/)</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
echo "<pre>Hello ${name}</pre>";
}
?>
使用了str_replace
来把<script>
替换为空,但是可以双写绕过,并且str_replace
区分大小写,也可以大小写绕过
方法1:双写绕过
<sc<script>ript>alert(/一个嚣张的XSS/)</script>
方法2:大小写绕过
<scRipt>alert(/一个嚣张的XSS/)</script>
高级难度
源代码:
<?php
// 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>";
}
?>
可以看见系统用了正则匹配,道导致大小写和双写绕过失效,但是可以使用事件驱动,让靶机因为无法出现一个不存在的图片而出发错误,出现弹窗。
<img src=1 onerror=alert(/xss/)>
不可能难度
源代码:
<?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();
?>
系统使用了htmlspecialchars
把我们XSS要用到的一些预定义字符转化为HTML实体,导致无法再进行反射型XSS攻击。
预定义字符包括:"
、'
、<
、>
、&