View Full Version : Modificare una generica query aggiungendo o rimuovendo informazioni
Ho la necessità per ricerca, di implementare un qualche genere di strato INVISIBILE che intercetti le query sql rivolte ad un database (dbms) e che, a seconda di alcuni parametri interni, aggiunga o rimuova informazioni dalla query originale e alla risposta che il server fornisce alla query.
Esempio banale: query che chiede lo stipendio dell'utente pippo. Il layer intercetta la risposta del dbms e, se a richiedere le informazioni è stato l'utente pluto, deve far ritornare uno stipendio composto di soli 00000.
Ovviamente se potevo mettere il controllo direttamente lato server non esisteva neanche il problema :)
Qualche suggerimento su come implementare il tutto, esiste qualcosa di già pronto, magari opensource?
Vorrei evitare di scrivere tutto il layer tra utente e dbms a mano..
Grazie mille a chiunque volesse aiutarmi.
intendi che vuoi intercettare i pacchetti diretti verso un dbms e quindi modificare il loro contenuto ?
intendi che vuoi intercettare i pacchetti diretti verso un dbms e quindi modificare il loro contenuto ?
ciao, se intercettando i pacchetti da e per il dbms posso estrapolare la query SQL e la riposta e modificarli allora si.
non ho capito se puoi mettere le mani sul server e quindi ne sei l'amministratore oppure se devi simulare un attacco
non ho capito se puoi mettere le mani sul server e quindi ne sei l'amministratore oppure se devi simulare un attacco
non mi sono spiegato benissimo, colpa mia hai ragione.. servirebbero pagine e pagine per entrare nei dettagli purtroppo
ho proprio bisogno di lasciare il server e rispettivo database/dbms cosi come sono, senza modifiche e sviluppare uno strato esterno tra utente e server che intercetti query e risposte e se necessario le modifichi in modo trasparente.
non mi sono spiegato benissimo, colpa mia hai ragione.. servirebbero pagine e pagine per entrare nei dettagli purtroppo
ho proprio bisogno di lasciare il server e rispettivo database/dbms cosi come sono, senza modifiche e sviluppare uno strato esterno tra utente e server che intercetti query e risposte e se necessario le modifichi in modo trasparente.
quindi sniffando pacchetti sulla rete giusto?
quindi sniffando pacchetti sulla rete giusto?
sniffare diciamo che richiama un'azione illegale.. qui il software da sviluppare è legale ma deve essere invisibile ad utente e server..
The_ouroboros
25-01-2013, 07:40
Modificare pacchetti tcp e legalità sono soggetti che non vanno sempre a braccietto
Inviato dal mio HUAWEI U8825-1 con Tapatalk 2
Modificare pacchetti tcp e legalità sono soggetti che non vanno sempre a braccietto
Inviato dal mio HUAWEI U8825-1 con Tapatalk 2
non deve per forza essere a livello di rete e tcp..
lo strato potrebbe intercettare direttamente la query sul pc dell'utente ad alto livello.
è passato un pò di tempo da quando ho avuto una necessità simile, ma credo che tu debba indagare come del resto avevo fatto io sugli hook di windows. Vado a memoria, devi usare funzioni del tipo GetMessage() et simila e poi comportanti di conseguenza. Poi devi implementare una tua libreria di collegamento.
Mi ricordo che non era troppo banale come genere di programmazione.
tomminno
25-01-2013, 08:57
è passato un pò di tempo da quando ho avuto una necessità simile, ma credo che tu debba indagare come del resto avevo fatto io sugli hook di windows. Vado a memoria, devi usare funzioni del tipo GetMessage() et simila e poi comportanti di conseguenza. Poi devi implementare una tua libreria di collegamento.
Mi ricordo che non era troppo banale come genere di programmazione.
In questo caso la cosa è molto più complicata.
Non bastano i tradizionali hook.
Per intercettare sul client le comunicazioni bisogna andare ad eseguire l'hook su api di sistema di send e receive su socket e modificarne il contenuto che queste ricevono o ritornano.
Il problema è che ogni DBMS ha il proprio protocollo di comunicazione generalmente binario (es SqlServer usa TDS) e, non ne conosco i dettagli, probabilmente bisognerà avere una libreria per rigenerare un pacchetto valido, perchè non è sicuramente sufficiente andare a modificare il contenuto ci saranno anche CRC o altro per controllare che il pacchetto sia valido.
Infine l'output anche lì bisogna spulciare il protocollo di comunicazione e andare a cambiare dei dati ma rigenerando un pacchetto valido.
Mi sembra una operazione troppo complessa da realizzare, tale da rendere l'hook delle api di windows la parte più facile...
In questo caso la cosa è molto più complicata.
Non bastano i tradizionali hook.
Per intercettare sul client le comunicazioni bisogna andare ad eseguire l'hook su api di sistema di send e receive su socket e modificarne il contenuto che queste ricevono o ritornano.
Il problema è che ogni DBMS ha il proprio protocollo di comunicazione generalmente binario (es SqlServer usa TDS) e, non ne conosco i dettagli, probabilmente bisognerà avere una libreria per rigenerare un pacchetto valido, perchè non è sicuramente sufficiente andare a modificare il contenuto ci saranno anche CRC o altro per controllare che il pacchetto sia valido.
Infine l'output anche lì bisogna spulciare il protocollo di comunicazione e andare a cambiare dei dati ma rigenerando un pacchetto valido.
Mi sembra una operazione troppo complessa da realizzare, tale da rendere l'hook delle api di windows la parte più facile...
e non è neanche il fine ultimo.. il layer sarebbe solo per testare un altro programma ancora.. praticamente impiegherei più a realizzare il layer che il programma vero e proprio..
dannata tesi phd...
In questo caso la cosa è molto più complicata.
Non bastano i tradizionali hook.
Per intercettare sul client le comunicazioni bisogna andare ad eseguire l'hook su api di sistema di send e receive su socket e modificarne il contenuto che queste ricevono o ritornano.
Il problema è che ogni DBMS ha il proprio protocollo di comunicazione generalmente binario (es SqlServer usa TDS) e, non ne conosco i dettagli, probabilmente bisognerà avere una libreria per rigenerare un pacchetto valido, perchè non è sicuramente sufficiente andare a modificare il contenuto ci saranno anche CRC o altro per controllare che il pacchetto sia valido.
Infine l'output anche lì bisogna spulciare il protocollo di comunicazione e andare a cambiare dei dati ma rigenerando un pacchetto valido.
Mi sembra una operazione troppo complessa da realizzare, tale da rendere l'hook delle api di windows la parte più facile...
infatti mi ricordavo che non era affatto banale; sto guardando i miei sorgenti di quando avevo iniziato a studiare questa parte di windows che mi serviva e risalgono al 2002, quanto tempo.
Comporta la conoscenza di windows a basso livello. Io mi ero fermato ad intercettare qualche messaggio. Peccato che all'uni insegnino Minix in luogo di Windows :)
Lascio un link per chi lo desidera in modo che si sappia su cosa va a sbattere: http://pasotech.altervista.org/delphi/articolo60.htm
tomminno
25-01-2013, 12:03
infatti mi ricordavo che non era affatto banale; sto guardando i miei sorgenti di quando avevo iniziato a studiare questa parte di windows che mi serviva e risalgono al 2002, quanto tempo.
Comporta la conoscenza di windows a basso livello. Io mi ero fermato ad intercettare qualche messaggio. Peccato che all'uni insegnino Minix in luogo di Windows :)
Lascio un link per chi lo desidera in modo che si sappia su cosa va a sbattere: http://pasotech.altervista.org/delphi/articolo60.htm
Le cose da Vista in poi si sono complicate ulteriormente le tecniche di hooking che funzionano su XP non funzionano più su Vista (e successivi).
Tra l'altro poi c'è sempre il rischio di essere sgamati da un antivirus ;)
Il progetto che avevo realizzato qualche anno fa, ancora non viene beccato da nessun antivirus di quelli installati dai clienti :D
Le cose da Vista in poi si sono complicate ulteriormente le tecniche di hooking che funzionano su XP non funzionano più su Vista (e successivi).
Tra l'altro poi c'è sempre il rischio di essere sgamati da un antivirus ;)
Il progetto che avevo realizzato qualche anno fa, ancora non viene beccato da nessun antivirus di quelli installati dai clienti :D
questa è una brutta notizia....
Questo 3D mi ha fatto comprendere che di questo argomento non mi ricordo più un tubo e ne avevo discusso proprio qui nel 2002 :D
Per chi si vuole divertire http://msdn.microsoft.com/en-us/library/windows/desktop/ms644960(v=vs.85).aspx
ok grazie veramente a tutti...
mi rassegno e cerco altri modi..
tomminno
25-01-2013, 13:31
ok grazie veramente a tutti...
mi rassegno e cerco altri modi..
Secondo me il modo corretto di procedere è utilizzare i permessi utenti lato server.
Ogni altro tentativo è una inutile complicazione che può smettere di funzionare da un momento all'altro.
Secondo me il modo corretto di procedere è utilizzare i permessi utenti lato server.
Ogni altro tentativo è una inutile complicazione che può smettere di funzionare da un momento all'altro.
sono un ricercatore non un programmatore, potresti cortesemente darmi una ditta piu' precisa?
grazie veramente.
Secondo me il modo corretto di procedere è utilizzare i permessi utenti lato server.
Ogni altro tentativo è una inutile complicazione che può smettere di funzionare da un momento all'altro.
oppure i trigger sul database?
tomminno
25-01-2013, 16:45
sono un ricercatore non un programmatore, potresti cortesemente darmi una ditta piu' precisa?
grazie veramente.
Beh con i permessi puoi stabilire che un utente non abbia accesso ad una tabella ma solo ad una vista che nasconde quella determinata colonna (oppure che ci mette 0 direttamente come valore), questo però dipende dal livello di controllo che hai sull'intero sistema.
Non capisco ad esempio perchè non potresti scrivere un layer costituito da Webservice con cui il software si interfaccia per accedere al db, a quel punto sul Webservice applichi tutte le logiche del caso.
Generalmente si fa così, evitando l'accesso diretto ai client verso il db. Tra l'altro è anche meglio dal punto di vista della sicurezza perchè hai un unico punto di accesso al Db (la macchina dove c'è il Ws).
Beh con i permessi puoi stabilire che un utente non abbia accesso ad una tabella ma solo ad una vista che nasconde quella determinata colonna (oppure che ci mette 0 direttamente come valore), questo però dipende dal livello di controllo che hai sull'intero sistema.
Non capisco ad esempio perchè non potresti scrivere un layer costituito da Webservice con cui il software si interfaccia per accedere al db, a quel punto sul Webservice applichi tutte le logiche del caso.
Generalmente si fa così, evitando l'accesso diretto ai client verso il db. Tra l'altro è anche meglio dal punto di vista della sicurezza perchè hai un unico punto di accesso al Db (la macchina dove c'è il Ws).
ci ragiono sopra il web service, grazie..
purtroppo veramente la programmazione web non è il mio pane.. il mio campo e' la crittografia..
Ho la necessità per ricerca, di implementare un qualche genere di strato INVISIBILE che intercetti le query sql rivolte ad un database (dbms) e che, a seconda di alcuni parametri interni, aggiunga o rimuova informazioni dalla query originale e alla risposta che il server fornisce alla query.
Esempio banale: query che chiede lo stipendio dell'utente pippo. Il layer intercetta la risposta del dbms e, se a richiedere le informazioni è stato l'utente pluto, deve far ritornare uno stipendio composto di soli 00000.
Ovviamente se potevo mettere il controllo direttamente lato server non esisteva neanche il problema :)
Qualche suggerimento su come implementare il tutto, esiste qualcosa di già pronto, magari opensource?
Vorrei evitare di scrivere tutto il layer tra utente e dbms a mano..
Grazie mille a chiunque volesse aiutarmi.
rileggendo a me sa di "man in the middle". Ma non hai un relatore?
rileggendo a me sa di "man in the middle". Ma non hai un relatore?
É una tesi di dottorato di ricerca, non di specialistica. Qui mi devo sbattere io a trovare le idee ;)
É al 100 un man in the middle ma legale in questo caso.
É una tesi di dottorato di ricerca, non di specialistica. Qui mi devo sbattere io a trovare le idee ;)
É al 100 un man in the middle ma legale in questo caso.
quindi devi sniffare e sostituire pacchetti, se non ricordo male esistono librerie già pronte che fanno tutto il lavoro, difatti molti packet sniffer che uso per lavoro ovviamente, necessitano di una libreria in particolare: però non ho mai fatto una ricerca per svilupparci sopra qualcosa di mio.
Interessante la tua formazione in quanto stavo pensando ad un mio problema che potresti risolvermi tu :D
Banalmente: spedisco pacchetti in chiaro per la rete e se venissero intercettati mi darebbe fastidio.
quindi devi sniffare e sostituire pacchetti, se non ricordo male esistono librerie già pronte che fanno tutto il lavoro, difatti molti packet sniffer che uso per lavoro ovviamente, necessitano di una libreria in particolare: però non ho mai fatto una ricerca per svilupparci sopra qualcosa di mio.
Interessante la tua formazione in quanto stavo pensando ad un mio problema che potresti risolvermi tu :D
Banalmente: spedisco pacchetti in chiaro per la rete e se venissero intercettati mi darebbe fastidio.
Se hai bisogno scrivimi.. la mia formazione è proprio quella (è nata da sicurezza nei sistemi SCADA e critici in generale).
alla fine, dopo lunghe riflessioni valutando pro e contro, sono intenzionato ad usare un canonico server mysql e mi interfaccio con un'applicazione java via JDBC.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.