API 接口测试

一、API 接口介绍

1.1 RPC(远程过程调用)

远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用,例:Java RMI。
RPC 一般直接使用 TCP 协议进行通信,通常不涉及到 HTTP。HTTP 下面有 2 种技术:

Web service 和 RESTful API 都可算作远程过程调用的子集。

1.2 Web Service

  • Web Service 是一种服务导向架构的技术,通过标准的 Web 协议提供服务,目的是保证不同平台的应用服务可以互操作。
  • 根据 W3C 的定义,Web 服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。
  • 尽管 W3C 的定义涵盖诸多相异且无法介分的系统,不过通常我们指有关于主从式架构(Client-server)之间根据 SOAP 协议进行传递 XML 格式消息。无论定义还是实现,Web 服务过程中会由服务器提供一个机器可读的描述(通常基于 WSDL)以辨识服务器所提供的 Web 服务。另外,虽然 WSDL 不是 SOAP 服务端点的必要条件,但目前基于 Java 的主流 Web 服务开发框架往往需要 WSDL 实现客户端的源代码生成。一些工业标准化组织,比如 WS-I,就在 Web 服务定义中强制包含 SOAP 和 WSDL。
  • Web Service 是一种比较“重”和“老”的 Web 接口技术,目前大部分应用于金融机构的历史应用和比较老的应用中。

1.3 SOAP

  • SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration) 之一, soap 用来描述传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi 用来管理,分发,查询 webService 。具体实现可以搜索 Web Services 简单实例 ; SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。
  • SOAP 使用基于 XML 的数据结构和超文本传输协议 (HTTP) 的组合定义了一个标准的方法来使用 Internet 上各种不同操作环境中的分布式对象。
    soap 协议又分为 soap 1.1 和 soap 1.2 两个版本
  • 这两个协议间的区别在于 soap 1.1 里存在 soapAction 请求头,而 soap 1.2 没有,soap 1.2 里用了 action 来代替,两者的 wsdl 文件也不同,体现在命名空间和定义 service 差别里。

二、SOAP 注入

1、SOAP 注入查找

  • 通常而言通过搜索特定后缀去找 webservice 地址,比如通过在 fofa、shodan 等搜索 asmx
  • asmx 是 webservice 服务程序的后缀名,asp.net 使用 asmx 来进行对 webservice 的支持,通过 fofa 上搜索找目标
  • 或者可以使用 google 语法搜索,inurl:asmx?wsdl,inurl:.php?wsdl inurl:.ashx?wsdl 通过去查找 webservice 的服务描述的 xml 文档来找寻可能的注入点

2、wsdl 分析

  • wsdl 内的信息过于繁杂,可以借助辅助工具来对 wsdl 进行分析,常用的有 soapui,WS-Attacker 或者用 burp 的 wsdler 模块,都可以分析 wsdl 来得到结果

3、靶机搭建

docker pull jeffzh3ng/fuxi
docker run -itd --name fuxi_docker -p 5000:50020 jeffzh3ng/fuxi:latest

Bash复制

4、漏洞分析

  • 首先访问靶机
API 接口测试
  • 一般存在注入的地方发生在数据查询处
  • 查看 4 个功能点功能 :AddUser 为添加用户,list 为列举用户,getuser 为获取用户,delete 为删除用户
  • 这里存在漏洞处为获取用户信息处
  • 点击 GetUser->Message Layout 查看它的消息布局
API 接口测试
  • 发现 username 处为 string 此处传入为字符串,可能存在注入
  • 通过查看它的 wsdl 去分析
API 接口测试
  • 查看此处的 GetUser 元素,此处元素为内部创建的子元素,这里子元素名称为 username,
  • 类型为 string
  • 往下看,查找它的 operation, 也就是它的操作活动
API 接口测试
  • 找到 GetUserHttpGetIn 这个可以看作是 Get User Http Get In 为获取用户的输入
    以此为突破口进行测试
  • 这个靶场的数据库为 PostgreSQL 数据库,那么要用 PostgreSQL 注入来做
    点击 Test Form 输入 payload 进行测试
  • 输入 aaa‘ or 1=1–
API 接口测试

再输入 aaa’ or 1=2–

API 接口测试
  • 可以说明此处存在注入,可以进一步使用联合查询来获取用户名密码,或者抓包使用 sqlmap 进行测试。
  • 按照示例把 get 请求转换为 post
API 接口测试
  • 保存到文件并给参数标注*
POST /Vulnerable.asmx/GetUser HTTP/1.1
Host: 192.168.10.70
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.10.70/Vulnerable.asmx?page=op&tab=test&op=GetUser&bnd=VulnerableServiceSoap&ext=testform&username=admin%E2%80%99+union+select+aaa%2Caaa--
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: ASP.NET_SessionId=473D11DF9D40456C68995931
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 89

page=op&tab=test&op=GetUser&bnd=VulnerableServiceSoap&ext=testform&username=aaa*
  • 使用 sqlmap 进行测试
sqlmap -r 222 --dbs --is-dba --dbms=PostgreSQL
API 接口测试

三、api 接口测试工具

  • 市面上常见的 API 请求构建工具形式有独立的桌面程序、命令行程序、浏览器扩展、Web 服务等几种,比较著名的 API 请求构建工具有 Postman、Swagger Inspecter、Soap UI、Apigee 等等。
  • 国内有一些公司也通过 Web 服务的方式提供 API 测试功能,例如网易数帆的 GoAPI,还有像 curl 这样免费的不需要图形界面也可以直接进行 HTTP API 测试的工具。

1、soapui 使用

  • soapui 官网:https://www.soapui.org/
  • soapUI 是一个开源测试工具,通过 soap/http 来检查、调用、实现 Web Service 的功能 / 负载 / 符合性测试。该工具既可作为一个单独的测试软件使用,也可利用插件集成到 Eclipse,maven2.X,Netbeans 和 intellij 中使用。把一个或多个测试套件(TestSuite)组织成项目,每个测试套件包含一个或多个测试用例(TestCase),每个测试用例包含一个或多个测试步骤,包括发送请求、接受响应、分析结果、改变测试执行流程等。
API 接口测试

下载文件后加执行权限,执行后可打开安装向导

API 接口测试

安装完成后点击 finish 即可打开 soapui

API 接口测试

点击 file,选择 new SOAP project, 填入地址

API 接口测试

然后就可以对 wsdl 地址进行解析

API 接口测试

修改传入数值点击运行也可以进行测试,为 api 测试常用工具之一

API 接口测试

点击 file,选择 new REST project, 填入 fixi 地址 http://ip//api/v1/token

API 接口测试
  • 单击 ok 后添加 api 所对应的参数 username 和 password, 然后点击绿色三角即可对 fuxi api 进行测试

2、burp 的 wsdler 插件

  • 抓取访问 wsdl 的数据包,然后右键,选择 Extensions->wsdler->parse wsdl
API 接口测试

得到分析结果,这里可以结合 sqlmap 使用,把抓到的包保存为 txt 文件,然后 sqlmap 去测试

API 接口测试

3、hoppscotch

  • 之前有很多 API 请求构建工具都是商业软件,或者免费版仅仅提供很有限的功能。其中曾经最流行的 Postman 在收费之后就很被开发者社区诟病。有位印度裔小哥 Liyas Thomas 对此极为不爽,就发布了一个新的工具叫:Postwoman,显而易见,Postwoman 是专怼 Postman 的。
  • 2020 年 8 月,Liyas 小哥可能觉得一直怼 Postman 也挺 low 的,2020 年 8 月决定改名叫 hoppscotch 了。

3.1 hoppscotch 安装

yum -y install docker
docker run --rm --name hoppscotch -p 3000:3000 hoppscotch/hoppscotch:latest
  • 会开始自动 pull 镜像并开始启动,过程非常慢
API 接口测试

访问 http://ip:3000 ,打开 hoppscotch

API 接口测试

添加 fixi 的 /api/v1/token 接口,添加相应的参数和值便可得到结果

API 接口测试

4、postman

  • Postman 是一个接口测试工具 , 在做接口测试的时候 ,Postman 相当于一个客户端 , 它可以模拟用户发起的各类 HTTP 请求 , 将请求数据发送至服务端 , 获取对应的响应结果, 从而验证响应中的结果数据是否和预期值相匹配 ; 并确保开发人员能够及时处理接口中的 bug, 进而保证产品上线之后的稳定性和安全性。
  • 它主要是用来模拟各种 HTTP 请求的 (如 :get/post/delete/put.. 等等 ),Postman 与浏览器的区别在于有的浏览器不能输出 Json 格式 , 而 Postman 更直观接口返回的结果。

4.1 postman 安装

tar -xzvf postman-9.15.2-linux-x64.tar.gz
cd Postman
./Postman
API 接口测试
API 接口测试

单击 Create Collection->add a request 创建一个测试任务

API 接口测试

添加 fixi 的 http://ip//api/v1/token 接口,添加相应的参数和值点击 send 便可得到结果

API 接口测试

5、工具总结

  • SoapUI 相对 Postman 多了一个 Soap 协议测试。
  • SoapUI 的功能复杂,界面使用多窗口方式实现,交互复杂,学习成本高,对于使用人员有较高要求。
  • SoapUI 的 API 测试,自动测试需要更强的编程技能。
  • Postman 脱胎于 Chorme 的插件,只支持 Http 协议的测试。
  • Postman 的界面采用 Tab 形式,类似 chrome 的操作方式,界面简单,功能设计简洁,工程的组织只有 Collection 和 folder ,层级,概念简洁,易学,易用,对于项目组的学习成本低。
  • Postman 的 API 测试,自动测试对于编程的要求相对低一些
  • 如果只是进行 Http,https 接口测试建议使用 Postman 作为 API 测试工具,最主要的理由是,简洁易用,学习成本低。
  • hoppscotch 功能跟 postman 功能相似,优点是开源免费、轻量级、页面美观,基于浏览器,不需安装,使用方便。
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容