freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

vAPI-API漏洞靶场通关指南
2022-05-06 23:24:18
所属地 湖北省

基础准备

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。

img

Postman配置

Postman是一个独立的软件测试API(应用程序编程接口)平台,用于构建,测试,设计,修改和记录API。 这是一个简单的图形用户界面,用于发送和查看HTTP请求和响应。 使用Postman进行测试时,不需要编写任何HTTP客户端网络代码。 相反,构建了称为集合的测试套件,并让Postman与API进行交互。

导入 Collection

vAPI 编写了专门的测试 Collection,可方便我们导入和后续的测试。打开 PostMan,在 My Wordspace 中点击 Import,切换到 Link 导入,将 vAPI 为我们编写好的 Collection 导入。

img

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

img

img

安装时注意问题

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 权限校验缺失导致的越权漏洞。

img

接口

API1 共有3个接口,分别为创建用户、获取用户信息、修改用户信息。

创建用户

传入用户名、姓名、课程、密码,创建成功返回创建信息。(下同)

img

获取用户信息(Flag获取接口)

将 api1_id 设置为刚刚返回的 id 名称,需要在 Headers 中设置 Authorization-Token,格式为 base64_encode(username:password)。

还有一种是不需要指定用户 id,直接使用 Token 对应 id,是市面上的主流方法。(下同)

img

修改用户

同样需要在 Headers 中设置 Authorization-Token,然后设置修改内容。(下同)

img

漏洞点

在获取了对象数据时,只要传入任一有效的 Authorization-Token,即可获取所有用户信息,查看 id 为1的用户信息即可拿到 flag。

img

img

查看关键验证代码可知,验证处只判断了用户名与密码是否匹配,没有判断用户是否匹配。属于越权漏洞。

$validuser = API1Users::where('username',$user->getUsername())->where('password',$user->getPassword())->count();

同理可知也能访问 update 修改任意用户信息。

img

简易应对措施

  • 完善权限校验。

vAPI2

身份验证验证手段缺失导致的暴力破解。

img

接口

API2 共有2个接口,分别为用户登录、获取用户信息。

用户登录

使用 email 与 password 登录。

img

漏洞点

由文档提示找到 /Resouces 目录下的 creds.csv,可知是个暴力破解。

img

使用 BurpSuite 进行暴力破解,不必抓包,可以直接在 Postman 中点击 code 查看 HTTP 请求信息,然后填写到 BurpSuite 的 Intruder 模块。

img

Attack type 需要调整为 Pitckfork模式。这里回忆一下 Intruder 的四种攻击模式:

  1. Sniper:只需要一组数据,一次只使用一个 payload 位置;

  2. Battering ram:只需要一组数据,一次替换所有 payload 位置;

  3. Pitchfork:为每个 payload 位置都指定数据,但替换时顺序一一对应;

  4. Cluster bomb:为每个 payload 位置都指定数据,每个数据与其他所有数据对应。

img

需要取消两个 payload 的 URL-Encode,并且添加对应的处理逻辑:

  • email:删除","与其后所有字符;

  • password:反向截取8位。

img

img

爆破结果:

img

使用登录接口登录后拿到 token,放入 Authorization-Token 中使用获取用户信息接口拿到 flag

img

img

简易应对措施

  • 添加登录验证码;

  • 限制账号、IP登录次数。

vAPI3

过度信息暴露,在开发过程中,经验不足的程序员可能会将数据查询结果不做任何过滤,或包含在 JSON 的 Data 中返回给前端处理,或包含在 JSON 的 Data 中进行返回,导致敏感信息泄漏。

img

接口

这一关在 /Resouces 目录下有个 APK 文件安装。

漏洞点

直接对 APK 流量进行抓包,Flag 就在返回结果中。

简易应对措施

  • 返回数据时,统一使用特定的 Wrapper 包裹,进行数据过滤;

  • 在 DAO 层中指定非 JSON 序列化属性;

  • 使用特定数据传输类。

vAPI4

缺少对资源和速率的限制。在这里新学了一个缩写 OTP,One Time Password,一次性密码,也就是市面上最常见的短信验证码。

更多安全相关缩写可以查阅:网络安全专业术语英文缩写对照表

img

接口

API4 共有3个接口,分别为手机登录、验证一次性密码、获取用户信息。

手机登录

只需要传入手机号,就会提示已将4位数字发送到手机号。

img

验证一次性密码

传入4位数字的一次性密码进行验证。

img

漏洞点

由于后台没有对访问速率与错误次数进行限制,导致暴力破解,这里指导一下4位数字 payload 的生成,就不演示了。

img

简易应对措施

  • 限制错误次数;

  • 增强复杂度。

vAPI5

功能权限认证缺陷。有些程序员为了方便,会将同样的业务抽离出两个不同的接口,以供不同的用户使用,比如所有用户访问 /userInfo 可以访问自己的用户信息,管理员访问 /userInfoList 可以查看所有用户信息,这样做的好处是不必在一个接口中同时完成筛选查找和批量查找,但这样的两个接口同样需要进行管理员权限认证,否则便会产生越权漏洞。

在开发时建议严格遵守 Restful 规范,例如:

  • /epics 表示资源合集,/epics/5 表示资源元素;

  • 避免混用复数和单数形式,只应该使用统一的复数名词来表达资源;

  • 使用名词而不是动词;

  • 等。。。

更多可查阅 Restful API设计最佳实践

接口

API5 共有两个接口,分别为创建用户、获取用户信息。

漏洞点

因为分离出的管理员用来查看所有用户数据的 /users 接口没有进行管理员权限校验,只需要创建普通用户,然后使用普通用户即可查看所有用户数据。

img

简易应对措施

  • 完善权限校验。

vAPI6

过度数据赋值。与 vAPI3 形成闭环,vAPI3是在返回过程中没有使用新建数据传输类或过滤,本题是因为在绑定传入参数时,没有新建数据传输类,直接使用了 DAO 层类进行绑定,并在更新数据库时没有指定修改字段,导致用户所有字段可控。比如普通用户在修改个人信息时可修改所有信息,比如将 roleID 等权限字段修改为与管理员相同,完成权限提升。

img

接口

API6 共有两个接口,分别为创建用户、获取用户信息。

获取用户信息

该关的用户信息多个 credit 字段。

img

漏洞点

credit 很明显是权限字段,创建新用户时直接传入 credit 为 100,然后使用新用户获取个人信息即可拿到flag。

img

img

简易应对措施

  • 添加数据传输层;

  • 添加权限校验;

  • 抽离函数功能,指定修改字段。

vAPI7

因为没有配置 CORS 导致的 CSRF 漏洞,太过简单不做介绍。

img

接口

API7 共有4个接口,分别为创建用户、用户登录、获取Key、用户退出。

获取 Key

登录后直接访问该接口就可以获取该用户的敏感信息。

img

漏洞点

登录后,直接在 Get Key 接口添加任意 Origin 即可拿到 flag。

img

简易应对措施

  • 添加 CORS

  • 添加 CSRF_TOKEN

vAPI8

注入。

img

接口

API8 共有两个接口,分别为用户登录、获取Flag。

漏洞点

注入,直接传入 admin' or '1 即可登录拿到 authKey,然后使用 authKey 拿到 flag。

img

简易应对措施

  • 预处理;

  • 过滤特殊字符。

vAPI9

vAPI9 有 v2 版本。尽管有了更新更安全的 APIv2,但是有不少网站仍然暴露了老版 APIv1,其中可能存在漏洞。

img

接口

API9v2 只有一个接口,为用户登录。

用户登录

可以看出需要传入 username 与 4位数字的 pin 码。

img

漏洞点

尝试爆破,发现存在防爆破机制,当尝试次数过多则会返回500。

img

将 URL 中的 v2 改成 v1,爆破老版本 API,没有爆破机制,成功爆破 pin 为 1655,得到flag。

img

简易修复措施

  • 停用老版本 API;

  • 将老版本 API 放入内网。

vAPI10

这一关直接访问就能得到 Flag,目的是为了告诉我们,对 API 做日志管理与访问监控很重要。因为大多数 API 都没有配置监控与日志记录,这使得攻击者保持不被发现,从而允许他在系统中保持持久性,执行横向移动,并破坏重要的系统。

img

参考资料

  1. https://github.com/roottusk/vapi

  2. https://medium.com/@jyoti3190/roottusk-vapi-writeup-341ec99879c

  3. https://www.freebuf.com/articles/network/331590.html

  4. http://kaelzhang81.github.io/2019/05/24/Restful-API%E8%AE%BE%E8%AE%A1%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/

  5. https://www.lidihuo.com/postman/postman-index.html

# web安全 # 数据安全 # API # 教程 # 靶场攻关
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录