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方法:打包的方式,封装在数据里
- GET方法:出现在URL中,eg:
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>密    码:</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>密    码:</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>密    码:</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按钮。
显示成功完成任务。