Avatar billede squashguy Nybegynder
06. januar 2004 - 17:28 Der er 27 kommentarer og
1 løsning

SELECT + UNION på ukendte kolonner

Jeg har noget i denne stil..

SELECT * FROM tabel1 UNION SELECT felt1,felt2 FROM tabel2

tabel1 rummer 2 kolonner
tabel2 rummer x antal kolonner (deres navne kendes ikke)

Findes der en måde at få trukket de ukendte kolonner ud fra tabel2? Der må ikke bruges MySQL API eller lign. Kun en simpel sql-sætning.

Denne er fast: SELECT * FROM tabel1

Hvad der kommer efter, kan jeg selv bestemme. Jeg skal have udskrevet felterne fra tabel2.

Der bruges MySQL version 4.0.15
Avatar billede detox Nybegynder
06. januar 2004 - 18:09 #1
For at bruge UNION skal de to tabeller have samme antal felter, så den dur ikke. Hvilken sammenhæng er der imellem de to tabeller?
Avatar billede squashguy Nybegynder
06. januar 2004 - 18:19 #2
Der er ingen sammenhæng. Jeg ønsker blot at vide hvad der står i tabel2..

Og det er netop kravet med sammen antal felter jeg slås med, da en UNION SELECT *  FROM tabel2 jo ikke virker.
Avatar billede squashguy Nybegynder
06. januar 2004 - 18:22 #3
Det skal bruges i forbindelse med noget sql injection. [Et lovligt foretagende]
Avatar billede detox Nybegynder
06. januar 2004 - 18:29 #4
Kan du ikke lave en seperat forespørgsel?
Avatar billede squashguy Nybegynder
06. januar 2004 - 18:33 #5
Det kan jeg ikke se skulle være muligt. Jeg har kun mulighed for at indsætte kommandoer efter

SELECT * FROM tabel1 WHERE tal=$var

Da $var ikke bliver kontrolleret.
Avatar billede squashguy Nybegynder
06. januar 2004 - 18:42 #6
Jeg er da nået så langt, som at få udskrevet de felter, hvor jeg har gættet navnene. Men jeg kan sgu ikke gætte navnet på det felt som er rigtig spændende :)
Avatar billede detox Nybegynder
06. januar 2004 - 18:59 #7
Ok, det lyder skummelt. Men du behøver jo egentlig heller ikke navnene, hvis du udskriver med:
$row[0,1,2,3,...osv]
Du må jo kunne bruge noget LEFT JOIN eller lign.
Avatar billede squashguy Nybegynder
06. januar 2004 - 19:05 #8
Med $row[x] er du ovre i php, det går nok ikke.. jeg har ingen adgang til kildekoden.

JOIN har jeg også kigget på, men hvordan den skal kunne flettes ind i ovenstående sql, og uden kendskab til feltnavne, ved jeg ikke.
Avatar billede trer Nybegynder
06. januar 2004 - 20:26 #9
Kan du foretage en select fra systemtabellerne?  Jeg mener at der er en systemtabel der giver adgang til kolonne-information...
Avatar billede squashguy Nybegynder
07. januar 2004 - 10:08 #10
Hmm, det eneste jeg lige har kunnet finde ang. opslag på kolonne-navne er via mysql api, hvilket jeg ikke har mulighed for.
Avatar billede trer Nybegynder
07. januar 2004 - 10:44 #11
argh, beklager, jeg var i MaxDB regis:
http://www.mysql.com/documentation/maxdb/8e/9c7e3c5f7ad739e10000000a114084/content.htm

Et hurtigt forsøg - har du prøvet

select * from tabel1; describe table2;
Avatar billede squashguy Nybegynder
07. januar 2004 - 11:36 #12
No go.

Har lige læst lidt mere i manualen. Flere sqlsætninger i en enkelt forespørgsel er ikke understøttet før version 4.1.
Avatar billede trer Nybegynder
07. januar 2004 - 11:44 #13
Ok, Jeg ved ikke om MySQL har automatisk konvertering til tekst, men de fleste DBMS'er har. Så prøv dette.

select '1','2','3','4' from tabel1 where 1=2
union
select * from tabel2

det vil udvælge nul rækker fra tabel1 (1=2 ok?) og sige at hver kolonne skal fortolkes som tekst, anden select udvælger så samtlige kolonner fra tabel2

Du kan så udvide med 5,6,7 etc indtil du får at vide at der ikke er flere kolonner - og så burde du få data fra tabel2 leveret.
Avatar billede squashguy Nybegynder
07. januar 2004 - 12:00 #14
Det kunne være en løsning... hvis jeg kunne bestemme sætningen før UNION :)

Men mine hænder er bundet, så jeg kan kun indsætte kommandoer efter den oprindelige select sætning.
Avatar billede trer Nybegynder
07. januar 2004 - 12:10 #15
Ok, jeg begynder at tro, det kræver bruteforce at finde kolonnenavne, men måske...

Du kender antallet af kolonner i første tabel. Du indsætter så konstanter for kolonnerne i tabel2 - det burde fungere.  fx 5 kolonner fra tabel1 giver følgende kolonner fra tabel2

select * from tabel1 where 1=2
union
select 'x','y','x','y','x' from tabel2

Nu burde du få antal rækker ud fra tabel2.

Hvis MySQL understøtter kolonne-placeholders fx brugen af et 1-tal for første kolonne, så kan du så udtrække den vha placeholderen.

Ellers - den er farlig hvis der er mange data, men... Kan du ikke lave det kartetiske produkt af de to tabeller (en CROSS JOIN) ?

select * from tabel1, tabel2

Det vil give dig en r*vfuld af rækker ud - indholdet af de to tabeller ganget med hinanden - men vil give kolonnenavnene for tabel2...
Avatar billede squashguy Nybegynder
08. januar 2004 - 17:27 #16
Har prøvet en del, men kan ikke få det til at virke, med at bruge index til at henvise til felterne.

Den sidste med cross vil ikke virke (det gjorde heller ikke opmærksom i mit spm), men der kommer en WHERE efter den oprindelige select..

SELECT * from tabel1 WHERE felt=$unchecked_variable ...

Men jeg tror snart du har ret, at det kræver bruteforcing at knække denne.
Avatar billede squashguy Nybegynder
08. januar 2004 - 17:55 #17
Ellers må jeg bare på jagt efter andre steder med mulighed for sql injection :)
Avatar billede trer Nybegynder
08. januar 2004 - 19:17 #18
Held og lykke...

Sidste ide - har du adgang til MySQL databasen på filniveau? Hvis så, så burde du kunne åbne database-filerne i en hex-editor (eller for den sags skyld i VI / Notepad) og få fundet kolonnenavnene ad den vej...
Avatar billede squashguy Nybegynder
08. januar 2004 - 19:26 #19
Tak. Jeg har desværre ikke adgang til den på filniveau.

Men tak for hjælpen, og smid du bare et svar..
Avatar billede trer Nybegynder
08. januar 2004 - 19:41 #20
Hmm... okay, et svar - men desværre ikke en løsning :-(
Avatar billede squashguy Nybegynder
08. januar 2004 - 19:47 #21
Tid er også point værd :)

Den du kom mmed 07/01-2004 11:44:45 kan måske bruges en anden gang..
Avatar billede trer Nybegynder
08. januar 2004 - 20:20 #22
Avatar billede johnstigers Seniormester
14. januar 2004 - 00:13 #23
squashguy>
"Eksperten : Generelt : Omgå betaling på Eksperten, og bliv gratis Pro
Artikel Omgå betaling på Eksperten, og bliv gratis Pro
Bruger squashguy
Kategori Eksperten : Generelt
Pris 0 point



Vil du gerne vær Pro - uden at betale?"

Hvad var det og er artikel slettet?
Avatar billede squashguy Nybegynder
14. januar 2004 - 00:17 #24
Hehe :)

Nej, den er bare deaktiveret. Det var egentlig bare en lidt for sjov artikel, hvor jeg  beskriver hvordan det gøres ved at tjene mange point.. :) Det er den samme som på ebruger.dk

Dette spørgsmål gik på en bug jeg fandt på beta-udgaven af Eksperten.
Avatar billede johnstigers Seniormester
14. januar 2004 - 00:21 #25
øv- troede du havde fundet en bug .... *S*
Avatar billede squashguy Nybegynder
14. januar 2004 - 00:27 #26
Hehe, det gjorde jeg jo også :)

Og havde jeg ikke rapporteret den, havde artiklen lydt: hvordan du bliver admin på Eksperten :))
Avatar billede shaagerup Nybegynder
06. februar 2004 - 16:17 #27
"Kommentar: squashguy - 06/01-2004 18:42:13

Jeg er da nået så langt, som at få udskrevet de felter, hvor jeg har gættet navnene. Men jeg kan sgu ikke gætte navnet på det felt som er rigtig spændende :) "

- af ren interesse: Hvordan gjorde du det?
Avatar billede squashguy Nybegynder
06. februar 2004 - 17:54 #28
Navnene på de to felter var namme at gætte: username, password

Og så var det bare at smide ind:

select * from tabel1 where id=0 union select `username`,`password` from users

problemet var, at password lå som md5. Ikke det helt store problem med lidt brute forcing. Men det felt jeg var ude efter (hvis det overhovedet ligger i denne tabel), ville give mig adgang fri adgang, uden at kende passwordet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester