1.【技术干货】CodeQL从0到1(内附Shiro检测演示)
2.记一次反序列化漏洞的源码利用之路
3.代码审计思路之PHP代码审计
【技术干货】CodeQL从0到1(内附Shiro检测演示)
CodeQL是一种由Semmle公司开发,GitHub收购的分析代码分析平台。它能够从代码中提取信息并构建数据库,源码通过编写查询消息获取所需信息,分析尤其在安全代码审计中,源码CodeQL可识别已知漏洞并生成查询规则,分析网站源码交易从而发现代码中类似的源码潜在漏洞。
CodeQL支持多种编程语言和框架,分析详细信息可以在官方文档中查看。源码安装过程包括下载核心解析引擎和开源库,分析引擎部分不开源,源码主要用于解析数据库执行操作,分析而库部分则允许用户编写自定义规则。源码CodeQL提供命令行工具和VSCode插件两种方式,分析插件提供图形界面,源码封装了一些功能,使用起来更为便捷。
CodeQL的工作流程分为提取数据库和执行查询两部分。解释型语言如Python,数据库提取使用特定工具,编译型语言如Java,则需要在编译过程中获取所需信息,最终获得源码的抽象语法树(AST)以及源码,一并打包为数据库。代源码解析查询过程包括编译和执行阶段,与库文件一起提交给编译器进行编译,之后在数据库中提取数据。
CodeQL的基本语法、数据类型、结构、函数、类等概念可以在官方文档中找到详细介绍。函数在CodeQL中被称为谓语,用于封装逻辑,使代码更加简洁明了。每个类都必须继承一个父类,父类的值成为子类的初始值集,自定义类通常需要继承库提供的类。污点追踪功能是CodeQL的重要特性之一,它通过建立代码有向图来追踪参数和表达式的流向,帮助发现潜在的漏洞。
在使用CodeQL编写规则时,会遇到环境搭建、数据库获取等问题。例如,获取shiro1.2.4版本的数据库需要maven编译,可能涉及环境配置。五十k源码污点追踪在连接特定节点时,如`cookie.getvalue()`,CodeQL可能无法识别两者之间的关系,这时可以使用`isAdditionalTaintStep()`方法将节点连接起来。此外,CodeQL可能无法识别所有变量传递关系,需要通过额外分析和逻辑判断进行连接。
最终,通过正确使用CodeQL,可以有效识别和预防代码中的安全漏洞,提高代码质量和安全性。开发者可以参考官方文档、教学视频等资源深入学习CodeQL的使用方法。如果遇到特定问题,可以关注“星阑科技”微信公众号,获取更多安全干货和解决方案。
记一次反序列化漏洞的利用之路
0x 前言
通过偶然的机会获取一套系统的源码,利用CodeQLpy轻松发现存在反序列化漏洞,此漏洞属于标准的java反序列化,未进行任何过滤,可利用性较高。
0x 探索
1) 验证漏洞存在:通常,确认反序列化漏洞的担保系统源码手段为URLDNS链。这条链依靠JDK自带,无需依赖第三方jar包,网络出问题即能利用成功,具备较强的通用性。利用ysoserial生成URLDNS链所需的序列化内容,对ysoserial.payloads.util.PayloadRunner的run方法稍作修改,将序列化的数据保存至文件cc.ser,不进行反序列化操作。之后,通过run方法生成序列化内容。在目标环境下进行测试,验证通过URLDNS链触发DNS请求成功。
2) 常见利用链探索:CommonCollections链作为反序列化中最常见的手段,在目标源码中同样存在相关jar包。尝试使用ysoserial中的CC链生成对应序列化文件,但实际环境中失败,无法触发命令执行。确认源码环境为Linux,尝试了CC链的全部7条,均未成功。考虑到可能存在源码问题,使用源码在目标环境下反序列化生成的序列化文件,发现异常在于InvokerTransformer类未继承Serializable接口,卡巴斯基源码确认为修复方式。
3) 替代利用链:CC链未能成功利用,但发现系统存在CB链对应的jar包。测试CB链在系统中无法直接成功,通过本地调试发现错误原因在于版本不一致导致的serialVersionUID报错。查询得知,Java在反序列化时通过serialVersionUID值进行版本检查,不兼容则反序列化异常退出。为解决版本不一致问题,将ysoserial源码拷贝至目标源码中,使用目标源码的jar包作为依赖,最终通过CB链达到RCE效果。
0x 结论
总结反序列化漏洞利用经验:1、并非所有CommonCollections3.2版本均适用于反序列化利用;2、CommonsBeanutils链生成的payload因jar包版本不同导致serialVersionUID报错;3、直接使用ysoserial生成payload不成功时,可在目标源码环境下调试,避免因版本不一致引发的错误。
代码审计思路之PHP代码审计
×0 前言
进行PHP代码审计时,关注点与目标明确对提升审计效率至关重要。本文将分享PHP代码审计的一些思路和方法,帮助在审计过程中更加系统地发现潜在问题。
×1 前期工作,需要的工具
使用集成环境PHPStorm可以提高代码编写与调试的效率。静态代码扫描工具如Fotify有助于快速识别代码中的问题,降低误报率。seay和CodeQl是源代码审计与自动化代码审计的强大工具,其中CodeQl为非商业的开源选择。Xcheck是一款专注于检测业务代码安全风险的工具,特别适用于寻找由不可信输入引发的安全漏洞。
×3 明确目标
在进行审计前,首先要明确审计的目的,可能有三种情况:提升审计经验、寻找可利用的漏洞、挖掘0day或证书。不同目的下的审计侧重点不同,例如为了发现漏洞进行渗透测试,可以重点使用自动化工具,关注文件上传、包含、SQL注入等严重危害的漏洞。
一>所有资源获取
×4 判断是否是用了框架
了解是否使用了框架对审计过程至关重要,框架的结构通常更规整,易于定位关键函数集。对于使用了框架的项目,审计重点在于控制器(C)部分,因为大部分功能点都集中在控制器中。
PHP主流框架包括Laravel、ThinkPHP、yii等,它们大多采用MVC设计模式。对于ThinkPHP,其目录结构在版本3和5有所不同,但控制器(C)仍是审计的关键。
4.2. Laravel框架
在Laravel框架中,审计重点同样集中在控制器(C)中,因为大部分功能实现都在这里。
4.3. 如果没用框架
没有使用框架时,需要关注的点包括函数集文件、配置文件、安全过滤文件、index文件等。函数集文件通常包含function或common关键字,配置文件中可能包含config关键字,安全过滤文件对审计至关重要。
×5 了解路由
了解路由有助于快速定位漏洞位置。对于框架如Thinkphp,其路由规则清晰,审计时可通过路由直接访问漏洞方法。不同模式的路由配置(普通模式、混合模式、强制模式)需了解清楚,以便更好地定位和利用。
×6 审计
在审计前,可以使用自动化工具如xcheck、Fotify、codeql等进行初步扫描。根据报告验证审计发现,然后按类型深入审计,如SQL注入、XSS、CSRF、SSRF、XML外部实体注入等。
6.1. 鉴权
对于权限认证的审计,主要关注是否存在越权访问和未授权访问情况,通常后台管理是需要权限认证的地方。
6.2. 按照漏洞类型审计
根据漏洞类型定位可能存在漏洞的地方,如SQL注入、XSS、CSRF、SSRF、XML外部实体注入等,然后回溯验证参数可控性,快速定位漏洞。
6.2.1. SQL注入
审计时,重点关注是否存在字符串拼接并可被用户控制的SQL语句。
6.2.2. XSS漏洞
注意直接输出用户输入的地方,检查数据输出函数和全局拦截器、过滤器。
6.2.3. CSRF漏洞
CSRF攻击利用场景通常涉及敏感功能,审计时寻找生成随机token和token验证的逻辑。
6.2.4. SSRF漏洞
审计时注意访问端口、协议和内网IP的限制,以及使用file、tl_exec、popen等关键词,回溯参数可控性。
6.2.. 任意文件下载/下载漏洞审计
关注fget、file_get_contents、readfile、parse_ini_file、highlight_file、file、fopen、readfile、fread等函数,验证变量可控性。
6.2.. 任意文件删除
审计时搜索rmdir、unlink等函数,确保变量可控。
6.2.. 任意文件写入
注意copy、file_put_contents、fwrite等函数,检查可控变量。
6.2.. 会话认证漏洞
审计会话认证漏洞时,需关注cookie生成逻辑、用户身份验证方式,确保会话状态安全。
6.2.. 反序列化漏洞
审计时注意全局搜索serialize,检查是否存在可控变量。