WebGoat 8.0 M21失传几关的答案在这里
最近在研究OWASP WebGoat8.0,鲜鲜实验室有一篇文章特别好,从安装到攻略都有(传送)。但其中有几关这位大佬没有做出答案(但我做出来了),当然我在网上找了一些攻略也没有这几关的具体答案,所以把自己做的答案贴出来,给也在研究这个靶场的兄弟们作参考。
最后挑战WithoutAccount
这道题就是最后一关,页面的意思是投票,点击星星来决定投几星。
有意思的是,当我们点击星星之后提示我们需要登录才能投票,但这个页面并没有登录按钮。
我们来查看后台源码:
@GetMapping(value ="/vote/{stars}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity vote(@PathVariable(value ="stars") int nrOfStars, HttpServletRequest request) {
//Simple implementation of VERB Based Authentication
String msg = "";
if (request.getMethod().equals("GET")) {
HashMap json = Maps.newHashMap();
json.put("error", true);
json.put("message", "Sorry but you need to login first inorder to vote");
return ResponseEntity.status(200).body(json);
}
Integer allVotesForStar = votes.getOrDefault(nrOfStars, 0);
votes.put(nrOfStars, allVotesForStar + 1);
return ResponseEntity.ok().header("X-Flag", "Thanks forvoting, your flag is: " + Flag.FLAGS.get(8)).build();
}
查看了源码后发现,只要是GET请求都会返回失败。但这个GetMapping就是get提交的,所以我的思路是,使用其他方法提交请求绕过,先将GET改为POST提交。
失败了。
然后换成PUT,还是失败,之后换成HEAD,发现了flag。(就是这么简单)
所以这道题主要还是考对http协议的熟悉,假如就只知道提交方式GET,POST,PUT是做不出来的。
SQL Injection(mitigation)
这道题的意思是我们可以对下面四个主机排序,可以根据hostname,ip,mac,status,description等,对应的山下箭头就可以排序,但需要注意的是,下面的提交框不存在注入(题目也说明了)。最后我们要找到主机“webgoat-prd”的ip地址。
没什么好说的,直接抓包查看数据提交方式:
发现是get提交,对排序的参数直接写在后面了。我们放入repeater进行重放,查看相应包:
右侧就是排序的数据,目前已经按ip排序好了,我们可以尝试修改参数查看是否能排序:
可见已经按照id改好了,但id选项并没有在网页上。我们再根据提示简单构造一个逻辑语句:
可见已经按照ip排序了,我们将true换成false试试:
变成了根据ip排序,所以我们可以将true和false的位置换成逻辑语句,此处存在order by布尔盲注。WebGoat用的是HSQLDB,这个数据库貌似并没有类似mysql的information_schema库,所以表名只能暴力破解,使用逻辑语句:
exists(select * from table_name)
table_name就是需要暴力破解的地方。这道题的表是servers,相比不算难破解。(至少使用字典使用牛津的那本就可以,手动滑稽)
接下来直接构造逻辑语句就好
/WebGoat/SqlInjection/servers?column=(CASE+WHEN+((select+left(ip,1)+from+servers+where+hostname='webgoat-prd')='1')+THEN+id+ELSE+description+END)
最近在研究OWASP WebGoat8.0,鲜鲜实验室有一篇文章特别好,从安装到攻略都有(传送)。但其中有几关这位大佬没有做出答案(但我做出来了),当然我在网上找了一些攻略也没有这几关的具体答案,所以把自己做的答案贴出来,给也在研究这个靶场的兄弟们作参考。
最后挑战WithoutAccount
这道题就是最后一关,页面的意思是投票,点击星星来决定投几星。
有意思的是,当我们点击星星之后提示我们需要登录才能投票,但这个页面并没有登录按钮。
我们来查看后台源码:
@GetMapping(value ="/vote/{stars}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity vote(@PathVariable(value ="stars") int nrOfStars, HttpServletRequest request) {
//Simple implementation of VERB Based Authentication
内容来自无奈安全网
String msg = "";
if (request.getMethod().equals("GET")) {
HashMap json = Maps.newHashMap();
json.put("error", true);
json.put("message", "Sorry but you need to login first inorder to vote");
return ResponseEntity.status(200).body(json);
}
Integer allVotesForStar = votes.getOrDefault(nrOfStars, 0);
votes.put(nrOfStars, allVotesForStar + 1);
return ResponseEntity.ok().header("X-Flag", "Thanks forvoting, your flag is: " + Flag.FLAGS.get(8)).build();
本文来自无奈人生安全网
}
查看了源码后发现,只要是GET请求都会返回失败。但这个GetMapping就是get提交的,所以我的思路是,使用其他方法提交请求绕过,先将GET改为POST提交。
失败了。
然后换成PUT,还是失败,之后换成HEAD,发现了flag。(就是这么简单)
所以这道题主要还是考对http协议的熟悉,假如就只知道提交方式GET,POST,PUT是做不出来的。
SQL Injection(mitigation)
这道题的意思是我们可以对下面四个主机排序,可以根据hostname,ip,mac,status,description等,对应的山下箭头就可以排序,但需要注意的是,下面的提交框不存在注入(题目也说明了)。最后我们要找到主机“webgoat-prd”的ip地址。
没什么好说的,直接抓包查看数据提交方式:
发现是get提交,对排序的参数直接写在后面了。我们放入repeater进行重放,查看相应包:
右侧就是排序的数据,目前已经按ip排序好了,我们可以尝试修改参数查看是否能排序:
可见已经按照id改好了,但id选项并没有在网页上。我们再根据提示简单构造一个逻辑语句:
可见已经按照ip排序了,我们将true换成false试试:
内容来自无奈安全网
变成了根据ip排序,所以我们可以将true和false的位置换成逻辑语句,此处存在order by布尔盲注。WebGoat用的是HSQLDB,这个数据库貌似并没有类似mysql的information_schema库,所以表名只能暴力破解,使用逻辑语句:
exists(select * from table_name)
table_name就是需要暴力破解的地方。这道题的表是servers,相比不算难破解。(至少使用字典使用牛津的那本就可以,手动滑稽)
接下来直接构造逻辑语句就好
/WebGoat/SqlInjection/servers?column=(CASE+WHEN+((select+left(ip,1)+from+servers+where+hostname='webgoat-prd')='1')+THEN+id+ELSE+description+END)
www.wnhack.com
本文来自无奈人生安全网