dusty/scanners/dast/zap/data/zap-selenium-login.js (119 lines of code) (raw):
/*
# Copyright 2019 getcarrier.io
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
*/
var JavaString = Java.type("java.lang.String");
var Base64 = Java.type("java.util.Base64");
var DesiredCapabilities = Java.type("org.openqa.selenium.remote.DesiredCapabilities");
var CapabilityType = Java.type("org.openqa.selenium.remote.CapabilityType");
var HtmlUnitDriver = Java.type("org.openqa.selenium.htmlunit.HtmlUnitDriver");
var TimeUnit = Java.type("java.util.concurrent.TimeUnit");
var HttpRequestHeader = Java.type("org.parosproxy.paros.network.HttpRequestHeader");
var HttpHeader = Java.type("org.parosproxy.paros.network.HttpHeader");
var URI = Java.type("org.apache.commons.httpclient.URI");
var Cookie = Java.type("org.apache.commons.httpclient.Cookie");
var By = Java.type("org.openqa.selenium.By");
var WebDriverWait = Java.type("org.openqa.selenium.support.ui.WebDriverWait");
var ExpectedConditions = Java.type("org.openqa.selenium.support.ui.ExpectedConditions");
/*
Private functions
*/
function _makeSeleniumSelector(target) {
if (target.startsWith("id=")) {
return By.id(target.slice(3));
}
if (target.startsWith("name=")) {
return By.name(target.slice(5));
}
if (target.startsWith("link=")) {
return By.linkText(target.slice(5));
}
if (target.startsWith("css=")) {
return By.cssSelector(target.slice(4));
}
if (target.startsWith("//")) {
return By.xpath(target);
}
return By.cssSelector(target);
}
/*
Public interface
*/
function authenticate(helper, paramsValues, credentials) {
// Create HtmlUnit driver
var capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "htmlunit");
var driver = new HtmlUnitDriver(capabilities);
// Enable JS
driver.setJavascriptEnabled(true);
// Disable JS errors
var webClientField = driver.getClass().getDeclaredField("webClient");
webClientField.setAccessible(true);
var webClient = webClientField.get(driver);
webClient.getOptions().setThrowExceptionOnScriptError(false);
// Set options, such as timeout
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// Decode authentication script
var auth_script = JSON.parse(
new JavaString(
Base64.getDecoder().decode(
paramsValues.get("Script")
)
)
);
// Command interpreter
var interpreter = {
"open": function(driver, target, value) {
driver.get(target);
},
"waitForElementPresent": function(driver, target, value) {
var selector = _makeSeleniumSelector(target);
var wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.presenceOfElementLocated(selector));
},
"sendKeys": function(driver, target, value) {
var selector = _makeSeleniumSelector(target);
var element = driver.findElement(selector);
element.sendKeys(value);
},
"type": function(driver, target, value) {
var selector = _makeSeleniumSelector(target);
var element = driver.findElement(selector);
element.sendKeys(value);
},
"click": function(driver, target, value) {
var selector = _makeSeleniumSelector(target);
var element = driver.findElement(selector);
element.click();
},
"clickAndWait": function(driver, target, value) {
var selector = _makeSeleniumSelector(target);
var element = driver.findElement(selector);
element.click();
var wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.stalenessOf(element));
}
};
// Interpret authentication script
auth_script.forEach(function(item) {
command = item.command;
target = item.target;
target = target.replace(/%Target%/g, paramsValues.get("Target"));
target = target.replace(/%Username%/g, credentials.getParam("Username"));
target = target.replace(/%Password%/g, credentials.getParam("Password"));
value = item.value
value = value.replace(/%Target%/g, paramsValues.get("Target"));
value = value.replace(/%Username%/g, credentials.getParam("Username"));
value = value.replace(/%Password%/g, credentials.getParam("Password"));
interpreter[command](driver, target, value);
});
print("=AUTH=> Final URL: " + driver.getCurrentUrl()); // TODO: Check final URL?
// Make final request via ZAP
driver.manage().getCookies().forEach(function(cookie) {
helper.getCorrespondingHttpState().addCookie(new Cookie(
cookie.getDomain(),
cookie.getName(),
cookie.getValue(),
cookie.getPath(),
cookie.getExpiry(),
cookie.isSecure()
));
});
msg = helper.prepareMessage();
msg.setRequestHeader(new HttpRequestHeader(HttpRequestHeader.GET, new URI(driver.getCurrentUrl(), false), HttpHeader.HTTP11));
msg.getRequestHeader().setContentLength(msg.getRequestBody().length());
helper.sendAndReceive(msg, true);
return msg;
}
function getRequiredParamsNames(){
return ["Script", "Target"];
}
function getOptionalParamsNames(){
return [];
}
function getCredentialsParamsNames(){
return ["Username", "Password"];
}