您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
aduit(aduit怎么读)
漏洞,命令,安全aduit(aduit怎么读)
发布时间:2016-12-08加入收藏来源:互联网点击:
审计步骤:查看预编译的完整,关键函数定位 setObject()、setInt()、setString()、setSQLXML()关联上下文搜索 set* 开头的函数。
(3) %和_(oracle 中模糊查询)问题
@RequestMapping("/SqlInjection/{id}")public ModelAndView SqlInjectTest(@PathVariable String id){String mysqldriver = "com.mysql.jdbc.Driver"String mysqlurl = "jdbc:mysql://127.0.0.1:3306/test?user=root&password=123456&useUnicode=true&characterEncoding=utf8&autoReconnect=true"String sql = "select * from user where id= ?"ModelAndView mav = new ModelAndView("test2"); try{Class.forName(mysqldriver);Connection conn = DriverManager.getConnection(mysqlurl);PreparedStatement pstt = conn.prepareStatement(sql);pstt.setObject(1, id); //使用预编译ResultSet rs = pstt.executeQuery();审计步骤:定位相关 sql 语句上下文,查看是否有显式过滤机制。
修复方案:上面的代码片段即使这样依然存在 sql 注入,原因是没有手动过滤%。预编译是不能处理这个符号的,以需要手动过滤,否则会造成慢查询,造成 dos。
(4) order by 问题
String sql = “Select * from news where title =?”+ “order by ‘” + time + “’asc”审计步骤:定位相关 sql 语句上下文,查看是否有显式过滤机制。
修复方案:类似上面的这种 sql 语句 order by 后面是不能用预编译处理的只能通过拼接处理,所以需要手动过滤。
(5) 有关$符号的情况
#{}:相当于jdbc中的preparedstatement,传入的字符串,需要赋值后使用,可以有效防止sql注入
${}:是输出变量的值,传入的变量,直接在sql中执行,无法防止sql注入 简单的说就是#{}传过来的参数带单引号’',而${}传过来的参数不带单引号。
但是orderby是动态SQL,只能用${},用#{}会多个’ '导致sql语句失效。此外还有一个like 语句后也需要用${}。
//需要转义的字符串仍使用$delete from ${tableName}修复方案:对于可以使用#{}的情况,直接使用#{}即可解决问题对于不能使用#{}的情况(如orderby),需要增加额外的过滤逻辑,以此判断输入内容是否正常,如字段类型、字段长度等
4. maven不安全模块
漏洞描述
Maven,是一个Java开发比较常用的项目管理工具,可以对Java项目进行构建、依赖管理。当它配置一个不安全的模块时,即存在安全风险。
审计方法
查看配置的版本是否属于安全版本区间。 如果是,则确认:
//3.9版本是存在漏洞的版本。安全版本是3.11以上dependency groupIdcom.hazelcast/groupId artifactIdhazelcast-client/artifactId version3.9/version/dependency修复方案
配置为安全版本即可(同时应注意解决兼容问题)
5. 服务端请求伪造(SSRF)
漏洞描述
SSRF是攻击者让服务端发起指定的请求,攻击的目标一般是从外网无法访问的内网系统。SSRF形成的原因大都是由于代码中提供了从其他服务器应用获取数据的功能但没有对目标地址做过滤与限制。比如从指定URL链接获取图片、下载等。一般利用http协议来探测端口,利用file协议读取任意文件。
利用场景
SSRF漏洞一般位于远程图片加载与下载、图片或文章收藏功能、URL分享、通过URL在线翻译、转码等功能点处。
关键词/接口/类包
// JavaHttpURLConnection.getInputStreamURLConnection.getInputStreamRequest.Get.executeRequest.Post.executeURL.openStreamImageIO.readOkHttpClient.newCall.executeHttpClients.executeHttpClient.execute审计方法
1、内网系统的SSRF直接为误报(内网系统之间互调互传)
2、检查请求的URL是否为外部可控,即由外部传入
3、检查请求的返回,是否对请求的返回数据做了安全处理
漏洞示例
//请求URL为外部可控,返回数据直接展示String url = request.getParameter("picurl");StringBuffer response = new StringBuffer();URL pic = new URL(url);HttpURLConnection con = (HttpURLConnection) pic.openConnection();con.setRequestMethod("GET");con.setRequestProperty("User-Agent", "Mozilla/5.0");//发起请求,触发漏洞BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));String inputLine;while ((inputLine = in.readLine()) != null) { response.append(inputLine); }in.close();modelMap.put("resp",response.toString());return "getimg.htm"再举一例:
//HttpClients函数的SSRF漏洞代码,审计时为确认:String url = request.getParameter("url");CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);HttpResponse httpResponse = client.execute(httpGet); //发起请求修复方案
使用白名单校验HTTP请求url地址避免请求url外部可控避免将请求响应及错误信息返回给用户禁用不需要的协议及限制请求端口,仅仅允许http和https请求等6. 路径遍历
目录/路径遍历、任意文件上传/下载
漏洞描述
在下载文件相关的代码中,若不对HTTP请求中的待下载文件名进行检查,则有可能产生任意文件下载漏洞。攻击者可以指定文件名、文件路径等文件操作的参数,越权访问正常情况下无法到达的系统资源。
审计方法
判断是否存在上传下载行为判断路径是否可被外部控制,如果外部可控则向下判断是否对文件路径做了安全措施,如果做了安全措施为误报漏洞示例
没有对路径做任何安全处理,如:
//没有对路径做任何安全处理措施path = "config/"+path;File file = new File(path);System.out.println(path);response.setHeader("Content-Disposition", "attachment;filename=\\"" + new String(path.getBytes(), "ISO8859-1") + "\\"");response.setContentLength((int) file.length());byte[] buffer = new byte[4096];// 缓冲区BufferedOutputStream output = null;BufferedInputStream input = null;再举一例:
//对下载的文件未做安全处理public Response getImage(@javax.ws.rs.PathParam("image") String image) { File file = new File("resources/images/", image); if (!file.exists()) { return Response.status(Status.NOT_FOUND).build(); } return Response.ok().entity(new FileInputStream(file)).build();}修复方案
使用getCanonicalPath()、getAbsolutePath()等方法获取规范路径对文件操作参数进行输入验证,过滤特殊字符通过文件头判断来限制文件类型,而不是通过文件后缀来判断服务器安全配置策略文件。将所能读取的文件限定在特定的目录下7. 命令注入
漏洞描述
命令注入是指通过提交恶意构造的参数破坏命令语句结构,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。通常表现为攻击者能够篡改程序执行的命令或命令执行的环境,从而直接或间接的控制了所执行的命令。
常见的命令执行方法
// JavaRuntime.execProcessBuilder.startGroovyShell.evaluate审计方法
检查是否是系统命令,如果不是系统命令而是常规字符串拼接,则为误报检查所执行的命令是否为外部可控制,如果外部不可控(例如命令拼接参数不为外部控制)则为误报外部可控制的情况下检查命令的拼接参数是否做了安全措施,如果未做安全措施即为确认漏洞示例
(1) 没有对外部传入的命令拼接参数做任何安全处理措施,如:
//没有对外部传入的命令参数command做任何安全处理System.out.println("Command: ping"+ command);Runtime rt = Runtime.getRuntime();Process proc = rt.exec("cmd.exe /C ping "+command);int res = proc.waitFor();if(res !=0){ System.out.println("process error: "+ res);}InputStream in = (res == 0)? proc.getInputStream() : proc.getErrorStream();BufferedReader reader=new BufferedReader(new InputStreamReader(in));buffer=new StringBuffer();String line;while((line = reader.readLine())!=null){ buffer.append(line+"\\n");}上一篇:沟通漏斗(沟通漏斗原理)
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |