赞
踩
这段时间研究AI平台的能力。 今天我把库博检测工具发现的一个Java安全漏洞相关代码传到几款AI工具上进行分析,看看这几款工具反馈的结果。这些工具包括ChatGPT-3.5、Forefront Claude、AIChat(组合)和清华ChatGlm。
首先我们看看库博检测出的这个漏洞是否存在。先在代码。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/**
* 文件下载
* 有目录遍历攻击漏洞的代码
*/
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
OutputStream out = null;
//获取项目部署绝对路径下的upload文件夹路径,下载upload目录下面的文件
String root = request.getServletContext().getRealPath("/upload");
//获取文件名
String filename = request.getParameter("filename");
File file = new File(root + "/" + filename);
//根据文件路径创建输入流
FileInputStream fis = new FileInputStream(file);
out=response.getOutputStream();
//设置响应头,弹出下载框
System.out.println(root + "/" + filename);
//response.setContentType("application/x-msdownload");
// response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
String agent = request.getHeader("USER-AGENT").toLowerCase();
String name = new String(filename.getBytes(agent.indexOf("msie") != -1 ? "GBK" : CharEncoding.UTF_8), CharEncoding.ISO_8859_1);
response.setContentType("application/octet-stream");
response.setHeader("Content-Length", "" + file.length());
response.setHeader("Pragma", "NO-cache");
response.setHeader("Cache-Control", "No-cache");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.setDateHeader("Expires", -1);
response.setHeader("Content-disposition", "attachment;filename=" + name);
//response.addHeader("Content-Length", "" + file.length());
//byte[] b = new byte[fis.available()];
byte[] b = new byte[1024];
int len=0;
while ((len=fis.read(b))!=-1)
out.write(b,0,len);
if(len==-1)
{
fis.close();
request.getSession().setAttribute("message2","下载完成!");
request.getRequestDispatcher("/filetraversal.jsp").forward(request, response);
}
}
库博检测是以安全漏洞维度展示的,所以点击某个漏洞类型,可以看到该安全漏洞对应的代码位置。当前这个版本没有以文件形式展示漏洞方式了(国内工具基本上都没有该功能,库博之前版本是有的)。
首先我们测试一下边界AICHAT,我们使用推荐模型组合,输入代码后,给出分析结果如下。
可以看到,AI引擎给找出来了多个缺陷,其中第一条就是我们最关注的路径遍历,能够给出来。第2条代码中不存在,但是3、5、6还的确是存在的问题。这样看,分析还是比较全面的。
使用国外AI工具Forefront Chat进行分析,该工具也是集成Chatgpt、Claude 1.2,该引擎是需要在互联网进行搜索,大概1分钟没有反馈出结果。
我们看Chatgpt官方网站上,使用Chatgpt-3.5引擎的分析结果。
分析上面的结果,可以看到发现了3个安全问题,第1个事路径遍历,第2个问题,国产AI工具也给出了类似结果。而第3个问题感觉是一个误报,因为在代码中进行流资源释放,但是是在一个分支进行了释放,应该算是一个误报。
我们再看看在清华大学的ChatGlm平台上的分析结果。
……………省略中间代码,见下面。
为了方便,我贴出所有返回的代码。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/**
* 文件下载
* 修复了目录遍历攻击漏洞的代码
*/
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
OutputStream out = null;
// 获取项目部署绝对路径下的upload文件夹路径,下载upload目录下面的文件
String root = request.getServletContext().getRealPath("/upload");
// 获取文件名
String filename = request.getParameter("filename");
// 检查文件名是否符合预期
if (filename == null || filename.trim().isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid file name");
return;
}
// 限制用户可以下载的文件类型
String allowedExtensions = "txt,jpg,png,gif";
String fileExtension = filename.substring(filename.lastIndexOf('.') + 1).toLowerCase();
if (!allowedExtensions.contains(fileExtension)) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid file extension");
return;
}
File file = new File(root + "/" + filename);
// 使用ServletContext.getResourceAsStream()代替FileInputStream
try (InputStream is = request.getServletContext().getResourceAsStream("/upload/" + filename)) {
if (is == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found");
return;
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Length", String.valueOf(is.available()));
response.setHeader("Pragma", "NO-cache");
response.setHeader("Cache-Control", "No-cache");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.setDateHeader("Expires", -1);
response.setHeader("Content-disposition", "attachment;filename=" + filename);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
// 处理异常,例如记录日志、返回错误信息等
e.printStackTrace();
}
if (out != null) {
try {
out.flush();
out.close();
} catch (IOException e) {
// 处理异常,例如记录日志、返回错误信息等
e.printStackTrace();
}
}
}
突然感觉清华大学的这个AI引擎功能强大,不但给出了4个问题,最亮眼的给出的修复后的代码,这段代码我还没有时间去替换原来代码去编译看看是否存在问题,但是这个功能足于领先了。为了验证引擎,我把返回的代码又贴了回去,让引擎分析分析是否存在漏洞。其反馈结果如下:
在其提供的修复代码的基础上又检测出的问题,其提供的修复代码中,增加了对于文件类型的限制。
通过这个例子说明,国内AI引擎有自己创新之处,但是在一些细节上还是存在瑕疵,需在在引擎或训练数据上做的更精细。
(结束)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。