https://qingshan-cloud-security.ue.r.appspot.com/
- A simple event management website based on Flask + GCP. All HTML and JavaScript is served statically to keep secure.
- Users can upload events and dates, or delete events.
- The website could update the remaining time of the event in real time and delete expired events.
- Yearless dates work, showing time to next occurrence of a matching date (e.g., 03-01 means “every March 1st”)
- Added authentication to the website. All of the events are tied to one and only one user; every user manages a unique set of data just for them. When not logged in, the user is automatically directed to a login page.
- All interactions are over HTTPS to secure data transmitting.
- Provided a registration page that allows the user to provide a username and password, then immediately logs them in and redirects them to the main page.
- Provided a login page that allows the user to provide a username and password. If the username and password are valid, let the user log in.
- Users must login with an opaque session token. Implemented this function without built-in functions like flask.session or flask.login. Users could register, login, and logout with a session token. Session tokens expire after 1 hour. Enforce this by deleting the cookie when an expired session token is used.
- Added a logout button that invalidates the session token, removes the cookie, and redirects the user to the login page.
- Only secure derivatives of passwords are stored in the database. Used Bcypt library for key stretching.
- built a migration function, which could migrate old data to the first user (or a user that you want to have the original data).
- Check the login status of users in real time. JSON calls will redirect the entire browser window to the login page when they fail due to a missing (or expired) session token.
- Implemented an OpenID Connect Client to login with Google. Users could click a third-party OpenID Connect button to their login page.
- Added CSRF protection by double cookie verification.
- Installed docker and pulled the base image from Docker Hub.
- Wrote HTTP server code that outputs “Hello, World!” from port 8080 (from inside).
- Wrote Dockerfile.
- Wrote a little script that outputs the URL you should go to(ip address and port) in order to see the output.
Understood and reproduced CVE-2019-5736 runC Docker escape vulnerability.
- Initialized Postgres by creating a database with two columns: path and count.
- Created a service that accepts GET requests and keeps track of them in the database.
- Ran everything in its own container.
- Returned a page that shows all paths in ascending lexicographical order, with their counts next to them.