20212304 2021-2022-2 《网络与系统攻防技术》实验八实验报告

20212304YPH 2024-05-23 22:59:33

1.实验内容

(1)Web前端HTML

能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。

(2)Web前端javascipt

理解JavaScript的基本功能,理解DOM。在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”。尝试注入攻击:利用回显用户名注入HTML及JavaScript。

(3)Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表

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

(5)最简单的SQL注入,XSS攻击测试 

(6)安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。

2.实验过程

(1)Web前端HTML

HTML是用于创建网页的标准标记语言。它使用各种标签(tags)来描述网页的结构和内容。这些标签可以被浏览器解析并呈现为网页上的文本、图片、链接、列表、表格等。

在HTML中,表单是用于收集用户输入数据的工具。表单可以包含各种输入字段,如文本框、密码框、复选框、单选按钮、提交按钮等。用户填写表单并提交后,表单数据可以发送到服务器进行处理。

GET和POST是HTTP协议中用于发送表单数据的两种主要方法,它们在处理表单数据时有一些区别:

GET方法POST方法
数据附加在URL的查询字符串中发送数据在HTTP请求的正文中发送
数据量有限制(取决于浏览器和服务器)没有数据量的严格限制(但取决于服务器配置)
数据在URL中可见,因此不适合发送敏感信息(如密码)数据不在URL中可见,适合发送敏感信息
主要用于获取(检索)数据,但也可以用于发送数据主要用于发送(提交)数据,但也可以用于获取数据

service apache2 start       //打开apache2

netstat -aptn      //查看端口使用情况

 可以看到80端口被Apache2监听

 然后利用kali自带的浏览器访问 127.0.0.1:80(本机地址+设置监听的端口号),验证apache已经开启

编写一个含有表单的HTML

cd /var/www/html       //进入目录

vim login.html         //创建文件

</head>
<body>
<form action="login.php" method="post" name="myform">
<ul>
<li>Username:<input type="text" name="name" id="name" /></li>
<li>Passward:<input type="text" name="pw" id="age" /></li>
<li><input type="submit" id="bt"/></li>
</ul> 
</form>
</body>

打开浏览器,输入http://127.0.0.1:80/login.html

(2)Web前端javascipt

JavaScript 是一种轻量级的解释型或即时编译型的编程语言,主要用于增强网页的交互性。JavaScript 可以(1)直接更改 HTML 元素的内容、属性、样式等。通过事件监听器(2)响应用户的点击、按键、鼠标移动等交互行为(3)用来控制浏览器的某些行为,如打开新窗口、导航到新页面、滚动到页面上的某个位置等(4)动态地创建新的 HTML 元素,并将它们添加到 DOM 中(5)处理复杂的数据结构,如数组和对象,以及执行各种计算任务。

JavaScript 支持异步编程,这意味着它可以执行不阻塞用户界面的长时间运行的任务,如网络请求。它还提供了 Web Storage API(如 localStorage 和 sessionStorage),允许在浏览器中存储和检索数据。

DOM 是 HTML 和 XML 文档的编程接口,它表示文档的结构,使得 JavaScript 可以对文档中的元素和内容进行操作。DOM 将文档转换为一个由节点(如元素节点、属性节点、文本节点等)组成的树形结构。

vim 2304login.html

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
</head>
<html>
<script type="text/javascript">
	function lgcheck() {
		//判断用户名是否为空
		if(form1.username.value==""||
				form1.password.value==""){
			alert("用户名或密码不能为空!")
		}else{
			document.write("欢迎"+form1.username.value)
		}
	}
</script> 
<body>

<form name="form1" action="login" method="post">
Username:<br>
<input type="text" name="username" value="yph20212304">
<br>
Passward:<br>
<input type="password" name="password" value="2304">
<br><br>
<input type="button" value="Submit" onclick="lgcheck()">
</form> 

</body>
</html>

打开浏览器,输入http://127.0.0.1:80/2304login.html

<p>20212304HTML注入</p>

 <script type="text/javascript"> alert("20212304JavaScript注入") </script>

(3)Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表

sudo systemctl start mysql      //启动mysql服务

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

use mysql      //进入mysql数据库

ALTER USER 'root'@'localhost' IDENTIFIED BY '20212304';     //修改用户root的密码

flush privileges;      //更新权限,输入 exit 退出后用修改后的密码登录

create database yph;          //创建数据库yph

show databases;         //查看已有的数据库

use yph;        //进入数据库yph

create table login_table (username VARCHAR(20),password VARCHAR(20));     //在数据库内建立名为login_table的新表,设置username和password两个字段,类型为varchar

show tables;     //查看表的信息

insert into login_table values('2304','yph');       //向login_table表中插入数据

CREATE USER '2304'@'localhost' IDENTIFIED BY 'yph';        //新建用户2304是新建的用户名,双引号内yph是新用户密码

GRANT SELECT, INSERT, UPDATE, DELETE ON yph.* TO '2304'@'localhost';    //赋予用户2304在yph数据库上执行查询、插入、修改、删除操作的权限

flush privileges;        //更新权限

SELECT * FROM login_table;         //看表中新增的数据

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

vim login.php        //新建一个php文件

<?php
$uname=$_POST["name"];//这里的应为login.html表单项输入内容的name
$pwd=$_POST["pw"];//同上
echo $uname;
$query_str="SELECT * FROM login_table where username='$uname' and password='$pwd';";//这里login_table即是数据库中新建的表的名字
$mysqli = new mysqli("127.0.0.1", "2304", "yph", "yph");//这里先后是本机地址,数据库用户名,对应密码,数据库名称

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
echo "connection ok!<br>";
/* Select queries return a resultset */
if ($result = $mysqli->query($query_str)) {
    if ($result->num_rows > 0 ){
            echo "<br>Welcome!!! <br> ";
    } 
    else {
        echo "<br> login failed!!! <br> " ; }
    /* free result set */
    $result->close();
}
$mysqli->close();
?>

打开浏览器,输入http://127.0.0.1:80/login.html,输入正确的用户名2304,密码yph

 输入错误的用户名或密码

(5)最简单的SQL注入,XSS攻击测试 

SQL注入是一种代码注入技术,它允许攻击者在SQL查询中插入恶意SQL代码,从而干扰应用程序的正常逻辑,可能导致未经授权的访问、数据泄露或其他恶意操作。

用户名输入'or 1=1,查询会变成:SELECT * FROM users WHERE username = 'or 1=1 AND password = '输入的密码',SQL中的逻辑运算符优先级 AND 高于 or,查询实际会变为:SELECT * FROM users WHERE (username = 'OR 1=1) AND password = '输入的密码';

密码任意输入,可以成功登录。

XSS 攻击允许攻击者在受害者的浏览器中执行恶意脚本,从而窃取用户的敏感信息(如会话令牌、cookies 等),或者执行其他恶意操作。

将一张图片放在/var/www/html目录下,使用 chomd 777 1.jpeg 提权

用户名输入<img src="1.jpeg(图片名)" />,密码任意输入

 登录失败,可以看到图片

(6)安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击

WebGoat 就是 OWASP 发行的的用于进行 Web 漏洞实验的应用平台

apt-get install docker.io             //安装Docker

docker --version            //查看Docker版本并检查是否安装成功

 docker pull webgoat/webgoat-8.0         //下载容器

docker images         //查看容器是否下载成功

sudo docker run -p 8081:8081 -t webgoat/webgoat-8.0         //运行WebGoat

 打开浏览器,输入http://127.0.0.1:8081/WebGoat,注册登录

SQL注入:利用查询链(分号;)破坏数据完整性,即修改非授权数据 

法一:通过TAN框进行SQL注入

Name框:Smith

TAN框:3SL99A';UPDATE employees SET salary=200000 WHERE last_name='Smith

假设原始的SQL查询为:SELECT * FROM customers WHERE name = 'Smith' AND tan = '用户输入的TAN',当攻击者输入上述TAN值时,SQL查询会变成:SELECT * FROM customers WHERE name = 'Smith' AND tan = '3SL99A';UPDATE employees SET salary=200000 WHERE last_name='Smith'因为大多数数据库系统不会允许在SELECT查询中直接跟随一个UPDATE语句,如果后端代码在处理查询时存在逻辑错误或使用了某些特殊的数据库特性,那么这个恶意的UPDATE语句可能还是会被执行。

法二:

Name框:Smith';UPDATE employees SET salary=200000 WHERE last_name='Smith';-- ss

TAN框:不填

注释(--)注释掉了原始查询中的剩余部分,假设原始的SQL查询为:SELECT * FROM customers WHERE name = '用户输入的名字' AND tan = '用户输入的TAN';当攻击者输入上述Name值后:SELECT * FROM customers WHERE name = 'Smith';UPDATE employees SET salary=200000 WHERE last_name='Smith';-- ss' AND tan = '用户输入的TAN';由于--之后的文本被当作注释处理了,所以原始的' AND tan = '用户输入的TAN';部分被忽略了。这样,数据库就只会执行恶意的UPDATE语句,将名字为“Smith”的员工的薪水修改为200,000。

XSS攻击:

在credit cart number框中输入:<script  type="text/javascript">alert('XSS')</script>

CSRF攻击:

 是在登录Webgoat的情况下通过一个外部的源触发请求,在响应中便能拿到flag。点击提交查询,得到响应:

 当前这个请求是从同一个源发出的,查看头

  • Host表示请求的目的地,包括域名和端口号
  • Origin表示请求是从哪发起的,包括协议、域名、端口号
  • Referer表示当前页面的来源完整地址,包括协议、域名、查询参数

 用burpsuite抓包后修改Referer

3.问题及解决方案

问题1:表单文字乱码

 解决方法:使用英文或修改配置Ubuntu Apache服务器中文乱码问题解决方法_ubuntu apache2 网页中文乱码-CSDN博客,在html文件中添加<meta charset="UTF-8">

4.学习感悟

随着科技的飞速发展,Web前端与后端技术已成为现代软件开发不可或缺的一部分,这次关于Web前端与后端技术的实验,通过亲手搭建环境、编写代码、测试安全漏洞,我深刻体会到了Web开发的魅力与挑战。在测试SQL注入和XSS攻击时,我深刻感受到了后端安全的脆弱性。通过简单的注入语句和跨站脚本攻击,我能够轻易地获取到数据库中的敏感信息或执行恶意代码。这让我意识到后端安全的重要性不亚于前端安全,甚至更加关键。Web安全不仅仅是技术问题,更是意识和态度问题。在开发过程中,我们必须时刻保持警惕,遵循安全规范,避免引入安全隐患。我将继续深入学习Web开发技术,我也将关注Web安全领域的最新动态和技术趋势。

参考资料

Kali 2021.2 安装并配置WebGoat (Docker 和 Release两种方式)_kaili2021安装webgoat-CSDN博客

渗透测试 | Webgoat8 CSRF 超详细通关题解 - 简书 (jianshu.com)

...全文
41 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

87

社区成员

发帖
与我相关
我的任务
社区描述
网络攻防作业
网络安全 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧