2019-2020-2 20175218陈敬勇 《网络对抗技术》 Exp8 Web基础
2019-2020-2 20175218陈敬勇 《网络对抗技术》 Exp8 Web基础
一、实践要求
-
Web前端HTML
- 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
-
Web前端javascipt
- 理解JavaScript的基本功能,理解DOM。编写JavaScript验证用户名、密码的规则。
-
Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
-
Web后端:编写PHP网页,连接数据库,进行用户认证
-
最简单的SQL注入,XSS攻击测试
- 功能描述:用户能登陆,登陆用户名密码保存在数据库中,登陆成功显示欢迎页面。
二、实践原理
-
Web前端
- 编程语言:html/css/javascript(js)
- 运行环境:浏览器
-
Web后端
- 编程语言:PHP/JSP/.NET...
- 运行环境:应用服务器/中间件
-
数据库编程
- 编程语言:PHP/JSP/.NET相应的库,SQL语言
- 运行环境:数据库服务器
-
SQL注入
- 一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
-
XSS攻击
- 通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
三、实验步骤
任务一:Web前端HTML
- 首先,kali中,在管理员权限下,通过命令
service apache2 start
开启Apache服务
- 然后,桌面上右击,打开浏览器,在浏览器网址栏输入
127.0.0.1
,如果可以打开Apache的默认网页,则开启成功
- 在终端中,通过命令
cd /var/www/html
进入Apache目录下。然后输入命令vi 20175218_form.html
新建一个简单且含有表单的html文件,然后写入一下内容:
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head>
<body>
<h2 align="center">Login</h2>
<center>
<form action="login" method="post">
<input placeholder="E-mail" name="Name" class="user" type="email">
<br>
</br>
<input placeholder="Password" name="Password" class="pass" type="password">
<br>
</br>
<input type="submit" value="Login">
</form>
</center>
</body>
</html>
- 通过 wq 保存退出后,打开浏览器,在浏览器网址栏中输入
/var/www/html/20175218_form.html
回车打开网页如下图所示:
任务二:Web前端:javascipt
- 通过
vi 20175218_login_test.html
新建一个html文件,在原有的20175218_form.html
基础上,可以添加一段JavaScript代码,用来完成对用户是否填写用户名和密码的判断。写入20175218_login_test.html
的内容如下:
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h2 align="center">Login</h2>
<center>
<form action="login" method="post" name="form_login">
<input placeholder="E-mail" name="Name" class="user" type="email" onfocus="if (this.value=='Your email') this.value='';" />
<br>
</br>
<input placeholder="Password" name="Password" class="pass" type="password" onfocus="if (this.value=='Your password') this.value='';"/>
<br>
</br>
<input type="submit" value="Login" onClick="return validateLogin()"/>
</form>
</center>
<script language="javascript">
function validateLogin(){
var sUserName = document.form_login.Name.value ;
var sPassword = document.form_login.Password.value ;
if ((sUserName =="") || (sUserName=="Your email")){
alert("Please fill in User Email!");
return false ;
}
if ((sPassword =="") || (sPassword=="Your password")){
alert("Please fill in Password!");
return false ;
}
}
</script>
</body>
</html>
- 通过 wq 保存退出后,打开浏览器,在浏览器网址栏中输入
/var/www/html/20175218_login_test.html
回车打开网页如下图所示,如果没有输入邮箱和密码就提交的,网页会提示“Please fill in User Email!”;
- 或者只填写邮箱,没有输入密码的则会提示“Please fill in Password!”
任务三:Web后端:MySQL基础
- 首先,kali中,在管理员权限下,通过命令
/etc/init.d/mysql start
开启MySQL服务
- 然后,继续在管理员权限下输入命令
mysql -u root -p
,再输入默认的密码 password,登录 mysql
、
- 通过命令
show databases;
(注意:这里的命令后面需要添加一个;)查看数据库基本信息
- 通过命令
use mysql;
,选择使用名为 mysql 的这个数据库
- 通过命令
select user, password, host from user;
查看当前用户信息
- 通过命令
update user set password=PASSWORD("20175218") where user='root';
更改用户root的密码为20175218
- 再次通过命令
select user, password, host from user;
查看当前用户信息,可以发现root的password处已有信息
- 通过命令
flush privileges;
进行权限更新
- 通过命令
exit
退出,然后在管理员权限下输入命令mysql -u root -p
使用新密码进行登录
- 通过命令
create database cjy;
建立一个名为 cjy 的数据库
- 通过命令
show databases;
可以查看存在的数据库,发现刚刚创建的数据库也在
- 通过命令
use cjy;
使用刚刚创建的数据库cjy
- 通过命令
create table login (username VARCHAR(20),password VARCHAR(20));
建立数据库表,并设置字段基本信息。其中,表名为 login ,类型为 VARCHAR(20) 的两个字段 username 和 password
- 通过命令
show tables;
查看表的信息
- 通过命令
insert into login values('20175218cjy@163.com','20175218');
插入数据。其中,登录的email为 20175218cjy@163.com ,登录密码为 20175218
- 通过命令
select * from login;
查询表中的数据
- 通过命令
grant select,insert,update,delete on cjy.* to chenjingyong@localhost identified by "20175218";
在MySQL中增加新用户,将对数据库cjy的所有表的 select,insert,update,delete 权限授予当前主机 localhost 登录的用户chenjingyong,登录密码是20175218
- 增加新用户后,通过命令 exit 退出,然后在管理员权限下,使用新的用户名和密码进行登录,登录成功即说明成功增加新用户
任务四:Web后端:编写PHP网页,连接数据库,进行用户认证
- 继续在/var/www/html 目录下,通过命令 vi phptest.php 新建一个PHP测试文件,写入内容如下:
<?php
echo ($_GET["a"]);
include($_GET["a"]);
echo "Hello word! This is my php test page!<br>";
?>
- 通过 wq 保存退出后,打开浏览器,在浏览器网址栏中输入
localhost:80/phptest.php
,可看到文件的内容
- 还可以在浏览器网址栏中输入
localhost:80/phptest.php?a=/etc/passwd
,可看到 /etc/passwd 文件的内容
- 先通过命令 vi login.php 创建一个php文件,获取来自 20175218_login_test.html 的表单数据(下面还需要修改 20175218_login_test.html ),然后进行登录身份认证,写入内容如下:
<?php
$uname=$_POST["Name"];
$pwd=$_POST["Password"];
echo $uname;
$query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "chenjingyong", "20175218", "cjy");
$query_str1="use cjy;";
/* check connection */if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
echo "connection ok!";
/* Select queries return a resultset */if ($result = $mysqli->query($query_str1))
echo"<br>Success into database!";
echo$uname;
if ($result = $mysqli->query($query_str)) {
if ($result->num_rows > 0 ){
echo "<br> {$uname}:Welcome!!! <br> ";
}
else {
echo "<br> login failed!!!! <br> " ; }
/* free result set */
$result->close();
}
$mysqli->close();
?>
- 然后将 20175218_login_test.html 中的 action 改为 login.php ,即表单中数据将被送入 login.php 进行处理
- 通过 wq 保存退出后,打开浏览器,在浏览器网址栏中输入
127.0.0.1/login.php
直接跳转到 login.php 界面,可以发现连接成功,但是由于没有输入登录信息,所以 login 失败,如下所示:
- 在浏览器网址栏中输入
127.0.0.1/login_test.html
进入登录界面,输入正确的用户名和密码登陆,就可以成功登陆了
- 如果随便输入一个没有的邮箱以及密码,则会显示登陆失败
任务五:最简单的SQL注入,XSS攻击测试
SQL注入
- 在用户名输入框输入
' or 1=1#
,然后密码任意输入,就可登陆成功(这里遇到了一个问题,在后面进行阐述)
-
为啥能够这样登录呢?
-
原因就是:输入的用户名和我们的代码中 select 语句组合起来变成了 select * from user_login where username='' or 1=1#' and password='',#相当于注释符,会把后面的内容都注释掉,而1=1是永真式,所以这个条件永远成立。不管密码是否输入正确,都能够成功登陆
XSS攻击
- 将一张想要插入的图片放在/var/www/html目录下(我这里的是qyc.jpg)。然后在用户名输入框输入 ,随便输入密码,发现在网页中成功读取到图片
四、实验中遇到的问题
问题一
在进行SQL注入时,输入 ' or 1=1#
进行登录,报错需要email格式
解决方法: 出错后,检查 20175218_login_test.html ,发现写的type是email,所以填写时会检查格式是否是email格式。将其改为普通的文本格式text即可
五、实践思考
问题一
(1)什么是表单
答:对于表单,我首先想到的就是表格,但是不同于表格的简单含义。表单具有数据采集功能,在我们学习过网络安全编程基础后,我也知道大多数网页设计都需要用到表单,也就是form元素,主要包括表单标签、表单域、表单按钮三大组成部分
问题二
(2)浏览器可以解析运行什么语言。
答:对于浏览器,首先肯定是html语言,毕竟上学期可是写过很多的,然后还有XML、Python、PHP、JavaScript、ASP等。
问题三
(3)WebServer支持哪些动态语言
答:支持的动态语言主要就是PHP、ASP、JSP。其中,PHP是一种跨平台的服务器端的嵌入式脚本语言;ASP是一种服务器端脚本编写环境,可以用来创建和运行动态网页或Web应用程序;JSP是Sun公司推出的新一代网站开发语言,在Serverlet和JavaBean的支持下,可以完成功能强大的站点程序。
六、实验收获与感想
这次实验,总的来说不是很困难,但是做得还算比较顺利,稍微卡住的一处就是在SQL注入的时候,我开始想的是这个填入不就形成永真式了吗,为啥不行呢,这个之前课程老师都说过好多的啊,非常纳闷。直到后来提示需要email地址的格式,于是我就想起要去看看type,结果还真是这里,于是将其改为text成功解决问题。通过这一次实验,也让我对Web前端HTML和javascipt,以及Web后端的知识和SQL注入再一次熟悉了一遍(之前学过相关知识),还有就是对最简单的XSS攻击也了解了一些,收获颇丰。最后,希望在以后的实验中能够做得更好。