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

正文开始前辟个谣先

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

牛牛郑重告知大家

目前还没有这个计划

请大家放心使用

添加图片注释,不超过 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.mzph.cn/diannao/52104.shtml

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

相关文章

前端使用 Konva 实现可视化设计器(21)- 绘制图形(椭圆)

本章开始补充一些基础的图形绘制&#xff0c;比如绘制&#xff1a;直线、曲线、圆/椭形、矩形。这一章主要分享一下本示例是如何开始绘制一个图形的&#xff0c;并以绘制圆/椭形为实现目标。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c…

WEB渗透免杀篇-cshot远程shellcode

往期文章 WEB渗透免杀篇-免杀工具全集-CSDN博客 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀…

笔记本电脑无线网卡突然没有了

目录 笔记本电脑无线网卡突然没有了最优解决方案 笔记本电脑无线网卡突然没有了 记录一次笔记本无线网卡突然没有了的解决方案 显示黄色感叹号&#xff0c;试了几个安装驱动的软件都不行 最优解决方案 找到网卡的厂商官网&#xff0c;官网上下载驱动 比如我的无线网卡是Int…

2024零基础转行做程序员,选什么语言更好就业?

零基础转行做程序员&#xff0c;选什么语言更好就业&#xff0c;未来的发展前景更好&#xff1f; 这个问题困扰了不少想转行的同学。有人说Python简单好上手&#xff0c;有人说Java就业机会多&#xff0c;有人说C薪资高&#xff0c;到底该怎么选&#xff1f; 其实各个语言的发…

leetcode118. 杨辉三角,老题又做

leetcode118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1…

数字媒体产业发展现状剖析,洞悉数字产业园的创新之举

在当今数字化时代&#xff0c;数字媒体产业发展迅猛&#xff0c;呈现出一片繁荣景象。然而&#xff0c;在这繁荣的背后&#xff0c;数字媒体产业发展现状也存在着诸多挑战与机遇。 数字媒体产业发展现状的一个显著特点是技术的快速更新换代。从虚拟现实&#xff08;VR&#xf…

vue3之仪表盘

vue3之仪表盘 效果&#xff1a; 版本 “echarts”: “^5.5.1” 核心代码&#xff1a; <!--* Description: 圆环组件封装* Version: 1.0* Autor: qh --><template><div ref"chartRef" class"circle"></div> </template>&l…

如何在没有密码的情况下解锁Oppo手机?5 种简单的方法

保护智能手机隐私的一种绝佳方法是设置复杂的锁屏密码或图案。一些OPPO手机的所有者在更改图案或密码后&#xff0c;在一夜之间失去了对其图案或密码的内存。事实上&#xff0c;OPPO用户遇到的众多问题包括忘记密码或锁定屏幕。遗憾的是&#xff0c;没有多少人知道无需密码即可…

阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技

阿里声音项目Qwen2-Audio的部署安装&#xff0c;在服务器Ubuntu22.04系统——点动科技 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有…

vue3 RouterLink路由跳转后RouterView组件未加载,页面未显示,且控制台无任何报错

在使用 vue3 开发项目过程中&#xff0c;组件之间使用 router-link 跳转&#xff0c;但是当我开发的组件跳转到其他组件时&#xff0c;其他组件的页面未加载&#xff0c;再跳转回自己的组件时&#xff0c;自己的组件也加载不出来了&#xff0c;浏览器刷新后页面可以加载出来。但…

6.画面渲染及背景-《篮球比赛展示管理系统》现场管理员角色操作手册

通过[特效实验室]及[更换背景] 对整个展示界面的底部图层进行动画渲染。此功能是平台的一大特色。一般用在选手上场或颁奖等。用户可以根据现场情况&#xff0c;妥善发挥。背景图片及其特效&#xff0c;应该在比赛之前设置好。

java: 错误: 无效的源发行版:17

错误信息 java: 错误: 无效的源发行版&#xff1a;17 原因 这个错误通常表示你的 Java 编译器版本不支持你指定的 Java 版本。 解决方式 pom.xml 版本改为18或8 <properties><java.version>18</java.version></properties>设置&#xff1a; 改完…

Transformer模型框架

Transformer 模型框架源自2017年论文 《Attention is All You Need》 Self-Attention 1、Transformer 结构 Transformer 整体框架由 Encoder 和 Decoder 组成&#xff0c;本质上是 Self-Attention 模型的叠加。 2、Encoder Encoder 的主要作用是让机器更清楚的了解到句子中…

时钟信号如何影响高分辨率ADC

1 简介 在数据采集系统中&#xff0c;时钟作为时间基准&#xff0c;使所有部件都能同步工作。对于ADC&#xff0c;精确而稳定的时钟确保主机向ADC发送命令&#xff0c;ADC以正确的顺序接收来自主机的命令。更为重要的是&#xff0c;系统时钟信号允许用户在需要时对输入进行采集…

nginx基础配置实例

nginx账户认证功能 由ngx_http_auth_basic_module 模块提供此功能 建立非交互用户认证 [rootNginx ~]# htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin admin创建web测试静态文本 mkdir /webdata/nginx/example.org/example/login echo login > /webdata/nginx/e…

遗传算法与深度学习实战(7)——使用遗传算法解决N皇后问题

遗传算法与深度学习实战&#xff08;7&#xff09;——使用遗传算法解决N皇后问题 0. 前言1. N 皇后问题2. 解的表示3. 遗传算法解决 N 皇后问题小结系列链接 0. 前言 进化算法 (Evolutionary Algorithm, EA) 和遗传算法 (Genetic Algorithms, GA) 已成功解决了许多复杂的设计…

JWT加密工具

JWT加密工具 2.JWT介绍 JSON Web Token&#xff08;JWT&#xff09;,它定义了一种简洁的、自包含的协议格式&#xff0c;JWT可以使用HMAC算法或使用RSA的公钥/私钥对进行签名&#xff0c;防止被篡改。 JWT官网&#xff1a; https://jwt.io JWT组成 JWT由三个部分组成&…

C/C++实现蓝屏2.0

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 前…

这家AGV机器人龙头高歌猛进,半年营收27亿,国内对手们慌了吗?

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 机器人业务高歌猛进&#xff0c;海康威视创新引擎全速运转 海康威视于近日揭晓了其2024年上半年的辉煌成绩单。这份报告不仅彰显了公司整体业务的稳健增长&#xff0c;更引人注目的是…

vue-element-admin解决三级目录的KeepAlive缓存问题(详情版)

vue-element-admin解决三级目录的KeepAlive缓存问题&#xff08;详情版&#xff09; 本文章将从问题出现的角度看看KeepAlive的缓存问题&#xff0c;然后提出两种解决方法。本文章比较详细&#xff0c;如果只是看怎么解决&#xff0c;代码怎么改&#xff0c;请前往配置版。 一…