Exp8 Web安全 20204308李文艳

1. 基础问题回答

1.1 什么是表单

  • 可填的框 搜集不同类型的用户输入 可收集用户输入的数据传至后台

  • 提交表单时所用的 HTTP 方法

  • GET方法:出现在URL中,eg:
    在这里插入图片描述

  • post方法:打包的方式,封装在数据里

1.2 浏览器可以解析运行什么语言

  • 非编程语言:HTML、CSS、XML
  • 编程语言:JavaScript、Python

1.3 Web Server支持哪些动态语言

服务器端就是后端范畴,支持PHP、JSP、.NET、数据库语言等。

1.4 防范注入攻击的方法有哪些

  • 限制用户的输入,如禁止一些特殊字符;
  • 对用户输入结果进行转码,避免特殊字符;
  • 严格过滤用户输入。

2. 实践总结与体会

通过本次实验,有两点是让我收获比较大的。
首先是实验是之前的学习补充,也是当前另一门课程学习的基础。大二的时候选修了《网站设计技术》了解了html、css、JavaScript等前端的内容,这次实验通过编写一个简单的网页,同时实现前端和后端,补充了曾经学习的一个空白。其次,现在学习的一门《信息系统分析与设计》课程需要我们做网页连数据库,这次实验也为该课程的任务实践打下了一个不错的基础。从本次实验我认识到去上手实践一个简单的小东西,能够让人更快地掌握实际的知识,也是实践出真知,从最简单的开始做起。
其次是实验再次增强了网络安全意识。通过对注入攻击的实践,让我进一步了解到了一些攻击的原理,引起了做网页时对安全性的思考。我想这是一种思维的培养,通过实践攻击引起我们的思考,比如在设计写代码的时候,如何去避免这攻击,去设计一个安全性、抗攻击性更好的代码。

3. 实践过程记录

3.1 Web前端HTML

3.1.0 对HTML,表单,GET与POST方法的理解

  • HTML:超文本标记语言,是一个显示的界面,其内容外加属性信息(mark)
  • 表单:可填的框,可收集用户输入的数据传至后端
  • GET与POST方法:提交表单时所用的两种HTTP 方法
    • GET方法:出现在URL中,eg:
      在这里插入图片描述
    • POST方法:打包的方式,封装在数据里

3.1.1 安装、启动Apache

安装Apache

sudo apt-get install apache2
sudo systemctl status apache2	//查看Apache状态

在这里插入图片描述

查看主机端口占用情况,发现Apache默认占用了80端口

sudo apt install net-tools
netstat -aptn

在这里插入图片描述
使用service apache2 start命令打开Apache服务
在这里插入图片描述
此时在浏览器输入 127.0.0.1,如果可以打开Apache的默认网页,则表示开启成功!
在这里插入图片描述

3.1.2 设计一个简单的html网页

输入cd /var/www/html,新建一个HTML文件login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="author" content="20204308李文艳" />
    <title>Title</title>
</head>
<style type="text/css">
    .divForm{
        position: absolute;/*绝对定位*/
        width: 300px;
        height: 200px;

        text-align: center;
        top: 50%;
        left: 50%;
        margin-top: -200px;
        margin-left: -150px;
    }
</style>
<body>
<div class="divForm">
    <h1 align="center">欢迎登录</h1>
    <form name="form1" method="post" action="index.php">
        <table border = "0">
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value="" /></td>
            </tr>
            <tr>
                <td>密&nbsp&nbsp&nbsp&nbsp码:</td>
                <td><input type="password" name="userpwd" value="" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交" onClick="return checkForm()"/> <input type="reset" value="重填" /></td>
            </tr>
        </table>
    </form>
</div>

</body>
</html>

使用浏览器打开制作的网页,在浏览器输入localhost/login.html
在这里插入图片描述

3.2 Web前端javascript & Web后端PHP

3.2.1 判断用户是否填写用户名和密码

login.html加上一段JavaScriptdiam,来判断用户是否填写了用户名和密码。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="author" content="20204308李文艳" />
    <title>Title</title>
</head>
<style type="text/css">
    .divForm{
        position: absolute;/*绝对定位*/
        width: 300px;
        height: 200px;

        text-align: center;
        top: 50%;
        left: 50%;
        margin-top: -200px;
        margin-left: -150px;
    }
</style>
<body>
<div class="divForm">
    <h1 align="center">欢迎登录</h1>
    <form name="form1" method="post" action="index.php">
        <table border = "0">
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value="" /></td>
            </tr>
            <tr>
                <td>密&nbsp&nbsp&nbsp&nbsp码:</td>
                <td><input type="password" name="userpwd" value="" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交" onClick="return checkForm()"/> <input type="reset" value="重填" /></td>
            </tr>
        </table>
    </form>
</div>

<script type="text/javascript">
    function checkForm(){	//定义javascript函数名
        if (form1.username.value == null || form1.username.value==""){	//判断表单用户名值是否合法
            alert("请输入用户名");	//弹窗警告
            return false;	//返回值false,阻止表单提交
        }
        if (form1.userpwd.value == null || form1.userpwd.value==""){	//判断表单用户名值是否合法
            alert("请输入密码");	//弹窗警告
            return false;	//返回值false,阻止表单提交
        }
        return true;
    }
</script>
</body>
</html>

使用浏览器打开制作的网页,在浏览器输入localhost/login.html,如果不填写用户名直接登陆,会提示“请输入用户名”。
在这里插入图片描述
没有输入密码
在这里插入图片描述

3.2.2 Web后端:验证用户名、密码的规则

编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”,
写一个用于接收用户登陆数据的index.php文件:

index.php:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome!</title>
</head>
<body>
<h1 align="center">欢迎!<?php echo $_POST['username'];?></h1>
</body>
</html>

在这里插入图片描述

3.3 Web后端:MySQL基础

3.3.1 安装、启动MySQL

输入 service mysql start 开启MySQL服务

输入 mysql -u root -p使用root权限进入,默认的密码是 password

show databases; 查看数据库基本信息
在这里插入图片描述

3.3.2 建库、建表

create database lwy_db;
use lwy_db;//使用数据库

在这里插入图片描述

用create table 表名 (字段设定列表);建立数据库表,并设置字段基本信息:

create table login (username VARCHAR(20),password VARCHAR(20));
insert into login values('204308lwy','666');

在这里插入图片描述

使用 select * from login; ,查询login表中的数据
在这里插入图片描述

3.3.3 创建用户、修改密码

在MySQL中增加新用户,使用指令

grant select,insert,update,delete on lwy_db.* to liwenyan@localhost identified by "20204308";

在这里插入图片描述

这句话的意思是将对某数据库的所有表的select,insert,update,delete权限授予某IP登录的某用户

增加新用户后,quit退出,然后使用新的用户名和密码进行登录

输入mysql -u liwenyan -p

登录成功,说明成功增加新用户
在这里插入图片描述

3.4 Web后端:编写PHP网页,连接数据库,进行用户认证

3.4.1 编写PHP网页

编写PHP网页sql.php,连接数据库。

sql.php:
<?php
$con=mysqli_connect("127.0.0.1","liwenyan","20204308","lwy_db");
if (!$con)
{
    die("Connection failed: " . mysqli_connect_error());
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style type="text/css">
    .divForm{
        position: absolute;/*绝对定位*/
        width: 300px;
        height: 200px;

        text-align: center;/*(让div中的内容居中)*/
        top: 50%;
        left: 50%;
        margin-top: -200px;
        margin-left: -150px;
    }
</style>
<body>
<div class="divForm">
    <h1 align="center">登陆界面</h1>
    <form name="form1" method="post" action="easy_sql.php">
        <table border = "0">
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value="" /></td>
            </tr>
            <tr>
                <td>&nbsp&nbsp&nbsp&nbsp码:</td>
                <td><input type="password" name="userpwd" value="" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td>
            </tr>
        </table>
    </form>
    <?php
    $username=$_POST["username"];
    $userpwd=$_POST["userpwd"];
    if($username&&$userpwd) {
        $result = mysqli_query($con, "select * from login where username='$username' and password='$userpwd'");
        $row = mysqli_fetch_array($result);
        if ($row) {
            echo "welcome!".$row['username'];
        } else {
            echo $username."是hacker!!!";
        }
    }
    ?>
</div>
</body>
</html>

对于login.html中的action修改为sql.php,然后我们进行验证。
在这里插入图片描述

在这里插入图片描述

3.4.2 验证

输入正确的用户名和密码进行登陆,表示欢迎。
在这里插入图片描述
进行用户认证,输入不存在的用户名和密码,显示是黑客。
在这里插入图片描述

3.5 SQL注入,XSS攻击测试

3.5.1 SQL注入

在这里插入图片描述
由此处代码可得,可在$username中输入' or 1=1#,可得:

$result = mysqli_query($con, "select * from login where username=''or 1=1#' and password='$userpwd'");

由此可得,1=1一定是正确的,#将后面的代码注释,因此可逃过检验。
在这里插入图片描述
可见,逃过了检验。
在这里插入图片描述

3.5.2 XSS攻击

在用户名输入<script>alert(1)</script>,密码随便输
在这里插入图片描述

3.6 选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例

3.6.1 webgoat安装

curl  -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - //添加Docker官方的GPG密钥
echo 'deb https://download.docker.com/linux/debian stretch stable'> /etc/apt/sources.list.d/docker.list //更新源
apt-get install apt-transport-https  ca-certificates  curl  gnupg2  software-properties-common // 直接导入证书
apt-get update //系统更新
sudo apt install docker.io //安装docker 
docker -v //检查docker安装是否成功

在这里插入图片描述

docker search webgoat
docker pull webgoat/webgoat-8.0
docker images
systemctl restart docker
docker run -dt --name webgoat -p 8080:8080 --rm webgoat/webgoat-8.0

在这里插入图片描述

然后访问 http://localhost:8080/WebGoat 即可。

3.6.2 SQL注入攻击

SQL Injection (advanced) 第3页
先拿到 user_data 表中的数据:jack' or '1'='1
在这里插入图片描述

再通过堆叠注入,拿到 user_system_data 表中的数据。z';select * from user_system_data;--
在这里插入图片描述

union selcect方式:

z' union select userid,user_name,user_name,user_name,password,cookie,userid from user_system_data--+

在这里插入图片描述

3.6.3 xss攻击

Cross Site Scripting 第7页
做测试,<script>alert(20204308);</script>成功执行了 JS 代码,说明这里确实存在 xss 漏洞。
在这里插入图片描述

因此构造了恶意链接如下:

http://192.168.191.128:8080/WebGoat/CrossSiteScripting/attack5a?QTY1=1&QTY2=1&QTY3=1&QTY4=1&field1=%3Cscript%3Ealert(20204308)%3B%3C%2Fscript%3E&field2=111

将弹出的字符改成xss

<script>alert('xss')</script>

在这里插入图片描述

也可以将带有攻击性的url作为输入源,使得服务器跳到相应的错误页。

3.6.4 CSRF攻击

第8页
该任务主要就是假借别人的名义,干一些事情。

这关任务是在保持当前页面(页面1)打开的情况下,在新页面(页面2)上创建以csrf-为前缀的新用户,并以该新用户登录。然后在页面2上点击下图这个solved按钮。
在这里插入图片描述
显示成功完成任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值