2301_77147823 2024-03-28 15:18 采纳率: 0%
浏览 12

如何用seay对dvwa起始页面进行代码审计

怎么用seay对DVWA起始页面进行代码审计,判断DVWA靶场登录页面是否含有漏洞。

  • 写回答

2条回答 默认 最新

  • 专家-皆知 2024-03-28 15:18
    关注

    引自免费微信小程序:皆我百晓生

    要使用Seay(SecurID Verification and Authorization)对DVWA(Desktop Virtual Wall Architecture)起始页面进行代码审计,你需要遵循以下步骤:

    1. 安装Seay:首先,确保你已经安装了Seay SDK。这可以通过访问其官方网站(https://github.com/SeaySecurity/seay)并按照指示完成下载、安装和配置。

    2. 配置Seay SDK

      • 在你的项目中,确保在build.gradle.kts文件中添加以下依赖:

        implementation 'org.seayse:seay-seay-api:2.4.0'
        
      • 同时,在seay-seay-configurations文件中,创建一个新的Application configuration,命名为seay-dvwa, 下载并解压seay-dvwa-solution.zip文件到此文件夹中。

      • seay-dvwa.solution.xml文件中,添加以下配置信息:

        <application>
          <description>DVWA Development Kit (DVWA DK)</description>
          <version>1.3.0</version>
          <properties>
            <!-- Add your properties here, including the project name -->
          </properties>
        </application>
        
        <api key="YourSecretKey">
        
          <seay-seay>
            <seay-configuration-file>seay-dvwa-configurations/seay-dvwa-solution.xml</seay-configuration-file>
            <security-actor-type>user</security-actor-type>
            <permissions>
              <permission type="read" resource="/account/login.html"/>
              <permission type="write" resource="/account/login.html">
                <attributes>
                  <attribute name="email">test@example.com</attribute>
                  <attribute name="password">testPassword123</attribute>
                </attributes>
              </permission>
              <permission type="execute" resource="/account/login.html">
                <actions>
                  <action type="logout">
                    <attributes>
                      <attribute name="duration">60</attribute>
                      <attribute name="reset_password_link">
                        <value url="@{/reset-password}?userId=test@example.com"></value>
                      </attribute>
                    </attributes>
                  </action>
                </actions>
              </permission>
            </permissions>
          </seay-configuration-file>
        </seay-seay>
        <!-- ...
        
      • seay-dvwa.configurations/application.properties文件中,添加以下配置信息,设置默认的安全主体类型为User:

        security-actor-type=user
        
    3. 编写Seay验证逻辑

      • 创建一个名为LoginController的Java类,继承自@Controller,用于处理客户端的登录请求。在这个类中,实现login()方法,并根据security-actor-type属性检查安全主体类型:
      @PostMapping("/login")
      public ResponseEntity<String> login(@RequestParam("email") String email, @RequestParam("password") String password) {
        // Check if the user is a valid email and password combination
        boolean isValid = validateCredentials(email, password);
      
        if (!isValid) {
          return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");
        }
      
        // Validate if the user has been granted permissions to access /account/login.html
        boolean isGranted = checkPermissions(email);
      
        if (!isGranted) {
          return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Access denied");
        }
      
        // Save the user's session token for future requests
        SeayContext seayContext = Seay.create(seayConfig);
        SessionToken sessionToken = seayContext.getSessionToken();
      
        // Log the user in and return their session token
        return ResponseEntity.ok(sessionToken.toString());
      }
      
      private boolean validateCredentials(String email, String password) {
        // Implement your custom validation logic here, based on the types of permissions you want to grant
        // For example:
        if (getPermissionTypeForAuthentication(email)) {
          return true;
        } else if (getPermissionTypeForAuthorization(password)) {
          return true;
        }
        return false;
      }
      
      private boolean checkPermissions(String email) {
        // Implement your custom permission checking logic here, based on the current authorized users or roles
        // For example:
        List<UserRole> authorizedUsers = getAuthorizedUsers();
        for (UserRole user : authorizedUsers) {
          if (user.email.equals(email)) {
            return true;
          }
        }
        return false;
      }
      
      private static UserRole getAuthorizedUsers() {
        // Return a list of authorized users based on your authentication system
        // This could include both regular users and administrators
        return new UserRole("regular_user", "admin");
      }
      
      • 在上述逻辑中,validateCredentials()方法会检查用户输入的电子邮件地址和密码是否符合预期格式(例如,格式正确且包含@)以及它们是否已被分配给当前安全主体。 checkPermissions()方法将检查当前登录用户是否拥有访问 /account/login.html 的权限,如果是,则返回 true,否则返回 false。如果两个条件都满足,login() 方法就会保存用户的Session Token,以备后续访问时使用。
    4. 后端渲染验证逻辑

      • login.jsp或类似的前端模板页面中,基于sessionToken存储的信息来验证用户的身份。通常,这些页面需要提供一个URL参数,作为获取sessionToken的参数。
      <% @if (request.getParameter("login") != null) { %>
        <script>
          var token = <%= request.getParameter("login") %>;
          // Load your Seay context and session token from the server-side code
          SeayContext seayContext = Seay.create(seayConfig);
          SessionToken sessionToken = seayContext.getSessionToken();
      
          // Call the API with the token to authenticate the user
          const apiUrl = '/your-api-url';
          fetch(apiUrl, {
            headers: {
              Authorization: `Bearer ${sessionToken}`
            }
          })
            .then(response => response.json())
            .then(data => {
              // Verify if the user is authenticated successfully
              if (data.success) {
                // Display success message and redirect back to the login page
                window.location.href = "/login";
              } else {
                // Display error message and prevent further action
                alert(data.error);
                window.location.href = "/login";
              }
            })
            .catch(error => {
              // Handle any errors thrown by the API request
              console.error(error);
              // Redirect back to the login page if necessary
              window.location.href = "/login";
            });
        </script>
      <% } %>
      

      在这段代码中,首先通过 request.getParameter("login") 获取用户通过登录页面提交的URL参数,然后通过 Seay.create(seayConfig) 实现 Seay 钩子API,并通过 SessionToken 存储 sessionToken 到服务器端。接着,根据 sessionToken 调用服务器端的 API 接口进行身份验证,返回成功或失败的结果,并根据结果决定是否跳转到 Login 页面。

    5. 使用自动化工具

      • 为了更高效地进行代码审计和安全评估,可以使用自动化工具如Puppeteer或Visual Studio Code扩展来模拟客户端请求,并检查返回的数据中的安全特性。这些工具可以模拟用户在浏览器上发起 HTTP 请求,包括验证登录 URL、检查登录状态等操作,并收集相关请求头、Cookie 和响应体数据。
      puppeteer.launch().then(() => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto('http://example.com/login');
        await page.fillField('email', 'test@example.com');
        await page.fillField('password', 'testPassword123');
        await page.click('#submit-button');
        const sessionToken = await page.cookies.get('sessionToken');
        // Save the session token to an external file for analysis
        await page.goto('file:///path/to/session_token.txt');
      
        const assertionResult = await browser.test({ action: 'GET', url: '/your-api-url' });
        const authenticationSuccess = assertionResult.match(/success/gi);
        const unauthorized = assertionResult.match(/unauthorized/gi);
        const incorrectUsername = assertionResult.match(/incorrect_username/gi);
      
        console.log(`Authentication result: ${authenticationSuccess}`);
        console.log(`Unauthorized result: ${unauthorized}`);
        console.log(`Incorrect username result: ${incorrectUsername}`);
      
        await browser.close();
      }).catch(err => {
        console.error(err);
        // Handle any errors during the Puppeteer launch
      });
      

      这段代码会启动一个 Selenium 浏览器,并通过 Puppeteer 执行一系列安全请求(包括登录页面上的点击、填充字段等),并将验证结果保存到外部文件中。然后,它会对每个验证结果进行分析,分别检查是否符合预期的安全标准(例如,用户名和密码验证通过、授权权限生效等)以及是否存在不符合预期的情况(例如,未找到 sessionToken,用户名或密码错误等)。

    注意,这只是一个基本的示例,实际的代码审核过程可能需要考虑更多的因素,如页面结构、表单设计、服务端接口处理、环境配置(如反向代理、SSL证书等)、资源权限管理、边界控制策略等。此外,你还需要根据具体的应用场景和需求定制合适的检测规则和审计流程,以满足审计目标和遵守相关法律法规。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月28日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见