freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

wJa进阶分析
2021-12-23 11:13:47
所属地 北京

继上篇文章: https://www.freebuf.com/sectool/316916.html

优化

在上述的代码脚本中,其实还是有可优化的的地方的,当程序项目比较大时,类就无法通过手动输入进行测试,所以可以通过GetAllClassName类进行测试,所以可以进行如此优化。

function SQLTrack(className){
	an = GetClassAnnotation(className);
	classPath = "http://127.0.0.1:8080".getSpringAnnotationValue(an);
	methods = GetAllMethodName(className);
	size = GetArrayNum(methods);
	i = 0;
	while(i < size){
		if(methods[i] != "<init>"){track(className,methods[i],classPath);}
		i = ToInt(i+1);
	}
	return 0;
}
function main(args){
	allClass = GetAllClassName();
	size = GetArrayNum(allClass);
	i = 0;
	while(i < size){
		an = GetClassAnnotation(allClass[i]);
		p = getSpringAnnotationValue(an);
		if(p != ""){
			SQLTrack(allClass[i]);
		}
		i = ToInt(i + 1);
	}
	
}

而且也可以观察到,脚本已经非常的大了,所以有一点臃肿了,之后我会将Spring的常用函数全部编写成工具文件,直接使用#include就可以直接包含进来常用的方法。

更复杂的调用链

这里我们更换一个靶场,使用一个朋友的靶场,下面是Spring的项目结构:

image

相同的,我们同样运行之前写好的SQL注入漏洞脚本,我们可以看到如下的结果:

image

仔细观察调用链你会发现一件很有意思的事情。

首先先手动分析一下这条路径的真正执行流:

return this.sqliDao.addUser(name,age);

这里注意sqliDao这个属性变量,当你看这个变量类型时,你会发现他是一个接口:

private final SQLIDao sqliDao;
//_       ____                ____                                  _ __
//| |     / / /_____  _____   / __ \___  _________  ____ ___  ____  (_) /__
//| | /| / / //_/ _ \/ ___/  / / / / _ \/ ___/ __ \/ __ `__ \/ __ \/ / / _ \
//| |/ |/ / ,< /  __/ /     / /_/ /  __/ /__/ /_/ / / / / / / /_/ / / /  __/
//|__/|__/_/|_|\___/_/     /_____/\___/\___/\____/_/ /_/ /_/ .___/_/_/\___/ 
//                                                        /_/
package org.sec.cidemo.dao;
public interface SQLIDao{
	public abstract List selectUser(){
	}
	public abstract String addUser(){
	}

}

但最终为何我们还是可以跟踪出真正的调用链呢?

实际上wJa会帮我们进行特定于java的分析,并且可以自动分析子类对象和实现类是否进入危险函数。

看wJa的调用链第三条可以看到,当前处于:SQLIDaoImpl.selectUser

跳转到此方法:

public class SQLIDaoImpl implements SQLIDao
...
public List selectUser(String name){
		String sql;
		List users;
		System.out.println(name);
		sql = new StringBuilder().append("select * from t_user where name='").append(name).append("'").toString();
		users = this.jdbcTemplate.query(sql,new BeanPropertyRowMapper(User.class));
		return users;
	}
...

发现正是这个实现类存在注入漏洞。

并且仔细观察可以看到,wJa还可以帮助我们进行变量转换跟踪。

其实实际上jdbc最终调用的是sql这个变量,并不是name,wJa可以自动追加追踪接受追踪变量的变量。

SSRF漏洞分析

我们这里主要跟踪SSRF漏洞,相比于SQL注入漏洞,我们要对目标进入函数和黑盒测试代码进行修改。

url = new URL(data);
con = url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent","Mozilla/5.0");
in = new BufferedReader(new InputStreamReader(con.getInputStream()));

这里可以通过进入BufferedReader的构造方法来判断是否是SSRF,但是更安全的是如果路径存在URL类,那么就可以基本判断是存在SSRF漏洞。

对于黑盒测试代码可以通过传递百度的地址进行关键字判断。

function judgeSSRF(api){
	res = HttpGet(api."http://www.baidu.com","");
	if(StrFindStr(res[0],"//www.baidu.com/",0) != "-1"){
		return 1;
	}
	return 0;
}

其余的代码都是进行小幅度更改,但是需要注意的是,构造函数是<init>

最终可以得到如下:

image

~工作顺利

# 代码审计 # 黑盒测试 # 白盒审计系统
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录