《网络对抗技术》——Exp8 Web综合
《网络对抗技术》——Exp8 Web综合
目录
- 一、实践内容
- 二、实践原理
- 三、实践过程记录
- 1、Web前端HTML
- 2、Web前端JavaScript
- 3、Web后端:MySQL基础
- 4、Web后端:编写PHP网页,连接数据库,进行用户认证
- 5、最简单的SQL注入、XSS攻击测试
- SQL注入
- XSS攻击
- 6、选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例
- SQL注入攻击——字符串型注入
- XSS攻击——XSS钓鱼
- CSRF攻击——跨站请求伪造
- 四、实践基础问题回答
- 五、实践心得体会
一、实践内容
-
Web前端HTML
- 能正常安装、启停Apache
- 理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML
-
Web前端JavaScipt
-
- 理解JavaScript的基本功能,理解DOM
-
- 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”
- 尝试注入攻击:利用回显用户名注入HTML及JavaScript
-
Web后端:MySQL基础——正常安装、启动MySQL,建库、创建用户、修改密码、建表
-
Web后端:编写PHP网页,连接数据库,进行用户认证
-
最简单的SQL注入,XSS攻击测试
-
选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例
二、实践原理
-
WebGoat
- WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。
-
SQL注入攻击原理
- SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
- Web应用对后台数据库查询语句处理存在的安全漏洞。即为:在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查,例如:
',--,#
这些特殊字符 - 后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。
-
XSS攻击
- XSS跨站脚本。攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
- 攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
-
CSRF攻击
- CSRF :跨站请求伪造。即冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器;
- 主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码防御。
三、实践过程记录
1、Web前端HTML
- kali默认已安装Apache,直接使用 service apache2 start命令打开Apache服务即可。
- 使用service apache2 status 查看服务情况
此时在浏览器输入 127.0.0.1,如果可以打开Apache的默认网页,则表示开启成功!
因为在此使用的是wsl的kali,我们使用主机浏览器,访问wslip即可,注意,相互ping
开启成功!
使用 cd /var/www/html进入Apache目录下,新建一个简单的含有表单的html文件 form.html,内容如下:
注意,需在管理员模式下新建HTML文件
在浏览器中输入 ip/form.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>
2、Web前端JavaScript
- 编写JavaScript验证用户名、密码的规则。在原有 form.html 基础上,可以添加一段JavaScript代码,以完成对用户是否填写邮箱和密码的判断。修改后的 login.html 如下所示:
<html>
<head>
<title>CryptoTeam</title>
<!-- Meta tag Keywords -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Meta tag Keywords -->
</head>
<body>
<!-- main -->
<!--//header-->
<h2>Login Quick</h2>
<form action="login" method="post" name="form_login">
<input placeholder="E-mail" name="Email" 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>
<!--//main-->
<script language="javascript">
function validateLogin(){
var sUserName = document.form_login.Email.value ;
var sPassword = document.form_login.Password.value ;
if ((sUserName =="") || (sUserName=="Your email")){
alert("user email!");
return false ;
}
if ((sPassword =="") || (sPassword=="Your password")){
alert("password!");
return false ;
}
}
</script>
</body>
</html>
在浏览器访问 ip/login.html
如果用户邮箱填写不正确,网页会出现以下提示:
PS:在此换成了chrome浏览器,不知道为啥火狐浏览器弹不出来......
3、Web后端:MySQL基础
这部分因为wsl的mysql难以下载,所以我们使用了kali
- 输入 service mysql start开启MySQL服务
- 输入 mysql -u root -p使用root权限进入,默认的密码是 password
show databases; 命令查看数据库基本信息
use mysql; 选择使用mysql这个数据库
select user, password, host from user; 查看当前用户信息
-
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword'; 修改密码
-
flush privileges; 更新权限
-
exit 退出数据库,使用新的密码登录
-
create database lyx; 建立数据库
-
show databases; 查看存在的数据库
-
use 数据库名称; 使用我们创建的数据库
-
create table login (username VARCHAR(20),password VARCHAR(20)); 建立数据库表,并设置字段基本信息。这里使用varchar类型而不是char类型,原因为char类型指定大小后会预分配固定大小,不管是否使用空间都被占用;varchar类型则根据实际应用的大小占据空间。
-
show tables; 查看表信息
-
insert into login values('20201317lyx@qq.com','20201317'); 插入数据
-
select * from 表名; 查询表中的数据
GRANT select,insert,update,delete
ON lyx.*
TO lyx@localhost //可以是localhost,也可以是远程登录方式的IP
identified by "20201317";
GRANT select,insert,update,delete ON lyx.* TO lyx@localhost identified by "20201317";
登录成功,说明成功增加新用户
Web后端:编写PHP网页,连接数据库,进行用户认证
因为习惯于用主机的win系统版本,所以我改用了主机进行编写,然后具体工具如下:
mysql+apache:phpstudy
sql连接软件:navicat
代码编辑器:vscode
-
在 /var/www/html 目录下新建一个PHP测试文件phptest.php
-
<?php echo ($_GET["a"]); include($_GET["a"]); echo "Hello 20201317lyx!<br>"; ?>
在浏览器网址栏中输入 localhost:80/phptest.php
也可以在浏览器网址栏中输入 http://localhost/phptest.php?a=test.txt,可看到文件的内容
编写包含PHP网页,连接数据库
login.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="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>
</body>
</html>
easy_sql源码
根据上述系统描述,进行代码撰写
<?php
$con=mysqli_connect("127.0.0.1","root","123456","1317lyx");
if (!$con)
{
die("Connection failed: " . mysqli_connect_error());
}
$username=$_POST["username"];
$passwd=$_POST["passwd"];
if($username&&$passwd) {
$result = mysqli_query($con, "select * from user_info where username=$username and password=$passwd;");
$row = mysqli_fetch_array($result);
if ($row) {
echo "welcome!".$row['username'];
} else {
echo $username."是hacker!!!";
}
}
?>
访问login.html
进行用户认证,输入不存在的用户名adminadmin
和密码123456
进行用户认证,输入存在的用户名20201317
和密码20201317
(6).选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例。
这里我选择的是buuctf平台
SQL:[RCTF2015]EasySQL
先进行初步探索
能点击的都点击一遍
然后我们发现在register上有过滤
明显我们如果正常输入email格式(@)的发现报错
我们就在username那里加一些小东西,小符号,先尝试找到注入点
这里注意,一般使用#,/,这种能在sql语句中起到明显作用的,可以多尝试几次
发现成功登进去了
但实际上这意味着,1'已经存在某个变量里了,我们试图用这个变量
就发现了一个很神奇的地方--->修改密码
我一开始也找了很长时间,发现没啥注入点
实际上这是一个类似结合两个步骤的注入,需要注册作铺垫
一旦修改密码,就以为着需要用username变量,进行数据库的更新操作
发现报错了!,这就意味着我们基本找到了可以注入的地方
具体考察点就是sql二次注入
select * from user where username=" 111"\" and password='~'
之前也尝试过使用单引号,但是因为单引号在这其中与之前的”无法闭合,导致了找不到注入点
这样我们找到了注入点和回显点,这里的报错信息就是回显点
我们根据sql语句继续进行针对性注入
这里不知道怎么回退,没办法只能重开环境了.......
为了方便重新输入语句,我们使用burpsuite抓包,具体下载安装可以找github工具(需要对应jar版本)
这里编码了,没关系,我们继续
成功写进去了!
这里可能有一些过滤,我们可以提前使用burp字典或者手动输入,进行黑名单猜测,可以大概率明确了我们使用报错注入,extractvalue就是一个sql函数,可以通过报错,把重要信息回显出来。
123"||(updatexml(1,concat('~',(select(database()))),1))#
当我们进行修改密码时,会发现,库!,被我们查到了
根据这个方法,我们就可以对数据详细查询了
这里说明一下,我们可以通过删除session会话的方式,重新回到注册界面
最后的语句:
123"||(updatexml(1,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f')),1))#
123"||(updatexml(1,concat('~',reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))),1))#
xss:buuctf:BUU XSS COURSE 1
进去后,随便提交些什么
按照路径找一找
被呈现上去了,我们使用最简单的alert语句试试
访问一下这个地址,发现并没有弹窗,感觉是把script过滤了,那我们尝试植入img图像标签
看来是可以进行xss攻击,打开xss平台,找一个关于img标签的语句
发现监听到了!
复制标灰的cookie,并访问一下右侧的/backend/admin.php
成功!
CSRF:buuctf:34C3CTF 2017 urlstorage
RPO(Relative Path Overwrite)
RPO(Relative Path Overwrite)相对路径覆盖,主要是利用浏览器的一些特性和部分服务端的配置差异导致的漏洞,通过一些技巧,我们可以通过相对路径来引入其他的资源文件,以至于达成我们想要的目的。
利用方法
- 加载任意目录下静态资源文件,就是通过相对路径加载不同路径下的其他同名js/css文件。
- 将返回内容按静态文件解析,在很多使用了url_rewrite的php开发框架以及python web框架中,经常使用相对路径来加载静态资源文件,而且url都有一个特征。比如/rpo/user/id/1,这里表示使用参数为id,值为1的内容访问user接口;比如/rpo/user.php/name/tester,这里表示使用参数name,内容为tester的内容访问user.php文件等
使用docker安装webgoat
拉取镜像
运行
修改一下,加上端口映射再运行
步骤
注册登录
-
在菜单栏中选择Cross‐Site Scripting,展开页面中选择Cross Site Request Forgery (CSRF)
-
查看页面右侧Parameters中的src和menu值,分别为2078372和900
我们以这个题目为例
题目的意思是在登录Webgoat的情况下通过一个外部的源触发请求,在响应中便能拿到flag。
先点击Submit Query
,得到响应:
这里提示我们当前这个请求是从同一个源发出的,查看headers
:
这里有三个属性:
- Host表示请求的目的地,包括域名和端口号
- Origin表示请求是从哪发起的,包括协议、域名、端口号
- Referer表示当前页面的来源完整地址,包括协议、域名、查询参数
这里我们用burpsuite抓包后尝试修改Origin
为一个外部网站:
还是不行,修改refer
成功!
四、实践基础问题回答
1、什么是表单?
- 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分:
- 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
- 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
- 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
2、浏览器可以解析运行什么语言?
- 支持HTML(超文本标记语言)以及CSS、JavaScript等众多脚本语言。
3、WebServer支持哪些动态语言?
- 比较常用的三种动态网页语言有PHP(HypertextPreprocessor)、ASP(ActiveServerPages)、JSP(JavaServerPages)。
- ASP全名ActiveServerPages,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的、互动的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(Javascript)作为自己的开发语言。
- JSP是Sun公司推出的新一代网站开发语言,Sun公司借助自己在Java上的不凡造诣,将Java从Java应用程序和JavaApplet之外,又有新的硕果,就是JSP,JavaServerPage。JSP可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。
- PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面。
4、防范注入攻击的方法有哪些?
-
SQL注入攻击
-
- 使用正则表达式过滤传入的参数。
- 关闭或删除不必要的交互式提交表单页面。
- jsp中调用函数检查是否包函非法字符,做好规范的校验工作,比如搜索框不能输入非法字符、限制输入的长度等。
- 使用prepared statements语句绑定变量来执行SQL字符串。没有使用prepared statements语句绑定变量可能很容易受到攻击。
-
XSS攻击
- 特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击;
- 对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤;
- 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie;
- 使用验证码:防止脚本冒充用户提交危险操作。
-
CSRF攻击
- 验证请求中的Token,每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。
- 验证 Referer,因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断 referer 头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击(虽然同站的csrf更难)。
- 添加加随机验证,每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
实践体会
在进行web综合实验的过程中,我深刻体会到了网络安全的重要性以及学习网络安全知识的必要性。以下是我的实践学习心得。
首先,我认为对于网络安全知识的学习,理论知识和实践操作同等重要。只有通过实践操作,才能更加深入地理解理论知识,并且更好地掌握实践技能。在进行web综合实验的过程中,我需要利用各种工具进行漏洞扫描、信息收集、密码破解等操作。通过这些实践操作,我能够更好地理解网络安全攻防的基本原理,同时也提高了我的实践技能。
其次,在进行web综合实验的过程中,我也深刻认识到了网络安全的脆弱性。现在的网络安全技术虽然越来越先进,但是仍然存在着各种漏洞和安全隐患。只有不断学习和提高自己的网络安全知识,才能更好地保护自己的网络安全。
最后,我认为在进行web综合实验的过程中,需要注重实践的安全性。在进行实验操作时,需要遵守相关的法律法规和道德准则,不得利用所学知识进行非法活动。同时,在进行漏洞扫描和攻击测试时,需要注重安全性,避免对目标系统造成不必要的损失。
总之,web综合实验是一次非常有意义的学习经历,通过实践操作,我不仅提高了自己的网络安全知识和技能,同时也深刻认识到了网络安全的重要性。同时也尝试了在buuctf上进行Web题的练习,更好地掌握了Web攻击中的SQL注入、XSS和CSRF,也知道了在Web安全方面我们还有许许多多可以学习的内容,总的说来收获满满。我相信,在今后的学习和工作中,这些经验和收获都会对我产生积极的影响。