吹爆SyntaxFlow!数据流分析实战解析

news2025/1/19 17:01:22

正文开始前辟个谣先

最近有小伙伴来问闭源收费的事

牛牛郑重告知大家

目前还没有这个计划

请大家放心使用

添加图片注释,不超过 140 字(可选)

样例解析在之前的SyntaxFlow教程中,我们已经看到了非常多的代码样例进行数据流分析,这里选用其中一个:可以看到在代码中,Runtime.getRuntime().exec的参数为simpleBean.getCmd, 而此前也存在simple.setCmd和simple.setCmd2, 通过CmdObject的声明可以知道,getCmd将会拿到this.cmd1,setCmd将会设置this.cmd1,因此exec的参数应该是aTaintCase022的参数cmd。

 
 

package com.sast.astbenchmark.model; public class CmdObject { private String cmd1; private String cmd2; public void setCmd(String s) { this.cmd1 = s; } public void setCmd2(String s) { this.cmd2 = s; } public String getCmd() { return this.cmd1; } public String getCmd2() { return this.cmd2; }} @RestController()public class AstTaintCase001 { /** * 字段/元素级别->对象字段->对象元素 * case应该被检出 */ @PostMapping(value = "case022") public Map<String, Object> aTaintCase022(@RequestParam String cmd) { Map<String, Object> modelMap = new HashMap<>(); try { CmdObject simpleBean = new CmdObject(); simpleBean.setCmd(cmd); simpleBean.setCmd2("cd /"); var sh = simpleBean.getCmd(); var sh2 = sh; Runtime.getRuntime().exec(sh2); modelMap.put("status", "success"); } catch (Exception e) { modelMap.put("status", "error"); } return modelMap; }}

一级定义

首先我们可以用最基础的use-def链检查一下exec的参数:

 
 

Runtime.getRuntime().exec(* as $para)$para #> as $paraDef

得到结果如下:

注意因为函数exec会传入this参数,因此会出现Runtime.getRuntime() 也存在在参数中。

可以看到加入的var sh2 = sh并没有影响到分析,因为SyntaxFlow使用基于SSA格式的YakSSA HIR,在分析时只关注值的关系,多层的变量传递也只是同一个值并不会影响分析。同时也可以看到通过->, 可以获取到simpleBean.getCmd() 的上一级引用:函数simpleBean.getCmd和对象simpleBean(这个对象也是被当作this传入的)。

最顶级定义接下来,我们将使用SyntaxFlow提供的最顶级定义查看exec的参数:

 
 

Runtime.getRuntime().exec(* as $para)$para #-> as $paraDef

得到结果如下:

我们也可以看到分析过程: 从runtime.getRuntime.exec获取参数得到getCmd的调用,这一部分都是通过SyntaxFlow完成的,标注为红色箭头,并且标记了得到该数据的操作。然后通过数据流分析获取到参数cmd, 在图中使用黑色箭头标记,过程中的点可以看到检查了函数getCmd和调用点。

样例

  • 通过{}可以在向上或向下的数据流分析的过程中进行配置。

比如在上述的例子中,我们想要收集在数据流分析过程中的数据语句。可以使用hook,并且继续写一段新的SyntaxFlow的查询语句。比如如下的例子:

 
 

Runtime.getRuntime().exec(* as $para)$para #{hook: `* as $a`}-> as $paraDef

在配置中的hook内可以通过`来写入一段新的SyntaxFlow语句,在数据流追踪过程中的每一个值都会运行该语句,并且该语句支持所有的syntaxFlow特性。我们可以看到审计结果:

同样我们可以画出该审计过程的图,紫色节点代表当前选中的节点,可以看到他是之前我们审计得到参数cmd过程中的一个节点。

实际使用接下来是一个Java Servlet的代码样例,在Servlet中规定了doPost/doGet等方法,因此我们可以确定请求的入口是这些函数的第一个参数。但是同时 用户自己编写的代码也可以接收到request类型的参数但是这些函数并不一定会被调用。例子如下:

 
 

package net.javaguides.usermanagement.web; import java.io.IOException;import java.sql.SQLException;import java.util.List; import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import net.javaguides.usermanagement.dao.UserDAO;import net.javaguides.usermanagement.model.User; /** * ControllerServlet.java * This servlet acts as a page controller for the application, handling all * requests from the user. * @email Ramesh Fadatare */ @WebServlet("/")public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L; private UserDAO userDAO; public void init() { userDAO = new UserDAO(); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应内容类型 resp.setContentType("text/html"); // 从请求中获取参数 String message = req.getParameter("message"); // 获取响应的 writer 对象,用于发送响应数据 PrintWriter out = resp.getWriter(); out.println("<h1>Received POST request with message: " + message + "</h1>"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getServletPath(); try { switch (action) { case "/insert": insertUser(request, response); break; } } catch (SQLException ex) { throw new ServletException(ex); } } private void insertUser(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException { String name = request.getParameter("name"); String email = request.getParameter("email"); String country = request.getParameter("country"); User newUser = new User(name, email, country); userDAO.insertUser(newUser); response.sendRedirect("list"); }}

我们可以从这些函数开始入手获取参数获取到request,并持续向下追踪使用,并配合hook配置获取所有的request.getParameter成员的参数。

 
 

/(do(Get|Post|Delete|Filter|\w+))|(service)/(*?{!have: this && opcode: param } as $req);$req.getParameter as $directParam;$req -{ hook: `*.getParameter as $indirectParam`}->$directParam + $indirectParam as $output;$output(, * as $ParamName)

得到结果如下:

预告:YakRunner

熟悉的朋友应该感觉到本文中的截图都是yakit风格, 目前的新版本YakRunner将会要支持SSA项目编译以及审计功能。大家将要有GUI用了哈哈哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

广东失业领取指南 记录自己的失业

1. 前言 坐标广州&#xff0c;七月底就被裁员领取n1解放了&#xff0c;趁着这次机会&#xff0c;也想着躺几个月后再去上班&#xff0c;现在工作也不好找&#xff0c;加上之前加班实在是消耗太大了。想着躺也不能干躺&#xff0c;去申请一下失业金每个月还有补贴用&#xff0c…

[数据集][目标检测]锤子检测数据集VOC+YOLO格式1510张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1510 标注数量(xml文件个数)&#xff1a;1510 标注数量(txt文件个数)&#xff1a;1510 标注…

悟空降世 撼动全球

文&#xff5c;琥珀食酒社 作者 | 积溪 一只猴子能值多少钱&#xff1f; 答案是&#xff1a;13个小目标 这两天 只要你家没有断网 一定会被这只猴子刷屏 它就是咱国产的3A游戏 《黑神话&#xff1a;悟空》 这只猴子到底有多火&#xff1f; 这么跟你说吧 茅台见了它都…

TPM管理培训值不值得去?

TPM管理培训是否值得去&#xff0c;取决于多个因素&#xff0c;包括个人职业发展需求、所在企业的情况以及培训内容和质量等&#xff0c;具体如深圳TPM管理咨询公司下文所述&#xff1a; 一、个人职业发展需求 - 从事设备管理相关工作&#xff1a;如果您的工作涉及设备维护、生…

数聚股份携手销售易闪耀CDIE数字化创新博览会,开启企业数字化转型加速器

6月25日-26日&#xff0c;第十届CDIE数字化创新博览会在上海张江科学会堂隆重举办&#xff0c;本次博览会大咖云集&#xff0c;汇聚零售、快消、制造、医疗、金融、出海等领域的企业高管和部门负责人&#xff0c;打破行业边界、共话数字化痛点和热点话题。 时隔一年&#xff…

UDS 诊断 - ReadMemoryByAddress(按地址读取内存)(0x23)服务

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl&#xff08;诊断会话控制&#xff09;&#xff08;0x10&#xff09;服务 UDS 诊断 - ECUReset&#xff08;ECU重置&#xff09;&#xff08;0x11&#xff09;服务 UDS 诊断 - SecurityA…

黑神话孙悟空,自媒体小白如何蹭这波流量!

当下&#xff0c;黑神话孙悟空的热度如熊熊烈火&#xff0c;席卷了整个游戏世界。 只要与这个话题沾边&#xff0c;似乎就能轻松吸引大量关注。 那么&#xff0c;对于不怎么懂自媒体运营的小伙伴来说&#xff0c;该如何抓住这个机遇呢&#xff1f; 别担心&#xff0c;我们可以…

LearnOpenGL——延迟渲染学习笔记

延迟渲染学习笔记 一、基本概念二、G-BufferMRT 三、Lighting Pass四、结合延迟渲染和前向渲染五、更多光源 我们之前使用的一直是 前向渲染&#xff08;正向渲染 Forward Rendering&#xff09;&#xff0c;指的是在场景中根据所有光源照亮一个物体&#xff0c;之后再渲染下一…

MBR30100CT-ASEMI低压降肖特基MBR30100CT

编辑&#xff1a;ll MBR30100CT-ASEMI低压降肖特基MBR30100CT 型号&#xff1a;MBR30100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;30A 最大循环峰值反…

Django | 从中间件的角度来认识Django发送邮件功能

文章目录 概要中间件中间件 ---> 钩子实现中间件demo 邮件发送过程Django如何做邮件服务配置流程 中间件结合邮件服务实现告警 概要 摘要 业务告警 邮件验证 密码找回 邮件告警 中间件 中间件 —> ‘钩子’ 例如 访问路由 的次数【请求】 中间件类须实现下列五个方法…

商业模式画布全面解读:产品经理的实用手册

在产品经理的日常工作中&#xff0c;最基本的一项任务就是进行竞品分析和商业模式分析。一方面&#xff0c;通过竞品分析环节&#xff0c;了解当前产品的竞争力和不可替代性&#xff1b;另一方面&#xff0c;定期评估产品的商业模式是否存在风险&#xff0c;是否具有可持续性。…

Destiny of Gods首轮测试正式开启,参与玩家数量突破10万

天神风云&#xff0c;波澜再兴&#xff0c;GameFi链游聚合平台Destiny of Gods首款同名数字卡牌回合制游戏首轮测试定档8月20日20:00&#xff08;GMT8&#xff09;&#xff0c;现已正式开启&#xff01; 这是一个由人、游灵和神灵共存的世界&#xff0c;历经蛮荒时期的纷争与信…

Docker的安装与镜像配置

小编目前大一&#xff0c;刚开始着手学习SSM&#xff0c;小编会把每个框架都整理成知识点发布出来。如果你也同时在学习SSM的话&#xff0c;不妨看看我做的这个笔记。我认为同为初学者&#xff0c;我把我对知识点的理解以这种代码加观点的方式分享出来不仅加深了我的理解&#…

游泳耳机哪个牌子好?角逐必选榜的4大王者游泳耳机测评解析!

在选择游泳耳机时&#xff0c;许多消费者往往会被市场上五花八门的产品所困扰。特别是那些标榜能够防水防潮的产品&#xff0c;但实际上它们往往缺乏核心技术支持&#xff0c;存在很高的损伤风险。据调查&#xff0c;超过90%的用户反映&#xff0c;市面上的游泳耳机常常无法达到…

centos7.9离线安装kubernetes(k8s)1.28版本

文章目录 一、环境准备二、所有节点执行1、解压安装包2、创建/etc/modules-load.d/containerd.conf配置文件3、执行以下命令使配置生效4、创建/etc/sysctl.d/99-kubernetes-cri.conf配置文件5、加载ipvs内核模块–4.19以上版本内核6、授权生效7、关闭swap&#xff0c;并永久关闭…

WPF——动态排名图表实现

开发环境 VS2022 .NET 8.0 MVVM Toolkit 8.2.2 需求 开发中需要实现按照成绩动态指名&#xff0c;以展示当前的竞赛成绩的一个实时情况及变化。 即如下效果&#xff1a; 需求分析 按照接收到的信息&#xff0c;就是要将获取到的集合排序&#xff0c;并且要将排序前后的变…

什么是UDP?

UDP是工作在OSI&#xff08;开放系统互连&#xff0c;Open Systems Interconnection&#xff09;模型中传输层的协议。它使用IP作为底层协议&#xff0c;是为应用程序提供一种以最少的协议机制向其他程序发送消息的协议。其主要特点是无连接&#xff0c;不保证可靠传输和面向报…

汽车线束智能制造:MES系统与工艺深度融合的革新之路

万界星空科技汽车线束工厂MES系统解决方案是针对线束制造行业特定需求而设计的一套集成化管理系统&#xff0c;旨在提高生产效率、优化资源配置、确保产品质量并增强企业竞争力。 一、汽车线束制造工艺 汽车线束&#xff0c;作为连接汽车各个电子部件的桥梁&#xff0c;承载着…

论文:NeRF on the go:Exploiting Uncertainty for Distractor-free NeRFs in the Wild

随时随地使用NeRF。本文的目标是利用在野外随意捕捉的图像序列或视频作为输入&#xff0c;训练一个用于静态场景的NeRF&#xff0c;并有效地移除场景中的所有动态元素&#xff08;如汽车、电车、行人等&#xff09;&#xff0c;即干扰物。与现有的方法如NeRF-W [27]和RobustNeR…

python依赖包安装失败的解决办法(适用于conda安装)

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;python依赖包安装失败的解决办法&#xff08;适用于conda安装&#xff09;-CSDN博客 前言&#xff1a;这个问题之前一直困扰着我&#xff0c;因为最近要升级Anaconda-Navigator&#x…