Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[SQL] Query In een Query

Pagina: 1
Acties:
  • 272 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

Ik ben me eens wat verder aan het verdiepen in SQL injection, zodat ik mijn veiligheid in php scripts kan verbeteren.
Dus zat ik eens rond te kijken naar een Query in een Query de mogelijkheid.

dit is geen verkeerde query:
PHP:
1
mysql_query("select a.news_id from news as a where a.news_id = 1 AND 1=(SELECT COUNT(*) FROM blabla) and a.news_online <= now() and (a.news_offline > now() or a.news_neverexpire = 1");


Er wordt een query (De 'AND 1=(SELECT COUNT(*) FROM blabla)'), in de query uitgevoerd.
Dus als dat mogelijk is, dan is een insert/update/delete toch ook wel mogelijk vroeg ik mij dan af, alleen dan krijg ik foutmeldingen?

Hoe kan je dan een insert/update/delete query uitvoeren, in een andere query?

Bedankt,

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:23

gorgi_19

Kruimeltjes zijn weer op :9

Op bijvoorbeeld Wikipedia staan al voorbeelden:
http://en.wikipedia.org/wiki/SQL_injection

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Ik heb dit:
http://www.phpfreakz.nl/artikelen.php?aid=106&page=4

Artikel ook doorgelezen, en dan is bij een query dan bij het einde ; gedaan en dan een drop table, alleen dan krijg ik een error? Dit deed ik dus:

PHP:
1
mysql_query("SELECT * FROM hallo; DROP TABLE doei");


dan krijg ik dus een error?

is dat bij mysql dan niet mogelijk meerdere query's in mysql_query()?

[ Voor 19% gewijzigd door Verwijderd op 11-11-2007 17:11 ]


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 11:32
Verwijderd schreef op zondag 11 november 2007 @ 16:35:
(...)
Er wordt een query (De 'AND 1=(SELECT COUNT(*) FROM blabla)'), in de query uitgevoerd.
Dus als dat mogelijk is, dan is een insert/update/delete toch ook wel mogelijk vroeg ik mij dan af, alleen dan krijg ik foutmeldingen?

Hoe kan je dan een insert/update/delete query uitvoeren, in een andere query?

Bedankt,
Simpel, die 1 = verwacht dat je een resultaat terugkrijgt uit de subquery die je weer in de huidige query gebruikt, maar die krijg je niet bij INSERT/ UPDATE of DELETE queries, dus dan klopt je query gewoon niet. Je kunt gewoon met ';' je huidige query afsluiten en er een nieuwe achter plakken:
SQL:
1
SELECT * FROM users; INSERT INTO users VALUES('blaat')
Moet alleen de API van de database dit wel ondersteunen.

En misschien werkt het wel als je eerste query malformed is, maar dat verschilt echt van DB tot DB. :P

[ Voor 11% gewijzigd door Jaap-Jan op 11-11-2007 17:17 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 17:20
mysql_query() sends an unique query (multiple queries are not supported)

  • _Apache_
  • Registratie: Juni 2007
  • Laatst online: 13:31

_Apache_

For life.

Als je een replace ';' op je variabele uitvoert kan je die toch ook verkreupelen?

Dit is natuurlijk geen oplossing, maar wellicht een onderdeel van...

Zero SR/S 17.3kWh / 2.7 kWP PV / Xtend WP 5kW + HRSolar zonneboiler


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 11:32
Maar misschien het belangrijkste is: waarom wil je test of je script vatbaar is voor SQL injection? Gooi de user input door mysql_real_escape_string() en je weet dat je geen last meer hebt van SQL injections. :)

[ Voor 6% gewijzigd door Jaap-Jan op 11-11-2007 17:26 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Verwijderd

Topicstarter
Klopt dat snap ik dat je daarmee kan voorkomen :) ik weet hoe ik kan voorkomen, maar ik vraag mij verder afzonderlijk ervan af, of het mogelijk is om een insert etc in query, maar dat is zo te zien niet mogelijk :) harstikke bedankt eidereen :)

Ik heb verder dan nog is op dev.mysql gekeken, en wel wat commando's gevonden, maar via een bep. mysql commando is tevens niet mogelijk om los te insterne?

[ Voor 24% gewijzigd door Verwijderd op 11-11-2007 17:41 ]


  • berendhaan
  • Registratie: Oktober 2006
  • Laatst online: 28-11 19:44
sorry post niet goed gelezen....

[ Voor 96% gewijzigd door berendhaan op 11-11-2007 18:14 ]


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 11:32
berendhaan schreef op zondag 11 november 2007 @ 18:13:
[...]

Dit kan toch gewoon met een subquery.
PHP:
1
mysql_query("select a.news_id from news as a where a.news_id = 1 AND voorwaarde IN (SELECT voorwaarde FROM blabla) ......


Subquery's
1) De query die hij postte bevat ook een subquery. Of er nou 'AND voorwaarde = (SELECT ' of 'AND voorwaarde IN (SELECT ' staat, het blijft een subquery.

2) Hoeveel results verwacht je terug te krijgen van een aggregate functie als COUNT()?

edit:
Busted >:)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-11 01:01
Jaap-Jan schreef op zondag 11 november 2007 @ 17:25:
Maar misschien het belangrijkste is: waarom wil je test of je script vatbaar is voor SQL injection? Gooi de user input door mysql_real_escape_string() en je weet dat je geen last meer hebt van SQL injections. :)
Alleen mysql_real_escape_string is niet altijd genoeg. Wat ik wel regelmatig zie is dat mensen heel netjes mres gebruiken, ook op integer waarden. Zeg maar "SELECT * FROM tabel WHERE id=$id" Dan kun je $id zoveel escapen als je wilt, het maakt helemaal niets uit, want iedereen kan injecten wat hij maar wil. Dus wanneer je integer waarden hebt, dan controleren of het integers zijn (of tussen aanhalingstekens zetten). Tabelvoorvoegsels moet je ook specifiek controleren, mocht je die dynamisch gebruiken.

Verwijderd

[...]Zeg maar "SELECT * FROM tabel WHERE id=$id" Dan kun je $id zoveel escapen als je wilt, het maakt helemaal niets uit, want iedereen kan injecten wat hij maar wil.
Dat klopt toch niet. Als ik aan $id meegeef "dit is een hele lange string waar niets uit komt"
Dan krijg je toch
SQL:
1
SELECT * FROM tabel WHERE id=dit is een hele lange string waar niets uit komt
Dat zal een SQL error opleveren, en die handel je af via je error handler. Waar ik het wel mee eens ben is het checken op integers en je $id buiten de SQL halen dus:
SQL:
1
SELECT * FROM tabel WHERE id=".$id."
(nadat je op integer hebt gechecked.

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-11 01:01
Verwijderd schreef op maandag 12 november 2007 @ 11:05:
[...]

Dat klopt toch niet. Als ik aan $id meegeef "dit is een hele lange string waar niets uit komt"
Dan krijg je toch
SQL:
1
SELECT * FROM tabel WHERE id=dit is een hele lange string waar niets uit komt
Dat zal een SQL error opleveren, en die handel je af via je error handler.
1 OR 1=1 UNION ALL SELECT name,creditcard,password FROM customers --

  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 26-11 15:25

djiwie

Wie?

Verwijderd schreef op maandag 12 november 2007 @ 11:05:
SQL:
1
SELECT * FROM tabel WHERE id=".$id."

(nadat je op integer hebt gechecked.
Of je doet:
PHP:
1
$id=intval($id);

Dan heb je ook altijd een integer, aangezien tekst omgezet wordt naar 0, en hoef je niet eens te checken.
Ik zet zelf ook integers gewoon tussen quotes, dan kun je je ook niet per ongeluk vergissen als je eens een keer een niet-integer variabele er zonder quotes inzet. :)
Pagina: 1