web-dev-qa-db-fra.com

Comment utiliser wireshark pour capturer la requête mysql SQL clairement

Parce que nous développons en utilisant un serveur Mysql distant, nous ne pouvons donc pas vérifier facilement la requête SQL. Si vous utilisez un serveur local, vous pouvez tail - f general_log_file pour voir quels sql sont exécutés lorsque vous appelez une interface http. J'ai donc installé une wireshark pour capturer ces requêtes SQL envoyées du local. Au début, j'utilise mysql local pour le vérifier. 

Le filtre de capture est  enter image description here

puis j'ai exécuté deux requête SQL dans le terminal mysql

select version();
select now();

mais très décevant, je ne trouve pas ces deux paquets SQL dans Wirehark  enter image description here Je n'ai trouvé que ces quatre paquets.

Mais d'un post je savais

Pour filtrer les paquets mysql, il vous suffit d'utiliser le filtre "mysql" ou "mysql.query! =" "Lorsque vous ne voulez que les paquets demandant une requête. Après cela, vous pouvez ajouter une colonne personnalisée avec le nom de champ «mysql.query» pour obtenir une liste des requêtes exécutées.

et l'effet est comme ça  enter image description here Il est pratique de ne capturer que la requête SQL et d'afficher très clairement ces requêtes SQL. Alors, comment pourrais-je utiliser wireshark pour implémenter ceci? 


salut @ Jeff S.

J'ai essayé votre commande, s'il vous plaît voir ci-dessous

#terminal 1
tshark -i lo0 -Y "mysql.command==3"
Capturing on 'Loopback'

# terminal 2
mysql -h127.0.0.1 -u root -p
select version();
#result: nothing output in terminal 1

et tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.query est identique à tshark -i lo -Y "mysql.command==3" et aucune sortie en sortie. Mais si je n'utilise que tshark -i lo0, il a une sortie

Capturing on 'Loopback'
 1   0.000000    127.0.0.1 -> 127.0.0.1    TCP 68 57881 → 3306 [SYN] Seq=0 Win=65535 Len=0 MSS=16344 WS=32 TSval=1064967501 TSecr=0 SACK_PERM=1
 2   0.000062    127.0.0.1 -> 127.0.0.1    TCP 68 3306 → 57881 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=16344 WS=32 TSval=1064967501 TSecr=1064967501 SACK_PERM=1
 3   0.000072    127.0.0.1 -> 127.0.0.1    TCP 56 57881 → 3306 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=1064967501 TSecr=1064967501
 4   0.000080    127.0.0.1 -> 127.0.0.1    TCP 56 [TCP Window Update] 3306 → 57881 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=1064967501 TSecr=1064967501
...
7
zhuguowei

Vous pouvez utiliser tshark et enregistrer sur un pcap ou simplement exporter les champs qui vous intéressent.

Pour enregistrer sur un pcap (si vous voulez utiliser Wireshark pour l'afficher plus tard): 

tshark -i lo -Y "mysql.command==3" -w outputfile.pcap
tshark -i lo -R "mysql.command==3" -w outputfile.pcap
-R is deprecated for single pass filters, but it will depend on your version
-i is interface so replace that with whatever interface you are using (e.g -i eth0)

Pour enregistrer dans un fichier texte: 

tshark -i lo -Y "mysql.command==3" -T fields -e mysql.query > output.txt

Vous pouvez également utiliser les filtres BPF avec tcpdump (et les filtres de type WireChark Pre Cap). Ils sont plus complexes, mais votre système est moins éprouvant si vous capturez beaucoup de trafic. 

Sudo tcpdump -i lo "dst port 3306 and  tcp[(((tcp[12:1]&0xf0)>>2)+4):1]=0x03" -w outputfile.pcap

REMARQUE:
* Ceci recherche 03 (similaire mysql.command == 3) dans la charge TCP.
** S'agissant d'un filtre relativement lâche, j'ai également ajouté 3306 pour limiter le trafic destiné à ce port . *** Le filtre est basé sur votre capture d'écran. Je ne peux pas le valider maintenant, alors laissez-moi savoir si cela ne fonctionne pas. 

Exemple de sortie:  Sample output from two commands

6
Jeff S.

Réponses utiles: https://serverfault.com/questions/358978/how-to-capture-the-queries-run-mysql-server

En particulier: la réponse de SoMoSparky de:

tshark -T fields -R mysql.query -e mysql.query

et la réponse de user1038090:

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | Perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'
1
pdwalker

L’outil Wireshark prend en charge le protocole MySQL: https://www.wireshark.org/docs/dfref/m/mysql.html

Puis config Wirehark

a.menu Analyze --> Decode as --> add "field=tcp_port value=3306  current=MySQL"
b.filter ‘mysql‘ or ‘mysql.query != “”‘ 
1
yuanyou2012

J'ai essayé une autre commande tshark de this post , et il pourrait capturer la requête SQL du serveur mysql local au serveur distant. 

tshark -i en0 -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306'
Capturing on 'Wi-Fi'
select version()


select now()


select Rand()

mais il produit également des lignes vierges entre ces sql. J'ai essayé ci-dessous la commande veux supprimer la ligne vide mais a échoué

tshark -i en0 -d tcp.port==6006,mysql -Y "frame.len>10" -T fields -e mysql.query 'port 6006'

Et malheureusement, cette commande ne peut pas prendre en charge la capture de la requête SQL vers un mysql local (5.7.12).

tshark -i lo -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306'
Capturing on 'Loopback'

Aucune sortie sauf des lignes vides.

1
zhuguowei