欢迎来到赛兔子家园

实战Pikachu XSS

跨站脚本攻击(XSS)

Xss简介

XSS的实质其实是HTML代码与Javscript代码的注入。

跨站点脚本(XSS)攻击是一种注入问题,其中恶意脚本被注入到原本良性和可信任的网站中。当攻击者使用Web应用程序将恶意代码(通常以浏览器端脚本的形式)发送给其他最终用户时,就会发生XSS攻击。允许这些攻击成功的缺陷非常普遍,并且会在Web应用程序中使用来自用户输入的输出(未经验证或编码)的任何地方发生。

攻击者可以使用XSS将恶意脚本发送给毫无戒心的用户。最终用户的浏览器无法知道该脚本不受信任,并将执行JavaScript。由于恶意脚本认为脚本来自受信任的来源,因此可以访问您的浏览器保留并与该站点一起使用的任何cookie,会话令牌或其他敏感信息。这些脚本甚至可以重写HTML页面的内容。

基于DOM的XSS是一种特殊情况,反映了JavaScript呈现在页面中时隐藏在URL中,并在页面中被JavaScript提取,而不是在提供服务时嵌入到页面中。与其他正在阅读页面正文的攻击和WAF或其他保护措施相比,这可以使它更隐秘。

一般XSS可以分为如下几种常见类型:

  • 反射型XSS
  • 存储型XSS
  • DOM型XSS

防范措施:

 一般会采用:对输入进行过滤、输出进行转义的方式进行处理

 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入

 输出转义:根据输出点的位置对输出到前端的内容进行适当转义

XSS修复建议

  • 不含有富文本编辑器(自定义样式)且没有使用DOM的站点:

  输入:过滤双引号,单引号,左右尖括号,分号。

  输出:对上述字符进行HTML实体编码即可。

  • 不含有富文本编辑器(自定义样式)但使用DOM的站点:

  输入:在DOM中转义双引号,单引号,左右尖括号,分号。

       输出:在输出之前进行编码,如:innerHTML=encodeHTML(output)

  • 含有富文本编辑器(自定义样式)但没有使用DOM的站点:

       输入:过滤双引号,单引号,分号。

       输出:对上述字符进行HTML实体编码即可。

  • 含有富文本编辑器(自定义样式)且使用DOM的站点:

   没办法…指哪儿修哪儿…

DOM型XSS的防御方法

 DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。

 其防御在于:

        (1) 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现

        (2) 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到则进行JS编码

1、反射型xss(get)

交互的数据一般不会被存在在数据库里面,只是简单的把用户输入的数据反射给浏览器,一次性,所见即所得。

<?php
  $name = $_GET['name'];
  echo "Welcome $name<br>";
?>

使用工具:火狐浏览器开发者工具,最新版本的谷歌浏览器对xss做了限制,在谷歌浏览器中攻击不会成功

 源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_reflected_get.php"){
    $ACTIVE = array('','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');

}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';


$html='';
if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>输入'kobe'试试-_-</p>";
    }else{
        if($_GET['message']=='kobe'){
            $html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
        }else{
            $html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";
        }
    }
}



?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">反射型xss(get)</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="管tmd什么xss,首先你应该输入kobe看一下再说">
                点一下提示~
            </a>

        </div>
        <div class="page-content">



            <div id="xssr_main">
                <p class="xssr_title">Which NBA player do you like?</p>
                <form method="get">
                    <input class="xssr_in" type="text" maxlength="20" name="message" />
                    <input class="xssr_submit" type="submit" name="submit" value="submit" />
                </form>
                <?php echo $html;?>
            </div>


        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';

?>

反射型xss(get)
View Code

源码分析:

前端通过input文本框接收用户输入数据,将用户输入保存到变量message中,后端代码通过$_GET['message']直接获取用户输入的值,没有对变量message进行检查过滤

最后直接将$_GET['message']返回到在前端页面展示,没有进行任何转义

用户可以任意输入恶意代码,例如:<script>alert(1)</script>,后端代码没有做任何处理直接返回到前端,导致了反射型xss的产生

查找漏洞步骤与方法:

文本框中输入正常的数据进行查询,查询结果正常显示

文本框中输入代码:<script>alert(1)</script>,发现后面script显示不全:<script>alert(1)</sc。首先猜测前端代码对输入内容长度做了限制

打开浏览器开发者工具查看前端代码:发现input中属性maxlenth=20即最多输入20个字符,果断修改给200然后输入:<script>alert(1)</script>

XSS漏洞验证

浏览器开发者工具内将前端对文本框中内容进行长度验证的maxlength=20属性值修改为200,然后在文本框中直接输入:<script>alert(1)</script>,提交后浏览器出现弹窗。

验证成功

2、反射型xss(post)

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_reflected_get.php"){
    $ACTIVE = array('','','','','','','','active open','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');

}

$PIKA_ROOT_DIR =  "../../../";

include_once $PIKA_ROOT_DIR.'inc/config.inc.php';
include_once $PIKA_ROOT_DIR.'inc/mysql.inc.php';
include_once $PIKA_ROOT_DIR.'inc/function.php';

include_once $PIKA_ROOT_DIR.'header.php';



$link=connect();
$is_login_id=check_xss_login($link);



if(!$is_login_id){

    header("location:post_login.php");

}

$state = '你已经登陆成功,<a href="xss_reflected_post.php?logout=1">退出登陆</a>';
$html='';
if(isset($_POST['submit'])){
    if(empty($_POST['message'])){
        $html.="<p class='notice'>输入'kobe'试试-_-</p>";
    }else{

        //下面直接将前端输入的参数原封不动的输出了,出现xss
        if($_POST['message']=='kobe'){
            $html.="<p class='notice'>愿你和{$_POST['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
        }else{
            $html.="<p class='notice'>who is {$_POST['message']},i don't care!</p>";
        }
    }
}



if(isset($_GET['logout']) && $_GET['logout'] == '1'){
    setcookie('ant[uname]','');
    setcookie('ant[pw]','');
    header("location:post_login.php");

}

?>




<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="../xss.php">xss</a>
                </li>
                <li class="active">xss概述</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="问题还是那个问题,只是提交方式变成了post,怎么利用?">
                点一下提示~
            </a>

        </div>
        <div class="page-content">



            <div id="xssr_main">
                <p class="xssr_title">Which NBA player do you like?</p>
                <form method="post">
                    <input class="xssr_in" type="text" name="message" />
                    <input class="xssr_submit" type="submit" name="submit" value="submit" />
                </form>
                <br />
                <?php echo $state;?>
                <br />
                <?php echo $html;?>
            </div>


        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR . 'footer.php';

?>
View Code

源码分析:

输入用户名:admin   密码:123456登录成功,登录成功后文本框中输入数据未做输入过滤和输出编码,导致xss产生。

查找漏洞步骤与方法:

需要登录后台后,文本框中输入xss攻击代码,获取cookie

XSS漏洞验证:

payload :<script>alert(document.cookie)</script>

获取成功:

3、存储型xss

将xss payload存放在数据库中,任何访问该留言板的用户都会受到攻击。

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_stored.php"){
    $ACTIVE = array('','','','','','','','active open','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

include_once $PIKA_ROOT_DIR."inc/config.inc.php";
include_once $PIKA_ROOT_DIR."inc/mysql.inc.php";


$link=connect();
$html='';
if(array_key_exists("message",$_POST) && $_POST['message']!=null){
    $message=escape($link, $_POST['message']);
    $query="insert into message(content,time) values('$message',now())";
    $result=execute($link, $query);
    if(mysqli_affected_rows($link)!=1){
        $html.="<p>数据库出现异常,提交失败!</p>";
    }
}


if(array_key_exists('id', $_GET) && is_numeric($_GET['id'])){

    //彩蛋:虽然这是个存储型xss的页面,但这里有个delete的sql注入
    $query="delete from message where id={$_GET['id']}";
    $result=execute($link, $query);
    if(mysqli_affected_rows($link)==1){
        echo "<script type='text/javascript'>document.location.href='xss_stored.php'</script>";
    }else{
        $html.="<p id='op_notice'>删除失败,请重试并检查数据库是否还好!</p>";

    }

}


?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">存储型xss</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="无用提示:这个留言板的框框是可以拉长和拉宽的,还行不,大兄弟!">
                点一下提示~
            </a>

        </div>
        <div class="page-content">

            <div id="xsss_main">
                <p class="xsss_title">我是一个留言板:</p>
                <form method="post">
                    <textarea class="xsss_in" name="message"></textarea><br />
                    <input class="xsss_submit" type="submit" name="submit" value="submit" />
                </form>
                <div id="show_message">
                    <br />
                    <br />
                    <p class="line">留言列表:</p>
                    <?php echo $html;
                    $query="select * from message";
                    $result=execute($link, $query);
                    while($data=mysqli_fetch_assoc($result)){
                        echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";
                    }

                    echo $html;
                    ?>



                </div>
            </div>



        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
View Code

源码分析:

实现功能留言板,前端页面显示文本框用户输入留言信息后点击提交按钮,留言信息自己保存到数据库,未进行任何过滤:

if(array_key_exists("message",$_POST) && $_POST['message']!=null){
  $message=escape($link, $_POST['message']);
  $query="insert into message(content,time) values('$message',now())";
  $result=execute($link, $query);
  if(mysqli_affected_rows($link)!=1){
      $html.="<p>数据库出现异常,提交失败!</p>";
  }
}

留言展示列表直接从数据库中获取留言信息展示,未进行任何处理:

<p class="line">留言列表:</p>
<?php echo $html;
  $query="select * from message";
  $result=execute($link, $query);
  while($data=mysqli_fetch_assoc($result)){
      echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";
}

  echo $html;
?>

查找漏洞步骤与方法:

文本框中输入:<script>alert("XSS")</script>,发现弹窗

XSS漏洞验证:

需求:获取任意浏览留言板列表用户的:cookie 

payload :<script>alert(document.cookie)</script>

留言文本框中输入:<script>alert(document.cookie)</script>

获取成功

 4、DOM型xss

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_dom.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

include_once $PIKA_ROOT_DIR."inc/config.inc.php";
include_once $PIKA_ROOT_DIR."inc/mysql.inc.php";


if(isset($_GET['text'])){
    $haha = "这里是后台的处理逻辑";
}

?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">DOM型xss</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="先到这里把什么是dom搞明白了在说http://www.w3school.com.cn/htmldom/">
                点一下提示~
            </a>

        </div>
        <div class="page-content">

            <div id="xssd_main">
                <script>
                    function domxss(){
                        var str = document.getElementById("text").value;
                        document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
                    }
                    //试试:'><img src="#" onmouseover="alert('xss')">
                    //试试:' onclick="alert('xss')">,闭合掉就行
                </script>
                <!--<a href="" onclick=('xss')>-->
                <input id="text" name="text" type="text"  value="" />
                <input id="button" type="button" value="click me!" onclick="domxss()" />
                <div id="dom"></div>
            </div>


        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
View Code

源码分析:

<script>
  function domxss(){
    var str = document.getElementById("text").value;
    document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";

        }

</script>

获取用户输入在文本框中输入的值,保存到str变量中,然后通过直接拼接到innerHTML="<a href='"+str+"'> 中<a href="">中,没有进行任何处理,导致DOM型XSS

查找漏洞步骤与方法:

 文本框在输入正常的内容,添加成功后,发现页面提示what do you see?是个a标签,通过源码发现: "<a href='"+str+"'>what do you see?</a>"直接将用户输入的值拼接到a标签的href属性中,导致了DOM行XSS

漏洞验证:

payload : ' onmouseover="alert('xss')">

将payload输入到文本框中,点击:

 5、DOM型xss-x

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_dom.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

include_once $PIKA_ROOT_DIR."inc/config.inc.php";
include_once $PIKA_ROOT_DIR."inc/mysql.inc.php";

$html='';
if(isset($_GET['text'])){
    $html.= "<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>";
}

?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">DOM型xss</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="dom型XSS是鸡肋吗?">
                点一下提示~
            </a>

        </div>
        <div class="page-content">

            <div id="xssd_main">
                <script>
                    function domxss(){
                        var str = window.location.search;
                        var txss = decodeURIComponent(str.split("text=")[1]);
                        var xss = txss.replace(/\+/g,' ');
//                        alert(xss);

                        document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
                    }
                    //试试:'><img src="#" onmouseover="alert('xss')">
                    //试试:' onclick="alert('xss')">,闭合掉就行
                </script>
                <!--<a href="" onclick=('xss')>-->
                <form method="get">
                <input id="text" name="text" type="text"  value="" />
                <input id="submit" type="submit" value="请说出你的伤心往事"/>
                </form>
                <div id="dom"></div>
            </div>

            <?php echo $html;?>


        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>
View Code

源码分析:

<script>
  function domxss(){
     var str = window.location.search;
     var txss = decodeURIComponent(str.split("text=")[1]);
     var xss = txss.replace(/\+/g,' ');

               document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";

}
</script>

与上面DOM不同之处使用了:window.location.search该属性获取页面 URL 地址。

查找漏洞步骤与方法:

同上

DOM型XSS-x漏洞验证:

payload  :' onclick="alert('xss')">

6、xss之盲打

存储型XSS,文本框中输入内容不会显示在当前页面,是一个留言功能,用户输入留言内容后,管理员登录后台查看留言。

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$PIKA_ROOT_DIR =  "../../../";

include_once $PIKA_ROOT_DIR.'inc/config.inc.php';
include_once $PIKA_ROOT_DIR.'inc/mysql.inc.php';


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "xss_blind.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');

}

include_once $PIKA_ROOT_DIR.'header.php';


$link=connect();
$html='';
if(array_key_exists("content",$_POST) && $_POST['content']!=null){
    $content=escape($link, $_POST['content']);
    $name=escape($link, $_POST['name']);
    $time=$time=date('Y-m-d g:i:s');
    $query="insert into xssblind(time,content,name) values('$time','$content','$name')";
    $result=execute($link, $query);
    if(mysqli_affected_rows($link)==1){
        $html.="<p>谢谢参与,阁下的看法我们已经收到!</p>";
    }else {
        $html.="<p>ooo.提交出现异常,请重新提交</p>";
    }
}




?>



<div class="main-content" xmlns="http://www.w3.org/1999/html">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="../xss.php">xss</a>
                </li>
                <li class="active">xss盲打</li>

            </ul><!-- /.breadcrumb -->
            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="登录后台,看会发生啥?后台登录地址是/xssblind/admin_login.php">
                点一下提示~
            </a>

        </div>
        <div class="page-content">
            <div id="xss_blind">
                <p class="blindxss_tip">请在下面输入你对"锅盖头"这种发型的看法:</p>
                <p class="blindxss_tip">我们将会随机抽出一名送出麻港一日游</p>
                <form method="post">
                    <textarea class="content" name="content"></textarea><br />
                    <label>你的大名:</label><br />
                    <input class="name" type="text" name="name"/><br />
                    <input type="submit" name="submit" value="提交" />
                </form>
                <?php echo $html;?>
            </div>
        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->


<?php
include_once $PIKA_ROOT_DIR.'footer.php';


?>
View Code

源码分析:

留言板功能,将用户输入的内容未经处理直接存放到数据库中,然后管理员登录查看留言列表信息,直接从数据库中读取,未做任何处理。

if(array_key_exists("content",$_POST) && $_POST['content']!=null){
  $content=escape($link, $_POST['content']);
  $name=escape($link, $_POST['name']);
  $time=$time=date('Y-m-d g:i:s');
  $query="insert into xssblind(time,content,name) values('$time','$content','$name')";
  $result=execute($link, $query);
if(mysqli_affected_rows($link)==1){
  $html.="<p>谢谢参与,阁下的看法我们已经收到!</p>";
}else {
  $html.="<p>ooo.提交出现异常,请重新提交</p>";
}
}

查找漏洞步骤与方法:

 留言板中输入xss注入语句后提交成功,没有报错,初步判断存在xss注入

漏洞验证:

 payload  : <script>alert(/xss/)</script>

 留言板文本框中输入:<script>alert(/xss/)</script>,提交成功。

 管理员登录后台查看留言板:http://192.168.10.7:85/pikachu-master/vul/xss/xssblind/admin.php

7、xss过滤

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_01.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');

}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';


$html = '';
if(isset($_GET['submit']) && $_GET['message'] != null){
    //这里会使用正则对<script进行替换为空,也就是过滤掉
    $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
    if($message == 'yes'){
        $html.="<p>那就去人民广场一个人坐一会儿吧!</p>";
    }else{
        $html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>";
    }

}


?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">xss之过滤</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="有些内容被过滤了,试试看怎么绕过?">
                点一下提示~
            </a>

        </div>
        <div class="page-content">

            <div id="xssr_main">
                <p class="xssr_title">阁下,请问你觉得人生苦短吗?</p>
                <form method="get">
                    <input class="xssr_in" type="text" name="message" />
                    <input class="xssr_submit" type="submit" name="submit" value="submit" />
                </form>
                <?php echo $html;?>
            </div>


        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';

?>
View Code

源码分析:

使用正则对<script进行替换为空

if(isset($_GET['submit']) && $_GET['message'] != null){
  $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);

查找漏洞步骤与方法:

输入:<script>alert("XSS")</script>发现被过滤了,返回>,查看源码发现过滤了小写的<script

漏洞验证

payload用大写即可绕过:<SCRIPT>alert(111)</SCRIPT>

输入:<SCRIPT>alert(111)</SCRIPT>

8、xss使用htmlspecialchars

源码

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_02.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');

}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

$html='';
$html1='';
$html2='';
if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>输入点啥吧!</p>";
    }else {
        //使用了htmlspecialchars进行处理,是不是就没问题了呢,htmlspecialchars默认不对'处理
        $message=htmlspecialchars($_GET['message']);
        $html1.="<p class='notice'>你的输入已经被记录:</p>";
        //输入的内容被处理后输出到了input标签的value属性里面,试试:' onclick='alert(111)'
//        $html2.="<input class='input' type='text' name='inputvalue' readonly='readonly' value='{$message}' style='margin-left:120px;display:block;background-color:#c0c0c0;border-style:none;'/>";
        $html2.="<a href='{$message}'>{$message}</a>";
    }
}


?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">xss之htmlspecialchars</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="先去查一下htmlspecialchars这个方法的含义">
                点一下提示~
            </a>

        </div>
        <div class="page-content">

            <div id="xssr_main">
                <p class="xssr_title">人生之所有苦短,是因为你的xss学习的还不够好</p>
                <form method="get">
                    <input class="xssr_in" type="text" name="message" />

                    <input class="xssr_submit" type="submit" name="submit" value="submit" />
                </form>
                <?php
                echo $html;
                echo $html1;
                echo $html2;
                ?>
            </div>

        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';

?>
View Code

源码分析:

 htmlspecialchars()是php里面把预定义的字符转换为HTML实体的函数:

    预定义的字符是:

  • & 成为 &amp
  • " 成为 &quot
  • ' 成为 &#039
  • < 成为 &lt
  • > 成为 &gt

使用了htmlspecialchars()进行处理:$message=htmlspecialchars($_GET['message']),将'转义成\

查找漏洞步骤与方法:

输入:' onclick='alert(111)'  发现讲'过滤成了\',只能通过js和事件注入。

漏洞验证

payload :javascript:alert(111)

payload  : ' onclick='alert(111)'

如图1:

如图2:

9、xss之href输出

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */

$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_03.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');

}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

$html='';

if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>叫你输入个url,你咋不听?</p>";
    }
    if($_GET['message'] == 'www.baidu.com'){
        $html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
    }else {
        //输出在a标签的href属性里面,可以使用javascript协议来执行js
        //防御:只允许http,https,其次在进行htmlspecialchars处理
        $message=htmlspecialchars($_GET['message'],ENT_QUOTES);
        $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
    }
}

?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">xss之href输出</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="a标签里面的href,img里面的src属性,有什么特殊的么">
                点一下提示~
            </a>


        </div>
        <div class="page-content">

            <div id="xssr_main">
                <p class="xssr_title">请输入一个你常用的网站url地址,我就知道你是什么人</p>
                <form method="get">
                    <input class="xssr_in" type="text" name="message" />

                    <input class="xssr_submit" type="submit" name="submit" value="submit" />
                </form>
                <?php
                echo $html;
                ?>
            </div>

        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->

<?php
include_once $PIKA_ROOT_DIR.'footer.php';

?>
View Code

源码分析:

输出在a标签的href属性里面,可以使用javascript协议来执行js
防御:只允许http、https、其次在进行htmlspecialchars处理

if(isset($_GET['submit'])){
  if(empty($_GET['message'])){
    $html.="<p class='notice'>叫你输入个url,你咋不听?</p>";
  }
  if($_GET['message'] == 'www.baidu.com'){
    $html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
  }else {
    //输出在a标签的href属性里面,可以使用javascript协议来执行js
    //防御:只允许http,https,其次在进行htmlspecialchars处理
    $message=htmlspecialchars($_GET['message'],ENT_QUOTES);
    $html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
}
}

查找漏洞步骤与方法:

 输入:<script>alert("XSS")</script> 报403错误

漏洞验证

payload :javascript:alert(111)

输入:javascript:alert(111)

10、xss之js输出

源码:

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */

$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_04.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');

}


$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';


$jsvar='';
$html='';


//这里讲输入动态的生成到了js中,形成xss
//javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义

//讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修?
//这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
//所以在JS的输出点应该使用\对特殊字符进行转义


if(isset($_GET['submit']) && $_GET['message'] !=null){
    $jsvar=$_GET['message'];
//    $jsvar=htmlspecialchars($_GET['message'],ENT_QUOTES);
    if($jsvar == 'tmac'){
        $html.="<img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/tmac.jpeg' />";
    }
}


?>

<div class="main-content" xmlns="http://www.w3.org/1999/html">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">xss之js输出</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="输入被动态的生成到了javascript中,如何是好。输入tmac试试-_-">
                点一下提示~
            </a>


        </div>
        <div class="page-content">

            <div id="xssr_main">
                <p class="xssr_title">which NBA player do you like?</p>
                <form method="get">
                    <input class="xssr_in" type="text" name="message" />

                    <input class="xssr_submit" type="submit" name="submit" value="submit" />
                </form>
                </br>
               <p id="fromjs"></p>
                <?php echo $html;?>
            </div>

        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->


<script>
    $ms='<?php echo $jsvar;?>';
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac确实厉害,看那小眼神..')
        }else {
//            alert($ms);
            $('#fromjs').text('无论如何不要放弃心中所爱..')
        }

    }


</script>


<?php
include_once $PIKA_ROOT_DIR.'footer.php';

?>
View Code

源码分析:

文本框中输入的值通过变量$jsvar,js展示在页面中

<script>
  $ms='<?php echo $jsvar;?>';
      if($ms.length != 0){
          if($ms == 'tmac'){
          $('#fromjs').text('tmac确实厉害,看那小眼神..')
      }else {
      // alert($ms);
      $('#fromjs').text('无论如何不要放弃心中所爱..')
}

}

</script>

查找漏洞步骤与方法:

输入:<script>alert(1)</script> 没有反应,初步怀疑是否被转义、或者是输出呢

打开浏览器开发者工具查看,发现是js输出,注入js代码

 漏洞验证

payload1:x'</script><script>alert('xss')</script>

payload2:';alert(1)//

 

posted on 2020-08-01 12:50  赛兔子  阅读(305)  评论(0编辑  收藏  举报

导航