山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(十五)

目录

一、任意文件读取漏洞

二、代码实现

2.1 FileRead.vue

2.2 FileReadController.java

三、界面展示


前言:本篇博客主要记录任意文件读取漏洞的靶场实现。

一、任意文件读取漏洞

任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。其中的目录遍历是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以是web根目录以外的文件),甚至执行系统命令。更严重的,导致SSRF漏洞,进而漫游至内网。

可以利用web漏洞扫描器(御剑等)扫描web应用进行检测,也可通过搜索,网站标题包含 “index of” 关键词的网站进行访问,手工探测等。

攻击者通过访问网站某一目录时,该目录没有默认首页文件或没有正确设置默认首页文件,将会把整个目录结构列出来,将网站结构完全暴露给攻击者; 攻击者可能通过浏览目录结构,访问到某些隐秘文件(如PHPINFO文件、服务器探针文件、网站管理员后台访问地址、数据库连接文件等)。简要来说就是老家被偷了。
 

二、代码实现

2.1 FileRead.vue

前端部分Vue代码如下:

<!--题目名字:FileRead-->
<!--题目类型:任意文件读取-->
<!--题目描述:任意文件读取型漏洞-->
<!--题目难度:4星-->
<template>
  <div class="menu">
    <el-row>
      <!-- 按钮菜单部分 -->
      <el-col :span="24">
        <el-menu
            :default-active="mypath"
            class="el-menu-demo"
            mode="horizontal"
            background-color="#fff"
            text-color="#000"
            active-text-color="#FF9912"
            @select="handleSelect"
        >
          <el-menu-item index="/honeypot">  </el-menu-item>
          <el-menu-item index="/abilitypromotion"></el-menu-item>
          <el-menu-item index="/forum" ></el-menu-item>
          <el-menu-item index="/navigation" >玄幻</el-menu-item>
          <el-menu-item index="/coursemanagement" >都市</el-menu-item>
          <el-menu-item index="/usermanagement" >仙侠</el-menu-item>
          <el-menu-item index="/usermanagement" >历史</el-menu-item>
          <el-menu-item index="/usermanagement" >游戏</el-menu-item>
          <el-menu-item index="/usermanagement" >排行</el-menu-item>

        </el-menu>
      </el-col>
    </el-row>
  </div>

  <div class="building">
    <el-card style="width: 60%;margin-left: 20%;margin-top: 2%">
      <el-row>
        <el-col :span="3">

        </el-col>
        <el-col :span="15" style="text-align: left">
          <h3>《三体》</h3>
        </el-col>
        <el-col :span="6">
          <el-button style="" @click="read1" type="warning" plain>详情</el-button>
        </el-col>
      </el-row>
      <el-divider style="background-color: lightgray"/>

      <el-row>
        <el-col :span="3">

        </el-col>
        <el-col :span="15" style="text-align: left">
          <h3>《明朝那些事儿》</h3>
        </el-col>
        <el-col :span="6">
          <el-button style="" @click="read2" type="warning" plain>详情</el-button>
        </el-col>
      </el-row>
      <el-divider style="background-color: lightgray"/>

      <el-row>
        <el-col :span="3">

        </el-col>
        <el-col :span="15" style="text-align: left">
          <h3>《我们仨》</h3>
        </el-col>
        <el-col :span="6">
          <el-button style="" @click="read3" type="warning" plain>详情</el-button>
        </el-col>
      </el-row>
      <el-divider style="background-color: lightgray"/>

      <el-row>
        <el-col :span="3">

        </el-col>
        <el-col :span="15" style="text-align: left">
          <h3>《flag在哪儿》</h3>
        </el-col>
        <el-col :span="6">
          <el-button style="" @click="read" type="warning" plain>详情</el-button>
        </el-col>
      </el-row>
      <el-divider style="background-color: lightgray"/>

      <el-row>
        <el-col :span="3">

        </el-col>
        <el-col :span="15" style="text-align: left">
          <h3>《解忧杂货店》</h3>
        </el-col>
        <el-col :span="6">
          <el-button style="" @click="read5" type="warning" plain>详情</el-button>
        </el-col>
      </el-row>
      <el-divider style="background-color: lightgray"/>

      <el-row>
        <el-col :span="3">

        </el-col>
        <el-col :span="15" style="text-align: left">
          <h3>《追风筝的人》</h3>
        </el-col>
        <el-col :span="6">
          <el-button style="" @click="read6" type="warning" plain>详情</el-button>
        </el-col>
      </el-row>
      <el-divider style="background-color: lightgray"/>

    </el-card>


  </div>

  <el-dialog v-model="show" title="书籍详情" width="30%">
    <p>{{content}}</p>
  </el-dialog>

</template>

<style scoped>
.building{
  /*background:url("src/assets/img/bugimg/download.jpg");*/
  width:100%;
  height:100%;
  position:fixed;
  background-size:100% 100%;
}

</style>

2.2 FileReadController.java

后端controller类如下:

@RestController
public class FileReadController {
    @Autowired
    DataSource dataSource;
    public String sql;

    @RequestMapping("/Read")
    public Result fileDownload(@RequestParam("filename") String filename,
                               @RequestParam("username") String username)
            throws IOException {
        System.out.println(filename+":ok");
        String text;
        Result res;

        //for flag
        //生成flag
        String problemid = "pro025";
        String flag = null;
        String flagMD5 = null;
        String flagBase64 = null;
        String flagPath = "D://test/flag/";  //引导的文件
        String flagPath1 = "/test/flag.txt";       //真正的flag

        try {
            String sql = "";
            Connection connection;
            PreparedStatement st;
            ResultSet rs;
            int row;

            connection = dataSource.getConnection();

            // 预编译
            sql = "select flag from flag where username = ? and problemid = ?";
            st = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            st.setString(1, username);
            st.setString(2, problemid);
            System.out.println(sql);
            rs = st.executeQuery();

            // 通过此对象可以得到表的结构,包括,列名,列的个数,列数据类型
            rs.last();
            row = rs.getRow();

            rs.beforeFirst();
            System.out.println("查找到行数为"+row);

            if(row==1){
                rs.next();
                flag = rs.getString("flag");
                System.out.println("flag已存在:"+ flag);
            }
            else {
                FlagMake flagMake = new FlagMake();
                flag = flagMake.getFlag();
                System.out.println("生成flag:"+ flag);
                //将flag MD5编码后存入数据库
                flagMD5 = MD5.getMD5String(flag);
                sql = "insert into flag (`username`, `problemid`, `flag`) values ('"+username+
                        "', '"+problemid+"', '"+flag+"');";
                System.out.println(sql);

                //PreparedStatement st1 = connection.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
                Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_UPDATABLE);

                stmt.executeUpdate(sql);
                // st1.executeUpdate();
            }

            rs.close();
            connection.close();

        } catch (SQLException e) {
            System.out.println("输入内容错误,数据库查询错误 in flag");
            System.out.println(e.toString());
            //return "输入内容错误,数据库查询错误";
        }

        saveAsFileWriter(flag,flagPath1);

        //读取前端传入的文件内容
        text = txt2String(flagPath+filename);
        System.out.println(text);

        res = new Result(Constants.CODE_200,null,text);
        return res;
    }

    /**
     * 读取文件内容
     * @param path 想要读取的文件路径
     * @return 返回文件内容
     */
    public static String txt2String(String path)
            throws IOException{
        File file;
        StringBuilder result;
        boolean flag = true;

        file = new File(path);/*文件名*/
        result = new StringBuilder();

        try{
            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
            String s = null;
            while((s = br.readLine())!=null){//使用readLine方法,一次读一行
                result.append(System.lineSeparator()+s);
            }

            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return result.toString();
    }

    /**
     * 写数据到txt文件
     * @param filePath 写入文件的路径
     * @param content 写入文件的数据
     */
    public static void saveAsFileWriter(String content,String filePath)
            throws IOException{
        FileWriter fwriter = null;
        try {
            // true表示不覆盖原来的内容,而是加到文件的后面。若要覆盖原来的内容,直接省略这个参数就好
            fwriter = new FileWriter(filePath);
            fwriter.write(content);
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                fwriter.flush();
                fwriter.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

}

三、界面展示

寻找flag的方法在这里就不展示了,只展示题目界面。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
油气SCADA网络安全靶场是为了评估和提高油气行业的SCADA系统对网络攻击的防御能力而创建的虚拟环境。SCADA系统是指监控和控制工业过程的计算机系统,而靶场是用于模拟实际网络环境和攻击场景的训练平台。 油气行业的SCADA系统在供气、输油、储气等方面起着重要作用,一旦遭受到网络攻击,可能导致供气系统中断、油管泄漏等严重后果。针对这种威胁,油气SCADA网络安全靶场被设计成一个实验环境,用于测试系统的弱点并针对可能的攻击进行演练。 油气SCADA网络安全靶场通常由虚拟化技术构建,包括模拟工业控制过程、仿真网络、安全设备等。通过在靶场中模拟真实的油气SCADA系统,可以对系统进行各种攻击测试,包括入侵、拒绝服务、数据篡改等。同时,靶场还提供了实时监控和日志记录功能,以便分析攻击的过程和损害。 通过使用油气SCADA网络安全靶场,油气行业可以评估其SCADA系统的安全性,并进行相关的改进和加固。实施网络安全演练和针对不同攻击场景的模拟,有助于提高系统管理员和操作人员的应急响应和处置能力。此外,靶场还可以用来培训网络安全专业人员,加强他们对油气行业SCADA系统的理解和保护技术。最重要的是,油气SCADA网络安全靶场的建立将为油气行业提供对网络威胁的认识和预防,提高整个行业的网络安全水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值