lectures.alex.balgavy.eu

Lecture notes from university.
git clone git://git.alex.balgavy.eu/lectures.alex.balgavy.eu.git
Log | Files | Refs | Submodules

commit 8533ba691222313735fea051017a04079e1ddebb
parent 624ee0e4f5bb91d68060c9ba3db3eea32ddcbd25
Author: Alex Balgavy <a.balgavy@gmail.com>
Date:   Sat,  3 Oct 2020 21:39:03 +0200

Updated CNS lecture notes

Diffstat:
Acontent/computer-network-security/Lecture 10_ Web attacks.md | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcontent/computer-network-security/_index.md | 1+
2 files changed, 122 insertions(+), 0 deletions(-)

diff --git a/content/computer-network-security/Lecture 10_ Web attacks.md b/content/computer-network-security/Lecture 10_ Web attacks.md @@ -0,0 +1,120 @@ ++++ +title = "Lecture 10: Web attacks" ++++ + +# Web attacks +## Authentication +Which is the best way to auth web users? +- IP address based: IP source can be spoofed, NAT can cause multiple users to have same IP, same user can have different IP (e.g. because of DHCP renewals) +- HTTP-based: hard to scale and manage at app level +- Cert-based: works for SSL-based, but few users have real certificates or know how to use them +- Form-based: form data might be sent as cleartext + +Basic auth: +- form used to send username and password over SSL channel to server-side app +- the app: + - verifies credentials (e.g. by checking database) + - generates session authenticator, sends it back to user as part of header +- next time browser contacts same server, includes authenticator +- better auth: generate random value, store with other session info in file or backend db +- if app includes authenticator in URL, browsers may leak info as part of "Referer" field (which btw can also be spoofed for attacks if used for auth) +- authenticators shouldn't be long lived + +Attacking authentication +- eavesdropping credentials/authenticators + - if HTTP connection not protected by SSL, can be eavesdropped + - name and pass sent as part of HTTP basic auth exchange + - auth included as cookie, URL param, or hidden field in form + - setting 'secure' flag on cookie is good way to prevent accidental info leaking +- bruteforce or guess credentials/authenticators + - if authenticators have limited value domain (like 4 digits), can be bruteforced + - if chosen in non-random way, can be easily guessed (sequential session ID, user-specified password) +- bypass authentication (session fixation, SQL injection) + - weak pass recovery procedures can be leveraged to reset password to known value + - session fixation forces user's session ID to known value (e.g. by passing session ID in URL) + +## Authorization +Authorization: what can a user do? + +attacks: +- path/dir traversal attacks: break out of document space with relative paths (`GET /show.php?file=../../../etc/passwd`) +- forceful browsing: + - web app dev assumes application will be accessed through links + - user is not bound to follow prescribed links, can jump to any publicly available resource +- automatic directory listing abuse: browser may return listing of directory if there's no index +- parameter manipulation + - resources accessible are determined by params to query + - if client-side info blindly accepted, one can modify parameter to get more information +- parameter creation + - if params from command line blindly imported, one might modify behavior of application (like adding `&admin=1` to the end) +- PHP `register_globals` + - makes request info (GET/POST vars and cookies) available as globals + - vars can be provided so that unexpected execution paths are followed + - vars could be set regardless of condition checks + - all vars should be initialized/sanitized along every path + - check `php.ini` or `.htaccess` to make sure of its state +- server misconfiguration + - FTP and web sometimes run on same host + - if data can be uploaded with FTP and requested with Web server, you can run programs using CGI and run commands using Server-Side Include + +## Command Injection attacks +Main problem: +- wrong or no validation of user input that lets you run commands on the server +- use of unsanitized input to compose strings passed to function that can eval code or include code from a file + +Server-side includes (SSI) +- simple interpreted server-side scripting language +- lets you introduce directives into web pages as `<!-- #element attribute=value attr2=val2 ... -->`, run when included +- can use `exec`! so a user can run any command. for example, by adding directive `<!-- #exec cmd="cat /etc/passwd" -->` + +PHP's `allow_url_fopen` allows URLs when including files with `include()`/`require()`, if user input used for this then bad + +HTML injection: +- injection of HTML tags can be used to change behavior of web page +- with iframe tags, browser forced to access malicious web page + +How do you survive? Don't trust user input, use built-in sanitization functions. + +## SQL injection +Input validation error where SQL queries built using unsanitized parameters provided by users. + +For example, if logins are verified by checking with a database like this: + +```asp +var sql = "select * from user_accounts \ + where username = '" + username + "' and \ + password = '" + password + "'"; +``` + +If you enter `' or 1=1 --` as the username, you get this query, returning the whole table: + +```sql +select * from user_accounts where username='' or 1=1 --' and password=" +``` + +SQL injection can modify any type of query (SELECT, INSERT, UPDATE, DELETE) + +With MySQL, double-dash comment requires the second dash to be followed by at least one whitespace/control character. +You can use subqueries to get more info, e.g. `(select version())` as one of the fields in an INSERT query. +If results aren't seen immediately, see if they are reflected somewhere else on the page. + +Number of columns in query can be determined by using `UNION SELECT NULL`, `UNION SELECT NULL, NULL`, etc. progressively longer. +Type of columns can be determined by adding e.g. a string to the `UNION SELECT`. + +To determine table/column names, rely on database-specific techniques. +Want to look at metadata tables, schema tables, etc. + +Second Order SQL injection +- SQL code injected into app, but statement invoked at later time +- even if app escapes single quote, second order may be possible + - attacker sets username to `john'-`, app escapes value to `john''-` + - at later point, attacker changes pass and sets a new pass for victim John, creating new SQL command with unsanitized data + +Blind SQL injection (when no output/error from web app) +- prohibiting display of error messages is typical countermeasure, but blind injection might still work +- when looking for vulnerability, 1=1 is always true. so similarly, use AND statement to check if other properties are true. + +Dealing with SQL injections +- don't let client-supplied data modify SQL statements +- stored procedures: isolate apps from SQL, put the statements on the database server +- prepared statements: compiled before user input is added+ \ No newline at end of file diff --git a/content/computer-network-security/_index.md b/content/computer-network-security/_index.md @@ -13,3 +13,4 @@ title = "Computer and Network Security" - [Lecture 7: exploitation techniques](lecture-7-exploitation-techniques) - [Lecture 8: Defenses](lecture-8-defenses) - [Lecture 9: Web security](lecture-9-web-security) +- [Lecture 10_ Web attacks](lecture-10-web-attacks)