2009-10-29 44 views
1

我已經遞交了已注入惡意軟件的MS SQL 2000數據庫。 惡意軟件腳本如下:無法從數據庫行中刪除注入的腳本

<script src=http://www.someAddress.ru/aScript.js></script> 

現在我想從表中的行刪除這段代碼。

作爲一個測試,我inputed < H1>測試</H1>某一行上,併成功運行了以下查詢:

UPDATE myTable 
SET description = REPLACE (description, '<h1>','') 
WHERE id = 2; 

這樣取出h1標籤。

但是,試圖相同的腳本標籤不起作用:

UPDATE myTable 
set description = REPLACE (description, '<script src=http://www.someAddress.ru/aScript.js></script>','') 
WHERE id = 2 

爲什麼這個不行?

UPDATE 2
WOHO!我找到了解決方案! 我使用folloing代碼,我發現這裏:http://www.tek-tips.com/viewthread.cfm?qid=1563568&page=3

-- Look for open and close HTML tags making sure a letter or/follows < ensuring its an opening 
-- HTML tag or closing HTML tag and not an unencoded < symbol 
CREATE FUNCTION [dbo].[udf_StripHTML] 
    (@HTMLText VARCHAR(8000)) 
RETURNS VARCHAR(8000) 
      AS 
    BEGIN 
    DECLARE @Start INT 
    DECLARE @End INT 
    DECLARE @Length INT 
     SET @Start = CHARINDEX('<',@HTMLText) 
     SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
     SET @Length = (@End - @Start) + 1 
    WHILE @Start > 0 
       AND @End > 0 
      AND @Length > 0 
     BEGIN 
     SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'') 
     SET @Start = CHARINDEX('<',@HTMLText) 
     SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) 
     SET @Length = (@End - @Start) + 1 
     END 
    RETURN Replace(LTRIM(RTRIM(@HTMLText)),'&nbsp;',' ') 
    END 
GO 

要刪除HTML標籤/腳本,我運行以下查詢:

UPDATE mytable 
SET description = [dbo].[udf_StripHTML](description) 
//WHERE id = 35; 

這完美的作品。請注意,這個腳本刪除了所有的html。因此,如果我只想刪除<腳本,我只需將'<'替換爲'<腳本'。

+2

我首先想到的是換行... – 2009-10-29 16:23:58

+0

@rexem:你能詳細點嗎? – Steven 2009-10-29 17:03:44

回答

1

您是否嘗試過尋找剛剛aScript.js,條目可以url_encoded,或類似的東西,所以它給像

 
%3Cscript+src%3Dhttp%3A%2F%2Fwww.someAddress.ru%2FaScript.js%3E%3C%2Fscript%3E 

重讀問題

你的意思是,即使你有id = 2的列中的腳本標記它不起作用?因爲如果它不工作,你確定它存在與id = 2的行? :p

+0

否則在服務器管理一個SELECT顯示在明文 – Steven 2009-10-29 16:26:21

+0

文 「請從文件描述其中id = 2」 ---> Steven 2009-10-29 16:30:01

1

應該工作,除非在那裏有其他隱藏的字符,你看不到,或者有某種形式的編碼正在進行。你可以選擇一個可疑的行看得更仔細。

如果可能,我傾向於完全DELETE FROM myTable WHERE description LIKE '%someAddress.ru%'

但是,修復數據庫不是一個真正的解決方案;該應用程序必須修復。它不應該從未編碼的數據庫中回顯文本。如果有人輸入一些數據,包括字符串<script>,它應該簡單地在頁面上顯示爲字符串<script>或源&lt;script>

+0

我知道應用程序必須修復。這只是一個快速和骯髒的修復,讓網站恢復正常運行。我無法刪除行,因爲所有錶行中有95%具有此腳本。我只需要刪除腳本。 – Steven 2009-10-29 16:40:20

+0

哦,所以你還有SQL注入,除此之外呢?哎喲。如果它像自動化的Asprox攻擊一樣,如果您將未固定的應用程序備份,您將立即獲得擁有權。 – bobince 2009-10-30 14:01:13

1

src屬性值不會被引號包圍嗎?如果是這樣,你將不得不逃脫他們以取得適當的替補比賽。

1

爲什麼不嘗試:

UPDATE myTable 
set description = REPLACE (description, 'www.someAddress.ru','localhost') 
WHERE id = 2 

這將消除立即劫持的問題,可能會避免斷行/時髦人物的問題。

+0

是的,那是一種選擇。但我找到了刪除整個腳本鏈接的解決方案。見上面的解決方案 – Steven 2009-10-29 17:16:13

-1

堅持...

數據庫是否與財務系統有關?薩班斯 - 奧克斯利法案的申請是?有沒有欺詐行爲?

,這些事情你排除作出修改,將「毀滅證據」。那些穿着夾克「FBI」的小傢伙並沒有對此好心。將它備份起來以及日誌(SQL和Web)並將該備份放在幾張DVD上是件好事。最好是移除磁盤並放入另一個磁盤(但這可能不是一個選項)。

移動到清潔: bobince的方向是正確的。不要查找整個SCRIPT標籤,或嘗試查找變體。相反,在腳本標記中查找不屬於正常數據集的內容。這就是你的鑰匙。如果它選擇好,然後把它變成一個DELETE並保存該查詢,因爲當你開始修復應用程序時你會需要它(保證你的數據庫會再次被損壞)。

+0

薩班斯 - 奧克斯利法案:如果運行這個應用程序的公司是公開交易的話,那麼很可能是它在SOx下面。如果應用程序以任何方式被審計,那麼審計人員需要知道發生了什麼。呃,那麼有變化控制... – inked 2009-10-29 16:57:01

+0

我需要對解決方案的建議。如果你閱讀了我對bobince的評論,我不能刪除任何行。 – Steven 2009-10-29 16:59:38

+0

哦,好吧,試着自己解決這個問題很有趣。 – inked 2009-10-29 17:09:19

0

你可以嘗試以下剝去碼出你的領域(我假設你有,你想保持在同一領域的信息):

update myTable 
set description = case when PATINDEX('%<script%', notes) > 0 
     then SUBSTRING(notes, 1, PATINDEX('%<script%', notes)-1) + SUBSTRING(notes, PATINDEX('%script>%', notes) + 7, LEN(notes)) 
     else notes 
     end 
where id=2 

你可以先運行一個選擇在運行更新之前查看CASE語句返回的值是否正確。不過,它不應該影響沒有腳本標記的字段。

+0

啊,謝謝。在我找到自己的解決方案之前沒有看到這個。 – Steven 2009-10-29 17:15:15