网络安全大作业2--XSS攻击

继续问大佬同学要来的作业,这次的研究对象是xss

XSS攻击研究

XSS,全称是Cross Site Scripting(跨站脚本攻击),为了不和CSS名字重叠,于是起了这样的名字。XSS攻击正如名字中提到的那样,在用户访问的web页面中插入我们的恶意脚本,对网站或者其他用户的访问进行干扰,或者泄露一些重要信息,从而达到恶意攻击的目的。

这次的作业提供的源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<html>
<head>
<meta charset="utf-8">
</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: dashed 1px #ccc;
margin: 4px;
}
</style>
<script type="text/javascript" src="/js/cookies.js"></script>
<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
require('/components/comments.php');
if(!empty($_POST['name'])){
<!--添加新的评论-->
addElement($_POST['name'],$_POST['comment']);
}
<!--展开评论列表-->
renderComments();
?>
</div>
</form>
</body>
</html>

仔细看会发现,这里提到的

  • /js/cookies.js
  • /components/comments.php
    这两个文件我手上都是没有的……看起来除了搭建环境,还得自己写一点简单的代码…

环境选择

环境选择了wamp,Windows下的Apache+Mysql/MariaDB+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件,能够快速的搭建在本地的服务

代码编写

其实说起来,比起写代码,xss好像更简单一点,但是既然要实现这个功能,那么还是得写一下这几个文件的。。由于本人web白痴,接下来写的都是些简单的学习过程,想要继续看实验过程的请跳过。。。

Cookies.js

上w3cshool中了解到,一般js中会在这个文件中写一些关于cookie存储和读取的函数,比如getCookie,checkCookie,setCookie之类的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function set_cookie(c_name, name, expire_days) {
// body...
var day = new Date()
day.setDate(day.getDate() + expire_days)
// ad escape to duel with utf-8
document.cookie = c_name + "="+escape(name) +
((expire_days == null)? "":";expire_days="+day.toGMTString())
}
function get_cookie(c_name){
if (document.cookie.length>0){
var start = document.cookie.indexOf(c_name + "=")
if(start!=-1){
start += c_name.length + 1
var end = document.cookie.indexOf(";", start)
if (end == -1) end = document.cookie.length
return unescape(document.cookie.substring(start, end))
}
}
return ""
}
function check_cookie(name){
username = get_cookie("name")
if(username == ""){
set_cookie("name", name, 1)
}
}

菜鸡参考着w3cschool写的。。。

Comments.php

这是个php(菜鸡也不会php呀QvQ)从代码上看,我们需要实现两个函数:

  • addElement()
  • renderComments()
    那么我一边学习php一边写一下吧。。。。
    addElement的作用应该是将当前的数据加入到一个全局的array变量里面。
    renderComments的作用则是将当前的评论输出。
    1
    2
    3
    4
    5
    6
    7
    <?php
    $entries = array();
    public function addElement($name='', $comment ='')
    {
    $entries[$name] = $comment
    }
    ?>

后来意识到,渲染这个动作应该是每次提交一次都要进行的,而却更重要的是发现,action会将我们的请求提交到一个叫做list.php的文件里面!这就意味着,我们必须要在list.php中存储数据,然后comments.php只不过是一个展示数据的函数(?)
不管怎么说,逻辑好像都不太对…这里只好先硬着头皮吧renderComments写完:

1
2
3
4
5
6
7
8
9
10
11
12
13
public function renderComments($value='')
{
echo "<table border="1">"
foreach ($entries as $name =>$comment) {
echo "<tr>";
echo "<td>".$entity;
echo "<tr>".$comment;
echo "</tr>";
}
echo "</table>"
}
?>

好艰难的写完了这一段。。。。后来还发现,php的global对象必须要在函数内生命了global才能够当成全局变量使用