作者:{Poseidon, pav1} @ArkTeam
OWASP Top 10 – 2017中首次将”未受保护的API”(Underprotected APIs)纳入列表,可见API安全的重要性。下面分享一个API安全的相关案例。
WordPress4.7.0与4.7.1版本中存在一个由REST API导致的安全漏洞,该漏洞导致WordPress所有文章内容未经授权验证即可被修改。整个漏洞的分析与利用过程为:
1.API接口/wp-json/wp/v2/posts/1中的最后一个值为帖子ID值,受正则保护必须为纯数字(图1所示),如果尝试使用/wp-json/wp/v2/posts/1a等形式请求则提示帖子ID异常。
图1 文章ID值受正则保护
2.审计发现代码在实际处理过程中优先使用GET或POST参数中传入的ID值,因此可以绕过正则保护,输入自定义的非纯数字ID值。即通过形如/wp-json/wp/v2/posts/1234?id=12345helloworld的方式进行请求,此时ID值为12345helloworld。
3.进一步审计关于修改帖子的代码以及其权限检查代码(图2所示),发现一旦$post值为false即可绕过权限的检查。
图2 修改帖子的权限检查相关代码
4.进一步审计get_post函数,其中使用了get_instance函数获得帖子,而从该函数的具体实现(图3所示)分析可知,如果ID值是数字字母组合的形式则会返回flase。综合可得,通过上述形式的请求即可绕过相关的权限检测,进而执行帖子的修改。
图3 get_instance函数相关代码
5.最后关键一步,在检查完权限后即进入修改帖子的逻辑(图4所示),此时同样会使用get_post函数来获得帖子,然而在此处的ID值先被进行了一次int转型处理。在PHP的int转型处理中,数字+字母组合最终只会保留最开始的一段连续数字值(图5所示)。所以在该函数中即使输入的ID值不是纯数字也能找到对应的帖子。
图4 修改帖子相关代码
图5 PHP中的int转型处理
6.整个过程既实现了正则与权限检查的绕过,同时也能正确地找到对应得帖子进行修改。
本文案例仅仅是冰山一角,现代的应用常常涉及富客户端应用程序和API,比如浏览器和移动App中的JavaScript,连接到其他某种API(SOAP/XML、REST/JSON、RPC、GWT等),研发人员与安全人员都应对API予以足够的重视以及采取正确的保护措施。