基础准备
VAPI介绍
vAPI是一款针对OWASP Top 10漏洞的练习靶场,vAPI项目是一个故意引入了多种漏洞的可编程接口API,广大研究人员可以利用vAPI来研究和练习OWASP Top 10漏洞。
安装(Docker)
git clone https://github.com/roottusk/vapi.git
cd vapi/
docker-compose up -d
安装完成默认后访问 http://IP:80/vapi/ 即可访问 vAPI。
Postman配置
Postman是一个独立的软件测试API(应用程序编程接口)平台,用于构建,测试,设计,修改和记录API。 这是一个简单的图形用户界面,用于发送和查看HTTP请求和响应。 使用Postman进行测试时,不需要编写任何HTTP客户端网络代码。 相反,构建了称为集合的测试套件,并让Postman与API进行交互。
导入 Collection
vAPI 编写了专门的测试 Collection,可方便我们导入和后续的测试。打开 PostMan,在 My Wordspace 中点击 Import,切换到 Link 导入,将 vAPI 为我们编写好的 Collection 导入。
Collection 文件链接:
https://raw.githubusercontent.com/roottusk/vapi/master/postman/vAPI.postman_collection.json
设置 host
导入成功后,随意选择一个请求,将光标移动到 {{host}} 上,然后点击 Add new variable 为 host 设置地址为 vAPI-IP : Port,并将 Scope 作用域设置为 Collection VAPI。
笔者 vAPI 安装环境为 http://10.211.55.10:8081/vapi/,设置 host 为 10.211.55.10:8081
安装时注意问题
1. [Warning] IPv4 forwarding is disabled. Networking will not work.
没有开启流量转发,Docker 网桥配置后,需要开启流量转发,不然容器没有网络。
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1 #添加此行配置
重启network服务
sudo systemctl restart network
2. 80端口被占用
vAPI默认绑定主机80、3306、8001端口,分别对应HTTP,MySQL,PHPMyAdmin,如果出现占用,需要修改 docker-compose.yml 文件中对应端口,如果能正常启动则无需修改。
version: "3.1"
services:
www:
build: .
ports:
- "80:80" # 可修改为8081:80
volumes:
- ./vapi:/var/www/html/vapi
........
db:
image: mysql:8.0
ports:
- "3306:3306" # 可修改为33060:3306
........
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- db:db
ports:
- 8001:80 # 可修改为8082:80
vAPI1
简单的 API 权限校验缺失导致的越权漏洞。
接口
API1 共有3个接口,分别为创建用户、获取用户信息、修改用户信息。
创建用户
传入用户名、姓名、课程、密码,创建成功返回创建信息。(下同)
获取用户信息(Flag获取接口)
将 api1_id 设置为刚刚返回的 id 名称,需要在 Headers 中设置 Authorization-Token,格式为 base64_encode(username:password)。
还有一种是不需要指定用户 id,直接使用 Token 对应 id,是市面上的主流方法。(下同)
修改用户
同样需要在 Headers 中设置 Authorization-Token,然后设置修改内容。(下同)
漏洞点
在获取了对象数据时,只要传入任一有效的 Authorization-Token,即可获取所有用户信息,查看 id 为1的用户信息即可拿到 flag。
查看关键验证代码可知,验证处只判断了用户名与密码是否匹配,没有判断用户是否匹配。属于越权漏洞。
$validuser = API1Users::where('username',$user->getUsername())->where('password',$user->getPassword())->count();
同理可知也能访问 update 修改任意用户信息。
简易应对措施
完善权限校验。
vAPI2
身份验证验证手段缺失导致的暴力破解。
接口
API2 共有2个接口,分别为用户登录、获取用户信息。
用户登录
使用 email 与 password 登录。
漏洞点
由文档提示找到 /Resouces 目录下的 creds.csv,可知是个暴力破解。
使用 BurpSuite 进行暴力破解,不必抓包,可以直接在 Postman 中点击 code 查看 HTTP 请求信息,然后填写到 BurpSuite 的 Intruder 模块。
Attack type 需要调整为 Pitckfork模式。这里回忆一下 Intruder 的四种攻击模式:
Sniper:只需要一组数据,一次只使用一个 payload 位置;
Battering ram:只需要一组数据,一次替换所有 payload 位置;
Pitchfork:为每个 payload 位置都指定数据,但替换时顺序一一对应;
Cluster bomb:为每个 payload 位置都指定数据,每个数据与其他所有数据对应。
需要取消两个 payload 的 URL-Encode,并且添加对应的处理逻辑:
email:删除","与其后所有字符;
password:反向截取8位。
爆破结果:
使用登录接口登录后拿到 token,放入 Authorization-Token 中使用获取用户信息接口拿到 flag
简易应对措施
添加登录验证码;
限制账号、IP登录次数。
vAPI3
过度信息暴露,在开发过程中,经验不足的程序员可能会将数据查询结果不做任何过滤,或包含在 JSON 的 Data 中返回给前端处理,或包含在 JSON 的 Data 中进行返回,导致敏感信息泄漏。
接口
这一关在 /Resouces 目录下有个 APK 文件安装。
漏洞点
直接对 APK 流量进行抓包,Flag 就在返回结果中。
简易应对措施
返回数据时,统一使用特定的 Wrapper 包裹,进行数据过滤;
在 DAO 层中指定非 JSON 序列化属性;
使用特定数据传输类。
vAPI4
缺少对资源和速率的限制。在这里新学了一个缩写 OTP,One Time Password,一次性密码,也就是市面上最常见的短信验证码。
更多安全相关缩写可以查阅:网络安全专业术语英文缩写对照表
接口
API4 共有3个接口,分别为手机登录、验证一次性密码、获取用户信息。
手机登录
只需要传入手机号,就会提示已将4位数字发送到手机号。
验证一次性密码
传入4位数字的一次性密码进行验证。
漏洞点
由于后台没有对访问速率与错误次数进行限制,导致暴力破解,这里指导一下4位数字 payload 的生成,就不演示了。
简易应对措施
限制错误次数;
增强复杂度。
vAPI5
功能权限认证缺陷。有些程序员为了方便,会将同样的业务抽离出两个不同的接口,以供不同的用户使用,比如所有用户访问 /userInfo 可以访问自己的用户信息,管理员访问 /userInfoList 可以查看所有用户信息,这样做的好处是不必在一个接口中同时完成筛选查找和批量查找,但这样的两个接口同样需要进行管理员权限认证,否则便会产生越权漏洞。
在开发时建议严格遵守 Restful 规范,例如:
/epics 表示资源合集,/epics/5 表示资源元素;
避免混用复数和单数形式,只应该使用统一的复数名词来表达资源;
使用名词而不是动词;
等。。。
更多可查阅 Restful API设计最佳实践
接口
API5 共有两个接口,分别为创建用户、获取用户信息。
漏洞点
因为分离出的管理员用来查看所有用户数据的 /users 接口没有进行管理员权限校验,只需要创建普通用户,然后使用普通用户即可查看所有用户数据。
简易应对措施
完善权限校验。
vAPI6
过度数据赋值。与 vAPI3 形成闭环,vAPI3是在返回过程中没有使用新建数据传输类或过滤,本题是因为在绑定传入参数时,没有新建数据传输类,直接使用了 DAO 层类进行绑定,并在更新数据库时没有指定修改字段,导致用户所有字段可控。比如普通用户在修改个人信息时可修改所有信息,比如将 roleID 等权限字段修改为与管理员相同,完成权限提升。
接口
API6 共有两个接口,分别为创建用户、获取用户信息。
获取用户信息
该关的用户信息多个 credit 字段。
漏洞点
credit 很明显是权限字段,创建新用户时直接传入 credit 为 100,然后使用新用户获取个人信息即可拿到flag。
简易应对措施
添加数据传输层;
添加权限校验;
抽离函数功能,指定修改字段。
vAPI7
因为没有配置 CORS 导致的 CSRF 漏洞,太过简单不做介绍。
接口
API7 共有4个接口,分别为创建用户、用户登录、获取Key、用户退出。
获取 Key
登录后直接访问该接口就可以获取该用户的敏感信息。
漏洞点
登录后,直接在 Get Key 接口添加任意 Origin 即可拿到 flag。
简易应对措施
添加 CORS
添加 CSRF_TOKEN
vAPI8
注入。
接口
API8 共有两个接口,分别为用户登录、获取Flag。
漏洞点
注入,直接传入 admin' or '1 即可登录拿到 authKey,然后使用 authKey 拿到 flag。
简易应对措施
预处理;
过滤特殊字符。
vAPI9
vAPI9 有 v2 版本。尽管有了更新更安全的 APIv2,但是有不少网站仍然暴露了老版 APIv1,其中可能存在漏洞。
接口
API9v2 只有一个接口,为用户登录。
用户登录
可以看出需要传入 username 与 4位数字的 pin 码。
漏洞点
尝试爆破,发现存在防爆破机制,当尝试次数过多则会返回500。
将 URL 中的 v2 改成 v1,爆破老版本 API,没有爆破机制,成功爆破 pin 为 1655,得到flag。
简易修复措施
停用老版本 API;
将老版本 API 放入内网。
vAPI10
这一关直接访问就能得到 Flag,目的是为了告诉我们,对 API 做日志管理与访问监控很重要。因为大多数 API 都没有配置监控与日志记录,这使得攻击者保持不被发现,从而允许他在系统中保持持久性,执行横向移动,并破坏重要的系统。