diff --git a/retirejs-core/src/main/java/com/h3xstream/retirejs/repo/ScannerFacade.java b/retirejs-core/src/main/java/com/h3xstream/retirejs/repo/ScannerFacade.java index 596b395..cfd7049 100644 --- a/retirejs-core/src/main/java/com/h3xstream/retirejs/repo/ScannerFacade.java +++ b/retirejs-core/src/main/java/com/h3xstream/retirejs/repo/ScannerFacade.java @@ -67,13 +67,19 @@ private List findScriptUrl(String source) { List urls = new ArrayList(); for(String line : tokens) { - if(line.contains("]*" + //script tags - "[sS][rR][cC]=" + //src attribute - "[\"']([^>]*)[\"']"); //URL between quotes + if (line.toLowerCase().contains("]*" + //script tags + "src=" + //src attribute + "(?\"[^\"]*?\"|'[^']*?'|\\S+)", //URL between quotes + Pattern.CASE_INSENSITIVE); + Matcher m = p.matcher(line); - if(m.find()) { - String urlScript = m.group(1); + if (m.find()) { + String src = m.group("src"); + String urlScript = src.startsWith("\"") || src.startsWith("'") + ? src.substring(1, src.length() - 1) // trim quotes + : src; urls.add(urlScript); } } diff --git a/retirejs-core/src/test/java/com/h3xstream/retirejs/repo/ScannerFacadeTest.java b/retirejs-core/src/test/java/com/h3xstream/retirejs/repo/ScannerFacadeTest.java index 47b7dcf..b25809c 100644 --- a/retirejs-core/src/test/java/com/h3xstream/retirejs/repo/ScannerFacadeTest.java +++ b/retirejs-core/src/test/java/com/h3xstream/retirejs/repo/ScannerFacadeTest.java @@ -147,4 +147,53 @@ public void noMatch() throws IOException { verify(repo).findByHash(DUMMY_SCRIPT_SHA1); verify(repo).findByFileContent(DUMMY_SCRIPT); } + + @Test + public void uriMatchToHtml() throws IOException { + VulnerabilitiesRepositoryLoader.syncWithOnlineRepository = false; + + //Init. mock + VulnerabilitiesRepository repo = mock(VulnerabilitiesRepository.class); + when(repo.findByUri("/js/yolo.js")).thenReturn(ONE_RESULT); + + //Call the scanner logic + ScannerFacade scanner = new ScannerFacade(repo); + List results = scanner.scanHtml(( + "" + // double quote + "" + // single quote + "" // no quote + ).getBytes(),0); + + //Assertions + assertEquals(results.size(),3,"Expect one result."); + verify(repo,times(3)).findByUri("/js/yolo.js"); + verify(repo,never()).findByFilename(anyString()); + verify(repo,never()).findByHash(anyString()); + verify(repo,never()).findByFileContent(anyString()); + } + + @Test + public void filenameMatchToHtml() throws IOException { + VulnerabilitiesRepositoryLoader.syncWithOnlineRepository = false; + + //Init. mock + VulnerabilitiesRepository repo = mock(VulnerabilitiesRepository.class); + when(repo.findByUri("/js/yolo.js")).thenReturn(EMPTY_RESULT); + when(repo.findByFilename("yolo.js")).thenReturn(ONE_RESULT); + + //Call the scanner logic + ScannerFacade scanner = new ScannerFacade(repo); + List results = scanner.scanHtml(( + "" + // double quote + "" + // single quote + "" // no quote + ).getBytes(),0); + + //Assertions + assertEquals(results.size(),3,"Expect one result."); + verify(repo,times(3)).findByUri("/js/yolo.js"); + verify(repo,times(3)).findByFilename("yolo.js"); + verify(repo,never()).findByHash(anyString()); + verify(repo,never()).findByFileContent(anyString()); + } } \ No newline at end of file