1、GraphQL 与 GraphQL 安全个人简介 图南奇安信 A-TEAM成员安全研究员曾经是一只程序猿(头发还在)邮箱:奇安信 A-TEAM团队主要致力于Web渗透、APT攻防、对抗,前瞻性攻防工具预研。从底层原理、协议层面进行严肃、有深度的技术研究,深入还原攻与防的技术本质,曾多次率先披露 Windows域、Exchange、WebLogic等重大安全漏洞,第一时间发布相关漏洞安全风险通告及可行的处置措施并获得官方致谢。团队急需产品经理、安全开发和安全研究员。欢迎有意者加入!说在前面的话01说在前面的话 共同作者:gyyyy(猎户攻防实验室)、图南 后端: 前端:+GraphQL简介02初
2、识GraphQLGET /products HTTP/1.1Host: Accept: */*POST /orders HTTP/1.1Host: Accept: */*User-Agent: example-user-agentConnection: keep-aliveUser-Agent: example-user-agentContent-Type: application/jsonConnection: keep-alivedata:some data初识GraphQLPOST /graphql HTTP/1.1Host: accept: */*POST /graphql HTTP/
3、1.1Host: accept: */*User-Agent: example-user-agentcontent-type: application/jsonConnection: keep-aliveUser-Agent: example-user-agentcontent-type: application/jsonConnection: keep-aliveoperationName:null,variables:,query:n product(productId: 1000) n_idn namen nnoperationName:CreateOrder,variables:dat
4、a:some data,query:mutation CreateOrder($data:Data!) n createOrder(data: $data)nn初识GraphQL REST GraphQL使用GraphQL的大客户们GraphQL是什么GraphQL是什么请求你所要的数据,不多不少GraphQL是什么获取多个资源,只用一个请求GraphQL是什么描述所有的可能,类型系统GraphQL核心组成部分TYPESCHEMA用于描述接口的抽象数据模型,有Scalar ( 标量 ) 和Object ( 对象 ) 两种,Object由Field组成,同时Field也有自己的Type用于描述接
5、口获取数据的逻辑,类比RESTful中的每个独立资源URI一个 GraphQL Schema 中的最基本的组件是对象类型QUERYRESOLVER用于描述接口的查询类型,有Query ( 查询 ) 、Mutation ( 更改 ) 和Subscription ( 订阅 ) 三种用于描述接口中每个Query的解析逻辑,部分GraphQL引擎还提供Field细粒度的ResolverGraphQL核心组成部分Type定义描述要查询数据的“形状”,并指定GraphQL服务器获取数据的方式,Schema包含在Type中, Schema的最基本的组件是对象类型(Object type)Query是所有Gr
6、aphQL查询的根Resolver定义用怎样的技术方式从Schema中取出对应类型的数据GraphQL VS. RESTful VS. 参数型接口参数型接口和RESTful接口请求响应GET /blog?id=blogIdGET /author?id=authorIdGET /blog/blogIdGET /author/authorIddata: blog data data: author data data: blog data data: author data GraphQL VS. RESTful VS. 参数型接口GraphQL接口请求响应POST /graphqldata: q
7、uery: n blog(blogId: blogId) nauthor n fieldn n field n nnblog: author: field: .field: .GraphQL VS. RESTfulRESTfulGraphQL VS. RESTfulGraphQLGraphQL安全问题03GraphQL安全漏洞身份认证与权限控制不当GraphQL和其他API技术一样,需要身份认证和鉴权身份认证与权限控制不当身份认证与权限控制不当 在一个JavaScript文件中暴露了一个GraphQL接口路径 通过这个GraphQL接口路径在未经身份认证的前提下查询到了很多关键数据身份认证与权
8、限控制不当 一个获取用户地址簿的GraphQL查询语句可泄露部分用户地址簿信息身份认证与权限控制不当 组内普通成员可通过此漏洞越权成为主持人身份认证与权限控制不当GraphQL身份认证无效和权限控制不当问题频发的原因01 02 03个中间层对它定义的查询语言进行语法解析执行等操作ver等种种定义会让开发者对它的存在感知较大,间接的增加了对它理解的复杂度不同的field查询得到不同的结果,开发者需要对每个field的resolve做权限控制身份认证无效GraphQL认证无效解决方案 RER SE TS fuT l身ful份 身 认 份 证 认证GraphQL认证无效解决方案 Gra方 p案hQ一
9、 L:身独份立认认证证终端GraphQL认证无效解决方案 独立认证终端GraphQL认证无效解决方案 方案二:在GraphQL内认证GraphQL认证无效解决方案GraphQL认证无效解决方案并发症一:内省导致的信息泄露GraphQL自带强大的内省机制_schema可查询所有可用对象_type可查询指定对象的所有字段并发症一:内省导致的信息泄露_schema的用法并发症一:内省导致的信息泄露_type的用法并发症二: 非预期的字段同一个接口给不同的权限职能属性的角色使用正常情况下每一个角色只查询接口的部分字段但如果不对字段权限进行控制,即可被恶意利用查询出全部字段并发症二: 非预期的字段容易查
10、询出非预期字段的原因01 02 03前端请求的字段进行数据回传响应包含端无感对应字段即可知无影响并发症二: 非预期的字段举个 假设有如下需求:需求1:管理员可查看用户的相关信息(需要用户名、邮箱、创建日期等字段)需求2:运营人员需要统计用户数据,输出报表(需要用户名、身份证号、登录地点等字段)并发症二: 非预期的字段设计Schema如下:并发症二:非预期字段并发症三:废弃的字段GraphQL为字段删除提供了废弃方案如果一个字段不再使用,可以标识字段废弃但如果不对废弃字段的Resolver进行修改,依然可以查询到废弃字段的内容并发症三:废弃的字段刚才的继续:开发者意识到了问题,决定废弃敏感字段并
11、发症三:废弃的字段使用_type内省仍然可以将废弃并发症三:废弃的字段由于开发者没有对Resolver做修改,废弃字段仍然可以正常参与查询GraphQL注入有语法就会有解析,有解析就会有结构和顺序,有结构和顺序就会有注入 gyyyyGraphQL注入再举个前端使用变量构建带参查询语句,通过用户名查询用户)%7Busername%7Dhack%3Auser(username%3Aadmin)%7Bpassword%23GraphQL注入GraphQL语句的结构被改变GraphQL注入解决方案参数值以变量的形式传入,由解析器实时赋值解析拒绝服务GraphQL允许对象间的嵌套关系存在如果不对嵌套深度
12、进行限制,就会被攻击者利用进行拒绝服务攻击拒绝服务举最后一个需求1:查询所有文章,返回内容中包含作者信息需求2:查询作者信息,返回内容中包含此作者写的所有文章拒绝服务定义Blog和Author并构建Query拒绝服务可构造如下恶意查询如下拒绝服务解决方案限制查询深度,同时在设计GraphQL接口时应尽量避免出现此类问题结语04总结GraphQL是什么GraphQL与RESTful的区别安全问题1:身份认证与权限控制不当安全问题2:GraphQL注入安全问题3:拒绝服务他只是个接口 XSS SQL注入 NoSQL注入 CSRF 远程命令执行 filter: or =filter: $ne: null