引言
刚开始接触接口业务安全测试概念时,我有些茫然,是接口测试呢,还是业务功能测试。其实吧,可以理解为他是两者兼有,目的就是为了提高接口的安全性,在源头上防范业务风险。
众所周知,接口的参数是由前端传过来,再提交至后台的。前端系统一般都针对实际的业务规则进行了输入控制,那么还有必要进行接口参数的测试吗?答案当然是肯定的,因为在前后端系统调用过程中,特别是针对客户服务系统前后端交互过程中涉及报文拼接、传输等环节,报文很有可能被篡改,导致业务风险,而后端系统又很难直接识别到是否被篡改,所以有必要对接口的输入信息进行检查,提高业务的安全性。
越权概念
水平越权
如下图:用户A和用户B权限属于同级,正常情况下各自账号登陆系统后只能查看本账号的相关信息,但是用户A通过非法篡改接口报文将账号A更改为账号B,就可以非法获取到账号B的账户信息,这个情况就属于水平越权情况。
垂直越权
与水平越权不同,垂直越权是普通用户通过非法手段获取了管理员账号的权限,即越权后的权限高于自身初始访问能力权限。
测试用例设计
接口业务安全测试用例的设计主要从以下几个方面入手考虑:
1.正向用例功能是否符合预期
2.边界值、等价类等验证接口参数的边界值、异常值的容错性
3.根据实际的业务场景设计反向测试用例,检查接口是否具有有效的控制逻辑
4.越权测试用例,检查身份校验、权限控制相关检查是否完备
测试工具
接口测试工具的选择上,常见的有Postman、Jmeter、Selenuim等,可以根据实际的工作需要和习惯进行选择。
实例
下面列举几个常见的接口安全测试的实例。
1.选择框数据有效性
新建用户页面,用户账号、用户姓名为输入框,角色、部门为下拉选择框,接口传值时传入的是手工填写的用户账号、用户姓名,下拉选择的角色id和部门id
测试时,直接通过接口绕过部分字段选择限制,发送请求,样例如下:
{"selectedroles":"12332111111","selecteddeparts":"rdr25452","username":"test01","realname":"测试"}
返回报文:
{"success":true,"message":"添加成功!","code":200,"result":null,"timestamp":1684206516774}
结论:通过接口发送新增用户请求,selectedroles、selecteddeparts值未作有效性验证,导致入库产生大量无用数据,可能对系统产生不良影响。
2.密码加密
常见的有用户新增、修改密码、重置密码等接口,对于银行项目来说,涉及到金额值时也需要加密显示。
查看接口请求:
{"username":"test01","password":"123456","confirmpassword":"123456"}
结论:接口的password、confirmpassword值未作加密处理,导致密码有泄露风险,对于接口传参数时,敏感字段要做加密处理,敏感字段在数据库里存储时也要加密显示。
## 3.上传文件格式
新建用户上传头像,直接通过接口修改上传头像的文件格式,查看返回结果
接口请求(部分)
Content-Disposition:form-data;name="file";filename="20231123_1.exe"
查看返回报文,文件已上传至服务器指定位置
{"success":true,"message":"20231123_1.exe","code":200,"result":null,"timestamp":1684206516774}
结论:该问题可能造成攻击者上传木马病毒等文件从而威胁服务器的安全。上传文件接口应增加文件格式的校验,通过对比图片头信息是否符合图片格式或者多种校验相结合。
4.删除接口,ID填写任意值
角色删除接口,ID填写任意值,查看返回结果
接口请求:
delete/api/role/delete?id=fdg@#
查看返回报文:
{"success":true,"message":"删除角色成功!","code":200,"result":null,"timestamp":1684206516774}
结论:对于传入不存在的ID值,接口应按照实际情况返回结果。
5.必填项非空校验
返回成功
新增单位页面,单位名称必填,直接走接口新增时,填写空值
接口请求:
{"partname":"","type":"1","description":""}
返回报文:
{"success":true,"message":"添加成功!","code":200,"result":null,"timestamp":1684206516774}
结论:必填项需校验非空。
返回失败,但暴露程序敏感信息
请求接口:
{"type":"1","name":"test1","price":"","description":"123"}
截取返回报文:
{"success":false,"message":"操作失败,……not a valid representation\n at [Source;line:1,column:52]","code":200,"result":null,"timestamp":1684206516774}
结论:避免直接暴露程序敏感信息,修改异常处理提示。
6.新增字段超长
接口请求:
{"type":"3","targetName":"rdewwwwwwwwwwwwwwwwwwwreeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","number":"1"}
截取返回报文:
###The error occurred while setting parameters\n###SQL:INSERT INTO ……VALUES(?,?,?,?,?,?)
结论:接口传值字段超长时,接口直接返回了报错SQL,暴露了数据库信息,应修改异常处理提示信息。
7.账号越权
水平越权
A和B账号平级,A账号越权操作了B账号才能操作的数据
接口请求:
{"riDetail":"模型一"."nextDept":"6dgdgd226732327hffgrfr73","handleType":0}
返回报文:
{"success":true,"message":"操作成功!","code":200,"result":null,"timestamp":1684206516774}
结论:账号A越权操了账号B的数据,造成了水平越权,接口应添加权限校验。
垂直越权
仅管理员有删除用户权限,调用删除接口,登录账号使用非管理员账号
接口请求:
DELETE/api/user/delete?id=1658745524283596802
查看返回报文:
{"success":true,"message":"删除用户成功!","code":200,"result":null,"timestamp":1684206516774}
结论:
功能设计本意是只有管理员,或者是具备权限的账号才能删除用户信息,攻击者可通过直接调用删除接口,达到删除数据的目的,故应添加接口层面的权限管理。
8.SQL注入漏洞
查询接口,修改查询日期
接口请求:
GET/api/listAll?_t=1684292603&taskName=*34&colume=endTime&order=1 or 7=7 &fileId=id……
截取返回报文:
Error SQL :SELEST\n ami.id\n,ami.model_name AS ……
结论:返回报文暴露了数据库敏感信息。接口增加判断,若参数不符合要求则使用默认参数,优化返回结果信息。
以上,就是关于接口业务安全测试的一些个人总结,持续优化改进中~