Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro to Web App Security - CodePlatoon Bootcamp

Avatar for ropnop ropnop
December 14, 2022

Intro to Web App Security - CodePlatoon Bootcamp

A full day introduction/bootcamp for Web App Security. Originally presented and taught to CodePlatoon cohorts (https://www.codeplatoon.org/)

Avatar for ropnop

ropnop

December 14, 2022
Tweet

More Decks by ropnop

Other Decks in Technology

Transcript

  1. 1 Ronnie Flathers – @ropnop – [email protected] Intro to Web

    App Security Testing Code Platoon – Dec 2022
  2. Agenda • Intro • High Level Security Concepts • Web

    App + HTTP Testing Basics • Web Vulnerability Deep Dives • Cross Site Scripting (XSS) • Cross Site Request Forgery (CSRF) • Injection Attacks • Setting up Burp Suite • Hands on lab • CTF! 2
  3. 3 Introduction - Me • Ronnie Flathers • Chicago, IL

    • NetSec/AppSec/ProdSec/DevSecOps • Principal Engineer (Prodsec) @ Marqeta 3 @ropnop github.com/ropnop blog.ropnop.com
  4. Introduction - OWASP • Open Web Application Security Project •

    Non-profit foundation • Chapters all across the world • Free resources, tools and trainings • OWASP Top 10 • OWASP ASVS • OWASP SAMM • OWASP ZAP • Conferences • Global AppSec • Chicago Chapter • MeetUp Link 4 https://owasp.org/
  5. Security + Engineering 6 • Security is no longer a

    specialized silo with an organization – it is everyone’s job • The shift towards to DevOps has brought on the concept of “total ownership” of code – and that means owning your own security • Application Security teams are becoming “enablers” not “gatekeepers” To be a successful developer in today’s age, you will have to know security concepts
  6. Threat vs Vulnerability • It’s always important to “think like

    an attacker” • But you also have to contextualize everything and be realistic • Understand both threats and vulnerabilities • Threat Modeling • Vulnerability scanning • Combined, you understand risk 8 What are the “threats” to a bank? Who are the “threat actors”? What are possible “vulnerabilities”? What are the “controls”?
  7. Types of Security Assessments 9 How do you make sure

    your code is secure? Activity Objective Threat Modeling Identify threats and weaknesses; design and validate controls Static Application Security Testing (SAST) Scan source code to identify vulnerabilities and weaknesses Dynamic Application Security Testing (DAST) Actively probe/scan running applications for unexpected behavior/vulnerabilities Software Composition Analysis Inventory open source components; identify known vulnerabilities and license risks Penetration Testing* Manual test to validate controls and identify vulnerabilities and impact (risk) Vulnerability Scanning Identify vulnerabilities in network and infrastructure components (incl. containers) * Our focus today
  8. Manual (Penetration Testing) • Knowing how to perform web application

    testing is an important skill: • Know how/what attackers look for • Manually test specific vulnerabilities • Manually verify findings • Scanners (SAST/DAST) don’t understand context • Don’t understand what is “allowed” or “normal” • I want to empower you to test things yourselves With great power comes great responsibility… You should only pentest things you have permission to test! Tons of free resources on the internet (or bug bounties…) 11
  9. Foundational Knowledge • A lot of web app security education

    is based on attacks rather than the underlying security principles • Fixing security bugs in webapps is like “whack a mole” when you don’t understand the core underlying issues • Even very experienced developers and security testers mix up things like CORS, CSRF and XSS 13 By understanding why attacks work, you can learn how to defend against them
  10. Web Technologies Overview • HTTP • Plaintext protocol that powers

    the web • Well defined protocol with accepted verbs and headers • Generally TCP over ports 80/443 • HTML • Markup language that describes to the browser how to render a page • Not a “programming language” just a format (like XML or JSON) • CSS • Style metadata associated with HTML; tells the browser how to display the HTML • Document Object Model (DOM) • The browser parses HTML and CSS into a Document Object Model (DOM) • The DOM is ultimately what gets displayed and clicked on by the end user 14 HTML CSS Document Object Model (DOM) www.example.com
  11. Web Technologies Overview • A complete programming language • Browsers

    have their own JS engine that executes loaded JS code • Has full read and write control of the DOM • Modern pages make heavy use of DOM manipulation with JS (e.g. animations) • Has full access to browser storage • Can access cookies • Can talk to browser APIs • E.g. webcam, microphone, location • Browser executes JS in a sandbox to limit its power 15 HTML CSS Document Object Model (DOM) www.example.com JavaScript Storage Browser APIs Cookies In the world of web, JavaScript is king
  12. HTTP Basics • HTTP is plaintext • Everything is in

    ASCII • Uses common words and verbs • HTTP is stateless • There is no concept of “state” between clients and servers • HTTP requests and responses must be completely “standalone” and include their own identifying information 16 Request Response Body Headers
  13. Encoding Since HTTP is a plaintext protocol, certain characters must

    be encoded for it to work properly • E.g. newline characters have very special meaning in HTTP, so you can’t just send them “as-is” Encoding != Encrypting • This is not for security at all • It is just changing data from one format to another Web apps use various types of encoding often – it’s very useful to identify and understand the common ones “Hello World!” URL Encoding %48%65%6c%6c%6f%20%57%6f%72%6c%64%21 HTML Encoding Hello W&#x6 f;rld! ASCII Hex 48656c6c6f20576f726c6421 Base64 SGVsbG8gV29ybGQh Often, only the special characters are encoded: Hello+World%21 17
  14. HTTP Session Management “In the beginning, HTTP was created as

    a stateless protocol. So cookies were invented. This has made a lot of people very angry and been widely regarded as a bad move.” (Just kidding. Sort of) 18 • HTTP is a stateless protocol. • Servers have no way of remembering or determining who they are talking to • Servers must accept every request sent to them, and decide every time whether to process it • Cookies were invented in the early 90s as a way to hack session information into HTTP • Browsers send/receive cookies in HTTP Headers and store them in a “cookie jar”, organized by domain
  15. Cookie State and Security • Cookies are usually an identifier

    used to correlate a client’s state server side • Also used for tracking clients (i.e. advertising) • Browsers are extremely “helpful” and will send any matching cookies automatically with every request • Cookies have some flags to improve security: • HttpOnly – don’t let JavaScript read/write the values • Secure – never send the value over plaintext HTTP • SameSite – new flag, more on this later ☺ 19
  16. Cookies and Storage 20 • Besides cookies, browsers also have

    Storage APIs that can be leveraged by JS to store information • Two main types of browser storage: • LocalStorage • Persistent and available to the entire origin • SessionStorage • Available only to the current window • While Cookies can be “protected” from JS with the HttpOnly flag set, browser storage is always available to JS • But browser storage is never automatically sent! Cookies are scoped to a domain, but only available to JS within that origin Browser storage is isolated entirely by the origin Strictly speaking, the SOP doesn’t apply to cookies and browser storage, but the origin is still the security boundary
  17. Making HTTP Requests The “traditional” way: • The browser loads

    a resource • The browsing context changes • i.e. navigate away from a page • These include cookies automatically! 21 Browsers make HTTP requests in two distinctly important ways Some happen automatically when a page loads: Some require an event, like a user clicking: The user sees this happen – the page will change I call these “HTML requests” – they are usually triggered through HTML elements
  18. Making HTTP Requests The “JavaScript” way: • Running JS calls

    the browser API XMLHttpRequest • Or the “fetch” API on newer browsers • JavaScript can make requests and read responses silently in the background, without the user’s interaction • Used in AJAX Programming • Asynchronous JavaScript and XML • Update the page without having to request a new one! 22 Browsers make HTTP requests in two distinctly important ways I call these “AJAX requests” – they run in the background, invisible to the user These AJAX requests are subjected to the SOP
  19. Same Origin Policy (SOP) • Any site you visit on

    the internet can load and execute JavaScript in your browser • Obviously some big security concerns • Browsers address this by limiting what JavaScript can do. • Two main security boundaries: • Sandbox • JavaScript should never escape the browser and access your host • Same Origin Policy (SOP) • JavaScript should only see and access data associated with the origin it was loaded from 23 Browsers recognized the danger of executing arbitrary JavaScript HTML CSS Document Object Model (DOM) www.example.com JavaScript Storage Browser APIs Cookies Origin
  20. Same Origin Policy (SOP) • Same Origin Policy restricts what

    JavaScript can see/access to only the origin it is loaded from 24 Without the SOP, the web would be a very, very dangerous place HTML CSS www.example.com Origin A HTML CSS www.chase.com Origin B
  21. If we didn’t have the Same Origin Policy 25 Without

    the SOP, the web would be a very, very dangerous place • Without the SOP, any site you visit could load malicious JavaScript that interacted with sites you are logged in to • You visit attacker.ropnop.com and as soon as the page loads: • A request is made to Chase to transfer money • A request is made to Amazon to order a new Macbook • etc… • An attacker would just force your browser to do some very bad things
  22. Origins Cookies are scoped to a domain, but origins have

    a stricter definition 26 Assume JavaScript is loaded from https://www.example.com/home/homepage.html, which of these resources are considered to be the same origin? a) https://example.com/login b) https://www.example.com/api/profile c) http://www.example.com/images/profilepic.png d) https://api.example.com/v1/users e) https://www.example.com:8443/db/update/php
  23. Origins Cookies are scoped to a domain, but origins have

    a stricter definition 27 Assume JavaScript is loaded from https://www.example.com/home/homepage.html, which of these resources are considered to be the same origin? a) https://example.com/login b) https://www.example.com/api/profile c) http://www.example.com/images/profilepic.png d) https://api.example.com/v1/users e) https://www.example.com:8443/db/update/php Answer: B only Origins must match on three parts: • Scheme (https) • Host (www.example.com) • Notice the subdomain (www)! • Port (443)
  24. How is JavaScript “loaded” from an Origin? • It must

    be included somewhere in the HTML that was returned from the server • Most commonly in a <script> tag, but JavaScript can be loaded in a number of other ways as well 28
  25. Web Application Security • Understanding web security requires understanding web

    concepts: • HTTP • HTML • JavaScript • As developers, you are already way ahead of most security professionals in understanding these concepts ☺ • Can break security concerns into two categories: • Client Side • Attacks that target users • Server Side • Attacks that target providers • “Backend” vs “Frontend” 29
  26. OWASP Top 10 • The OWASP Top 10 is a

    list curated from industry data and updated every 4 years • The “Top 10 Web Application Security Risks” • This is not an exhaustive list, and it is not a “standard” • It is a reference to understand the state of web security and common vulnerabilities • OWASP also publishes cheat sheets and remediation guidance for each of these vulnerabilities 30
  27. OWASP Top 10 31 Some notable updates from the previous

    Top 10: • Injection is still #1 • XXE and Deserialization are new • Cross Site Request Forgery (CSRF) dropped out
  28. OWASP Top 10 32 Broadly speaking, you can kind of

    break these up into 2 categories: • Technical Vulnerabilities • These occur at the code level when unexpected input is given • Can be spotted in code or with scanners • Design Vulnerabilities • These are weaknesses in process, logic or design of a web application • Much harder to spot with scanners/tools Technical Technical Technical Technical Design Design Design Design Design Design
  29. It’s all just HTTP • Modern webapps can seem crazy

    complicated with lots of convoluted JavaScript and hot new frameworks • At the end of the day though, every web application is just: • A client, talking to a server, over HTTP • Testing web applications is always just a matter of reading, sending, and modifying HTTP 34 GET /index.html HTTP/1.1 HTTP 1/.1 200 OK GET /main.js HTTP/1.1 HTTP 1/.1 200 OK GET /meme.jpg HTTP/1.1 HTTP 1/.1 200 OK
  30. Sending Crafted HTTP • Manually testing Web Apps is all

    about sending custom HTTP • How can we do that? • We could just open a TCP connection and write HTTP manually… • But a better way is to use a proxy! 35 GET /index.html HTTP/1.1 HTTP 1/.1 200 OK GET /index.html HTTP/1.1 HTTP 1/.1 200 OK
  31. Sending Crafted HTTP • Burp Suite and OWASP ZAP are

    two security focused web proxies • Proxies let us view, pause and modify HTTP traffic in transit • The majority of webapp attacks are based on sending unexpected HTTP requests to a server that doesn’t handle them appropriately 36 “Good” Request WTF Response Modified “Bad” Request WTF Response These “WTF Responses” are what security testers live for ☺
  32. What about SSL/TLS? • Good TLS should prevent all tampering.

    Traffic is encrypted end-to-end • We are intercepting and tampering with our own browser and traffic – we can configure the browser and proxy to decrypt for us • This only works because we explicitly disable some security protections – we can’t intercept someone else’s TLS traffic 37 We’ll configure Burp Suite and Firefox later on for the Lab
  33. The “Golden Rule” of Web Security Your web applications must

    be designed to handle the unexpected Never assume the “happy path” – you’ll be very unhappy when it’s not taken 38 “Never, ever, under any circumstance, not even for a second, ever even consider trusting user input” - Ronnie Flathers
  34. Cross Site Scripting • Cross Site Scripting occurs when an

    attacker is able to force a victim’s browser to execute JavaScript within a trusted origin • It’s a terrible name. Don’t think about “cross-site” – it’s all about loading and executing JavaScript within the same site (“origin”) • XSS allows an attacker to completely bypass the Same Origin Policy by getting their JavaScript to run in the same origin as the site they wish to target • This is accomplished through content injection in which malicious JS is injected in a valid HTTP response from the origin 40
  35. Cross Site Scripting • In an XSS attack, malicious JS

    is “smuggled” inside a legitimate HTTP response so it is executed inside the origin 41 SOP disallows an attacker’s script from interacting cross-origin HTML CSS www.chase.com Origin A Attacker Origin B Victim
  36. Cross Site Scripting • In an XSS attack, malicious JS

    is “smuggled” inside a legitimate HTTP response so it is executed inside the origin 42 If the JS comes from the origin, however, SOP is off the table HTML CSS www.chase.com Origin A Attacker Origin B Victim
  37. Cross Site Scripting – 3 Main Types Reflected XSS •

    An attacker is able to load JavaScript from a trusted origin by reflecting it up to and back from the server • Usually through sending a crafted link to a victim with the JS payload embedded 43 There are three main “techniques” for content injection www.chase.com www.chase.com/XSS Hey click this link! XSS comes from trusted origin and is executed
  38. Cross Site Scripting – 3 Main Types Stored XSS •

    An attacker is able to load JavaScript from a trusted origin by storing it on the server to be returned in responses • Usually through embedding a payload in a persistent field (e.g. comments) • Affects any user who visits the correct page 44 There are three main “techniques” for content injection www.chase.com XSS XSS comes from trusted origin and is executed
  39. Cross Site Scripting – 3 Main Types DOM Based XSS

    • An attacker is able to load JavaScript from a trusted origin by passing it in to dynamic JS that is already loaded and executing • Usually through embedding a XSS payload in a field that becomes a JS variable and is parsed and executed 45 There are three main “techniques” for content injection www.chase.com www.chase.com/foo#XSS XSS is loaded into already trusted JS from the origin Hey click this link!
  40. alert(1) – So What? • Pentesters love to user alert(1)

    as their XSS payloads, but it really doesn’t demonstrate any severity by itself • It’s very visual and easy to spot • The most important part isn’t actually the “1” – it’s the page that says it • A better payload would be: • alert(window.origin) 46 The origin is https://www.chase.com An alert box is just a visual way to demonstrate you have JS code execution loaded inside that origin
  41. XSS – What can you do? • SOP no longer

    applies – the basis of web security is over • JavaScript controls everything in that origin – and the attacker controls the JavaScript • Read sensitive data: • Cookies • Session/Local Storage • Make requests: • AJAX without user knowledge 47 HTML CSS www.chase.com The origin is “infected” with malicious JavaScript
  42. Summary - XSS • Cross Site Scripting is really “content

    injection” • An attacker is able to inject malicious JavaScript into an origin’s response • Since the malicious JavaScript comes from the origin, the browser trusts it and the Same Origin Policy does not apply • JavaScript is all powerful and if an attacker takes control of it, they can pretty much do anything a normal, logged in user can do on the site • XSS = Full read/write access within an origin 48
  43. Mitigating XSS • XSS is all about injecting content into

    the DOM which the browser interprets • Never insert untrusted data into the DOM directly • Input Validation • Reject unexpected inputs, special characters, etc • Sanitization • Remove special characters, clean the input • Output Encoding • Escape/encode all special characters in HTML responses or when inserted into the DOM 49
  44. Mitigating XSS Server Side • Output Encoding when using HTML

    templates • Most frameworks do this automatically Client Side • Never write untrusted content into the DOM directly • Avoid .innterHTML() , use .innerText() • DOMPurify • Client side frameworks • Use data binding with variables 50 function MyComponent({ mydata }) { return ( <h1> My data: {mydata} </h1> ) }
  45. Cross Site Request Forgery (CSRF) • CSRF can be thought

    of as another “bypass” of the Same Origin Policy • According to SOP, resources loaded from one origin should not be able to write data to another origin • There are two notable exceptions to SOP however: • HTML Requests • Cookies • CSRF abuses these both 52 ww.chase.com Origin A Attacker Origin B SOP
  46. Anatomy of a CSRF Attack • Requires: • “State changing”

    request • e.g. a POST that writes data or performs an action • Cookie based authentication • No cookies == no CSRF • User interaction • Victim must visit attacker’s site or click a link 53 • Abuses: • HTTP’s stateless nature • Server can’t distinguish legitimate request from a forced one • Browser’s cookie behavior • Cookies are automatically sent to matching domains • HTML Requests • Not subject to SOP • No JavaScript/AJAX requests
  47. Anatomy of a CSRF Attack 54 www.chase.com The POST to

    www.chase.com includes the user’s cookies. The server thinks it is a legitimate request and processes it Hey click this link! www.attacker.com www.attacker.com/csrf
  48. Example CSRF Payload When the victim visits this HTML page,

    a form is automatically submitted to https://www.chase.com/account/transfer This POST request automatically includes any associated cookies 55
  49. Example CSRF Payload When the victim visits this HTML page,

    a form is automatically submitted to https://www.chase.com/account/transfer This POST request automatically includes any associated cookies 56
  50. CSRF Prevention • Because of the browser’s overly helpful behavior

    with cookies, it is up to the server to verify the request • Traditional defense is through “synchronizer tokens” • A random value is appended to each form • When the form is submitted, the server syncs the tokens to make sure they match • Requires remembering state server side. Frameworks help a lot here • Better/easier method is to use the Same Origin Policy! • SOP only applies to JavaScript • If each form submission requires some JavaScript, SOP kicks into action and helps us out 57
  51. CSRF Prevention with SOP • Don’t accept state-changing requests via

    “pure” HTML • Must require a little JavaScript for SOP to apply • Two approaches: • Double Submit Cookies • A random value must be submitted in both a cookie and the body • JavaScript reads the CSRF Cookie value and appends it to the request • Custom Headers • A random, custom header must be submitted with each request • JavaScript sets a custom header on the outgoing form submission • Third approach? • Don’t use cookies at all! If your app doesn’t use cookies for authentication, CSRF goes away 58
  52. CSRF – Double Submit Example • Use JavaScript to send

    the form • onClick() • JavaScript reads the CSRFTOKEN cookie value and adds it to the form • Because of SOP, this form can now only ever be successfully run from within that origin • Otherwise JS couldn’t read the cookie! • SOP defeats CSRF! 59 Modern client side frameworks can do this automatically! Angular will always read and send the XSRF-TOKEN cookie in all requests
  53. CSRF – Double Submit Example • Use JavaScript to send

    the form • onClick() • JavaScript reads the CSRFTOKEN cookie value and adds it to the form • Because of SOP, this form can now only ever be successfully run from within that origin • Otherwise JS couldn’t read the cookie! • SOP defeats CSRF! 60 Modern client side frameworks can do this automatically! Angular will always read and send the XSRF-TOKEN cookie in all requests Server only needs to check if these 2 values match. If they do, the request must have come from the same origin
  54. CSRF – Custom Header Example • Another option is to

    forgo cookies entirely and just use custom headers • Only JavaScript can set custom headers on outgoing requests • An AJAX request and a custom header trigger the SOP • If custom header makes it to the server – the form was submitted from the same origin! 61 Modern client side frameworks can do this automatically! Angular will always read and send the XSRF-TOKEN cookie in all requests
  55. CSRF – Custom Header Example • Another option is to

    forgo cookies entirely and just use custom headers • Only JavaScript can set custom headers on outgoing requests • An AJAX request and a custom header trigger the SOP • If custom header makes it to the server – the form was submitted from the same origin! 62 Modern client side frameworks can do this automatically! Angular will always read and send the XSRF-TOKEN cookie in all requests Server only needs validate if that custom header is there. If it is, the request must have come from JavaScript and therefore the same origin
  56. CSRF Summary • Cross Site Request Forgery abuses legacy HTML

    and Cookie behavior to not invoke the Same Origin Policy • It requires: • Cookie based authentication to only be used • HTML forms/requests only (no JavaScript!) • It allows an attacker to write data cross-origin without invoking the SOP • It can easily be prevented by forcing the SOP to be enforced via using JavaScript to read cookies or set custom headers 63
  57. Injection • Injection is #1 on OWASP Top 10 •

    It is a server side vulnerability • Targets the server’s handling of unexpected or untrusted input • Follow the Golden Rule! • Can take many forms, depending on the technology in use: • SQL Injection • Command Injection (RCE) • Server Side Template Injection (SSTI) • etc.. 65
  58. Injection 66 • Usually occurs when a server takes input

    and “translates” it • E.g. take an input from HTTP and execute a SQL command select * from users where username = 'ropnop';
  59. SQL Injection 67 • If untrusted user input is used

    to construct other commands, bad things can happen… select * from users where username = 'ropnop' or 1=1;--';
  60. SQL Injection • SQL Injection lets you ‘escape’ a normal

    SQL query and inject additional SQL parameters • Sometimes need to be creative in crafting SQL statements, depending on where you are able to inject • UNION • JOIN • etc… 68 https://github.com/sqlmapproject/sqlmap SQL Injection is generally easy to automatically discover and exploit with tools
  61. Mitigating SQL Injection • Never trust user input ☺ •

    Popular methods: • Escape everything • Stored Procedures (SQL) • Object-relational Mappers (ORM)* • If you find yourself writing raw SQL – reconsider • Most frameworks have very good libraries to interact with SQL in a safe way 69 stmt = "SELECT * FROM users WHERE username='%s'".format(username) db.execute(stmt) db.fetchall() User.objects.filter(name=username)
  62. Lab Agenda • Download and install Burp Suite Community Edition

    • Burp Suite Walkthrough • Test Target Vulnerable App • Walkthrough “solutions” together • Q+A 83
  63. Configuring Burp Proxy 1. Install Burp 2. “Temporary Project” 3.

    “Use Burp Defaults” 4. “Proxy” -> “Intercept” 84 New versions of Burp Suite include an embedded, pre-configured browser Chromium based, configured to proxy through Burp
  64. Intercepting Requests Burp Suite Proxy is auto configured to “Intercept”

    Try browsing to a site and it will “hang”, and you should see the request in “Proxy->Intercept” Click “Forward”, or disable Intercept by toggling “Intercept is On” 86
  65. Install CA Certificate • Export CA Certificate from Burp as

    DER • Import into Firefox and Trust 88 Firefox Preferences -> Privacy & Security -> View Certificates Authorities -> Import -> Select DER “Trust this CA to identify websites”
  66. Look at all that traffic! 89 Go back to www.google.com

    “Proxy” -> “History” Shows every HTTP request and response (decrypted!) your browser is making
  67. Burp Suite Functionality • Burp Suite is the “swiss army

    knife” for web application testing • Contains tons of features and tools • Proxy->Intercept • Stop, drop or modify traffic to/from the server • Proxy->History • Chronological listing of all HTTP requests • Shows Requests and Responses • Target->Site Map • Hierarchical tree view of server resources • Decoder • Encode/decode data into various formats • Repeater • Send and modify the same HTTP request multiple times • Intruder • Automatically increment or inject data in HTTP requests 90
  68. Proxy -> Intercept • On by default • Forward, Modify

    or Drop requests • Can also modify responses • Right Click-> Do Intercept -> Response to this Request 91
  69. Start Hacking! We are working for Lex Luthor and our

    target is to hack the Justice League’s new website located at: https://watchtower.ropnop.dev 97 You don’t need any scanners or automated tools – please don’t blast the site! You should be able to find and exploit: • Registration Bypass • XSS • Reflected • DOM Based • SQL Injection • Cross Site Request Forgery • Authorization Bypass • Misconfigured CORS Ask if you get stuck or have questions!
  70. Register and Start the Challenges • https://owasp.codeplatoon.ropnop.com • Register an

    account • Email doesn’t matter (didn't set it up) • Use your Burp Suite proxy and start working your way through the levels • If you get stuck or want help, reach out and share your screen! • You get points for each challenge completed • https://owasp.codeplatoon.ropnop.com/scoreboard.jsp • Will go until 4:15pm • Winner gets a prize shipped to them! 99