音乐播放器
Moyv_blog
 
文章 标签
5

Powered by 墨羽 | Theme: Fog

代码审计

代码审计

快速审计流程

找源码

  1. Runtime与反射(代码审计\命令执⾏bypass、webshell免杀、隐藏后门)
  2. JDBC反序列化(代码审计\Fastjon其他利⽤链)
  3. ⽂件上传(代码审计、路径穿越)
  4. SQL注⼊(代码审计、⼩细节int和string)
  5. JNDI注⼊ (代码审计、fofa、实战利⽤、以及codebase)
  6. 反序列化漏洞演示(代码审计、yso、bp、环境)

⾼效获取源码的方式

cms | 普通web程序 = 批量⽣产 | 定制

  1. fofa关键字搜索提取指纹特征
    通过扫⽬录⼯具对所有站点进⾏⽬录扫描获取备份⽂件
    title="管理系统"
    title="dvAdmin管理系统"
  2. Github或者Gitee搜索
  3. 源码网站获取

zuidaima.com
bbs.52jscn.com
down.chinaz.com

  1. 托源码(授权情况下)
    获取目标权限下,拖源码
  2. 官网买(不建议)
  3. 同站点⽬录扫描(看备份⽂件.zip/.bak/.rar)

fofa下载同cms的站点
dirsearch扫文件

  1. 咸鱼/淘宝/网盘买

快速审计

使用源码扫描工具 规则

DMSCA-企业级静态源代码扫描分析服务平台${.*}
VeraCode静态源代码扫描分析服务平台
Fortify Scan 静态 ${},File file = new FIle(path),password

动态分析

jvm

codeQl. JVM内存特征 log4j JNDI
https://github.com/safe6Sec/CodeqlNote

手工代码审计

代码包的分类

inter ----> Webservlet

  • 1.按照web访问流程的架构 web 前端---> Filter 权限校验(过滤层)(安全参数) ---> Controller 参数过滤 sex 1,2 age 110(过滤业务(逻辑))--->Service 8+10=18--->Dao 持久化 insert ----> 数据库

挖sql注入 一定要 在 Dao层(真正与数据库打交道),可能要绕Filter权限
短信轰炸(业务逻辑漏洞)要在 Service层(业务逻辑处理),可能要绕Controller
权限绕过 要在Filter层找

json(前后端分离)(响应包只有 数据 )/ 表单(前后端不分离)(响应包有html代码)
前后端不分离:jquery、layui、bootstrap、
前后端分离:vue、angluar、react

  • 2.按照功能模块划分 ⽤户管理 ,订单模块.......
    Controller\Filter\Service\Dao
    User{Controller\Filter\Service\Dao} setting{Controller\Filter\Service\Dao}

Maven源码审计(审第三方插件)

maven新的模式,lib pom.xml

  • pom评估或者lib⽬录评估

Maven项⽬对象模型(POM),可以通过⼀⼩段描述信息来管理项⽬的构建,报告和⽂档的项⽬管理⼯具软件。
Maven 除了以程序构建能⼒为特⾊之外,还提供⾼级项⽬管理⼯具。由于 Maven 的缺省构建规则有较⾼的可重⽤性,所以常常⽤两三⾏ Maven 构建脚本就可以构建简单的项⽬。由于 Maven 的⾯向项⽬的⽅法,许多 Apache Jakarta 项⽬发⽂时使⽤ Maven,⽽且公司项⽬采⽤ Maven 的⽐例在持续增⻓。
Maven这个单词来⾃于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项⽬中⽤来简化构建过程。
当时有⼀些项⽬(有各⾃Ant build⽂件),仅有细微的差别,⽽JAR⽂件都由CVS来维护。于是希望有⼀种标准化的⽅式构建项⽬,⼀个清晰的⽅式定义项⽬的组成,⼀个容易的⽅式发布项⽬的信息,以及⼀种简单的⽅式在多个

  • 项⽬中共享JARs。
  1. maven仓库讲解. https://search.maven.org
  2. maven三⽅依赖的危害性快速评估
  3. 各个依赖分别扮演⻆⾊

Runtime命令注入漏洞

  • Runtime是java执⾏系统命令的⼀个类
  • 漏洞常见于路由器上 ping命令

Runtime的种类

//字符串类型 不会解析&,所以不会执行
String cmd = "www.baidu.com";
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(Runtime.getRuntime().exec("ping -c 3 "+cmd).getInputStream()));
String temp;
while((temp=bufferedReader.readLine())!=null){
System.out.println(temp);
 }
//数组类型,可以执行
String cmd = "www.baidu.com && whoami";
String[] command = {"/bin/bash","-c","ping -c 3 "+cmd};
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(Runtime.getRuntime().exec(command).getInputStream()));
String temp;
while((temp=bufferedReader.readLine())!=null){
System.out.println(temp);
 }

原因是因为不同的重载⽅式在底层有不同处理,是否解析&&等命令。并⾮所有的runtime都可以进⾏注⼊,当然,在研究层⾯的意义上,有绕过的⼿法

  1. 寻找Runtime
    Ctrl + F 当前页面搜索
    双击shift -- 全局搜索
  2. 查看Runtime中参数是数组还是字符串&用户是否可控
    字符串类型将执⾏的具有拼接字符的命令进⾏bash编码

whoami && ifconfig
String cmd = "bash -c {echo,d2hvYW1pICYmIGlmY29uZmln} | {bash64,-d} | {bash,-i}";

//半拼接半bash不执行
String cmd = "bash ";
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(Runtime.getRuntime().exec("ping -c 3 "+cmd).getInputStream()));
String temp;
while((temp=bufferedReader.readLine())!=null){
System.out.println(temp);
//全bash执行
String cmd = "bash";
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream()));
String temp;
while((temp=bufferedReader.readLine())!=null){
System.out.println(temp);

https://f5.pm/go-19610.html

反射和Runtime的结合

先使⽤反射加载

Class<?> runtimeClass = Class.forName("java.lang.Runtime");  //反射出整个类
Method getRuntime = runtimeClass.getMethod("getRuntime"); //反射类中的方法
Object runtime = getRuntime.invoke(runtimeClass); //调用runtimeClass这个类的getRuntime方法
Method exec = runtimeClass.getMethod("exec", String.class); //反射类中
exec.invoke(runtime, "open .");
String str = "ls";
byte[] srtbyte = str.getBytes();
// 定义"java.lang.Runtime"字符串变量
String rt = new String(new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46,
82, 117, 110, 116, 105, 109, 101});
System.out.println(rt);
// 反射java.lang.Runtime类获取Class对象
Class<?> c = Class.forName(rt);
// 反射获取Runtime类的getRuntime⽅法
Method m1 = c.getMethod(new String(new byte[]{103, 101, 116, 82, 117, 110, 116,
105, 109, 101}));
Object m3 = m1.invoke(c);
// 反射获取Runtime类的exec⽅法
Method m2 = c.getMethod(new String(new byte[]{101, 120, 101, 99}),
String.class);
// 反射调⽤Runtime.getRuntime().exec(xxx)⽅法
Object obj2 = m2.invoke(m3, new Object[]{new String(srtbyte)});
// 反射获取Process类的getInputStream⽅法
Method m = obj2.getClass().getMethod(new String(new byte[]{103, 101, 116, 73,
110, 112, 117, 116, 83, 116, 114, 101, 97, 109}));
m.setAccessible(true);
// 获取命令执⾏结果的输⼊流对象:p.getInputStream()并使⽤Scanner按⾏切割成字符串
Scanner s = new Scanner((InputStream) m.invoke(obj2, new Object[]
{})).useDelimiter("\\A");
String result = s.hasNext() ? s.next() : "";
System.out.println(result);

反射和Process的结合

命令拼接符

附录

Bookmarks

代码审计(java+php)

Xyntax/1000php: 1000个PHP代码审计案例(2016.7以前乌云公开漏洞)
https://github.com/Xyntax/1000php
cn-panda/JavaCodeAudit: Getting started with java code auditing 代码审计入门的小项目
https://github.com/cn-panda/JavaCodeAudit/
Pwnhub Web题Classroom题解与分析 | 离别歌
https://www.leavesongs.com/PENETRATION/pwnhub-web-classroom-django-sql-injection.html
帖子详情 - 『代码审计』知识星球
https://govuln.com/topic/407/
source insight
https://govuln.com/topic/323/
phith0n/JavaThings: Share Things Related to Java - Java安全漫谈笔记相关内容
https://github.com/phith0n/JavaThings
XCTF两道web题目的writeup | 离别歌
https://www.leavesongs.com/PENETRATION/Mini-XCTF-Writeup.html
PHP代码审计学习 | 零の杂货铺
http://phantom0301.cc/2017/06/06/codeaudit/
PHP escapeshellarg()+escapeshellcmd() 之殇
https://paper.seebug.org/164/
回忆phpcms头像上传漏洞以及后续影响 | 离别歌
https://www.leavesongs.com/PENETRATION/after-phpcms-upload-vul.html
XDCTF2015代码审计全解 | 离别歌
https://www.leavesongs.com/PENETRATION/XDCTF-2015-WEB2-WRITEUP.html
CHYbeta/Code-Audit-Challenges: Code-Audit-Challenges
https://github.com/CHYbeta/Code-Audit-Challenges
jiangsir404/Audit-Learning: 记录自己对《代码审计》的理解和总结,对危险函数的深入分析以及
在p牛的博客和代码审计圈的收获
https://github.com/jiangsir404/Audit-Learning
java代码审计手书(一) - 先知社区
https://xz.aliyun.com/t/3358
Bug Patterns - Find Security Bugs
https://find-sec-bugs.github.io/bugs.htm
Go代码审计 - gitea 远程命令执行漏洞链 | 离别歌
https://www.leavesongs.com/PENETRATION/gitea-remote-command-execution.html
Java Web安全-代码审计(一)
https://mp.weixin.qq.com/s/o1-G9LaK6OFUWbJs3cfKBg
帖子详情 - 『代码审计』知识星球
https://govuln.com/topic/1306/
From 0 to RCE: Cockpit CMS – PT SWARM
https://swarm.ptsecurity.com/rce-cockpit-cms/
Trending Java repositories on GitHub this month
https://github.com/trending/java?since=monthly&spoken_language_code=zh
burpheart/PHPAuditGuideBook: 《PHP代码审计入门指南》 这本指南包含了我在学习PHP代码审计过程中整理出的一些技巧和对漏洞的一些理解
https://github.com/burpheart/PHPAuditGuideBook
java代码审计学习 - FreeBuf网络安全行业门户
https://www.freebuf.com/column/3143