
SQL injection
Door abcd. Geplaatst op: 25-05-2008
he iedereen,
Ik wil een sql injection doen in een bepaalde site. Hij filtert niet op ' maar ik krijg er verder niet veel uit. Als ik invoer:
1 | |
1 | |
1 | |
Comments
Comments
Door Nowhereman op 26-05-2008 17:39:38 | |
| Wat probeer je hier precies te doen? is passwd daadwerkelijk een veldwaarde of werk je al vanuit een inlog functie? Probeer er eens -- achter te zetten, dit zorgt ervoor dat de rest van de query komt te vervallen. Indien je 2 velden hebt om in te werken (username & ww) dat je in het username veld een valide username invult (admin oid) en in het wachtwoord veld iets van 'or 1=1-- |
Door abcd op 26-05-2008 18:01:15 | |||||
| nee, het is een zoekfunctie. De kolom passwd bestaat niet, dat geeft hij aan als ik die gebruik. Maar hij geeft een andere respons als ik "group" gebruik. Daarom concludeer ik dat group bestaat (ook omdat op de php pagina zelf, een kolom staat die "groep" heet. )en als ik -- gebruik dan geeft hij ook een error. Het uiteindelijke doel is dat ik uit deze tabel breek en naar de tabel users oid ga en daar de wachtwoorden uitlees. Als ik
Dus ik vraag me af of het nou wel of niet mogelijk is een goede injection te doen! |
Door abcd op 26-05-2008 19:59:42 | |||||
| kijk, ik ben erachter gekomen dan niet -- maar # de rest ongedaan maakt, het is nl MySQL. dan kunnen we weer verder denk ik zo :D --edit-- hij geeft geen foutmelding als ik invoer:
maar wel met alleen een apostrof:
En de '-- doet het ook. Alleen kan ik er dan niks aan toevoegen! Maar /* */ doet het niet! --edit 2-- Ik heb denk ik gewoon een verkeerd idee van wat de query is, kan iemand bedenken wélke query er wordt uitgevoerd dat hij deze reacties geeft? |
Door jacco op 20-06-2008 08:03:52 | ||
| okay, hier komt ie dan; -- # /* zijn allemaal goed om de mysql query te eindigen /**/ niet, wat je sluit het commentaar weer af Je kunt een "union select" doen waar door je resultaten uit een andere tabel kunt tonen. de select statement voor en na de union moeten even veel kolomen terug geven. Daarom is het zaak dat je eerst bepaald hoeveel kolomen de eerste query heeft door de volgende sql strings te injecteren; ' or 1=1 order by 2-- als je geen foutmelding krijgt dan geeft de query minstens 2 kolomen terug.Krijg je wel een foutmelding dan geeft de query maar 1 result terug. ' or 1=1 order by 3-- als je geen foutmelding krijgt dan geeft de query minstens 3 kolomen terug zo ga je door tot dat je een foutmelding krijgt als : ' or 1=1 order by 5-- een foutmelding geeft dan geeft de select query 4 kolomen terug. de foutmelding zal iets zijn in de trant van : unknow column nu kun je testen of dat je op de juiste manier een andere select query kunt union-en.Hier voor is het makelijk dat de eerste select query (voor de union) niets terug geeft. Je injectie string zal er dan als volgt uit kunnen zien; ' and 1=2 union select 1,2,3,4-- als alles goed is krijg je geen foutmelding. Je kunt nu op het scherm zien waar de verschillende kolomen worden afgebeeld; op de plek waar je het cijfer 1 ziet staan word kolom 1 weergegeven, op de plek waar je het cijfer 2 ziet word kolom 2 weergegeven.....enzo verder voor kolom 3 en 4. nu moet je proberen uit te vinden of dat er andere interesante tabellen zijn. Ik zou dat als eerste proberen door de volgende injectie; ' and 1=2 union select 1,2,3,4 from users-- als je geen foutmelding krijgt dan bestaat de tabel users krijg je wel een foutmelding dan moet je een ander tabel naam gokken,weten of proberen te achterhalen bijvoorbeeld door information_schema.tables te raadplegen. de information_schema database is allen beschikbaar in mysql 5+ geloof ik.Om de versie van mysql vast te stellen gebruik de volgende query ' and 1=2 union select 1,version(),3,4-- als het versie 5+ is probeer dan deze query; ' and 1=2 union select 1,table_name,3,4 from information_schema.tables-- als je een naam hebt achterhaald van een interesante tabel, bijvoorbeeld de tabel `gebruikers` probeer dan de volgende query; ' and 1=2 union select 1,naam,wachtwoord,4 from gebruikers-- als je problemen hebt met het gokken van de kolom namen dan kun je die op de zelfde manier achterhalen als de tabel naam. in mysql 5+ staan de kolom namen in information_schema.columns. gebruik daar voor de volgende injectie; ' and 1=2 union select 1,column_name,3,4 from information_schema.columns where table_name='gebruikers'-- suc6 Greetingz, Jacco |
Door Modjo op 08-07-2008 16:06:18 | |||||
Beter laat dan nooit:
In de tabel die door de website word doorzocht zit in een veld omschrijving, in deze omschrijving staan verschillende gegevens opgeslagen. De query die waarschijnlijk uitgevoerd word ziet er als volgt uit:
In deze query word bij de SELECT de velden die teruggegeven worden bepaald (De informatie uit deze velden zie je in de zoekresultaten terug), bij FROM de tabel waaruit de gegevens gehaald moeten worden en bij WHERE word de voorwaarde waaraan de gegevens moeten voldoen bepaald. In dit geval betekend dat dus dat uit de betreffende tabel allen de objecten geselecteerd worden waarin in de kolom omschrijving de ingevoerde tekst voorkomt (hierbij word de hele omschrijving doorzocht en zorda de ingevoerde tekst voorkomt word dat object getoond). De %-tekens zorgen ervoor dat alles wat voor en na de ingevoerde tekst staat genegeerd word, dit houd wederom in dat de omschrijving niet PRECIES hetzelfde hoeft te zijn als de complete inhoud van omschrijving. |