2015-11-02 63 views
0

我想構建一個場景,允許我公開服務器的其他數據(用於演示目的)。服務器調用易受攻擊的SQL代碼:SQL注入,忽略第一個選擇命令

EXEC my_storeProc '12345' 

其中「12345」(不是單引號)是參數。這將執行一個SELECT語句。我想消除這個執行,而是調用我自己的select語句,但是服務器端代碼將只接受前面提到的EXEC調用中包含的第一個select語句。調用第二個語句很簡單:

EXEC my_storeProc '12345  ' select * from MySecondTable-- 

(中 - 在年底將阻止服務器添加到防止錯誤關閉單引號)。我的問題是,雖然有2個選擇語句,服務器將只解析第一個。有沒有辦法在不拋出錯誤的情況下取消第一次EXEC調用,以便取而代之的是第二次調用?也許即使是一個UNION,但是我只能用一個變量開放來利用(在這種情況下變量是12345),我可以做的並不多。

回答

2

你必須考慮它將如何執行,特別是你想要它被調用,所以它不會引發異常,並將kabosh放在整個語句中。你不能將結果設置爲總是正確的,所以沒有真正的辦法逃避proc。相反,你會想要再次輸入一個命令,你想要的代碼看起來像;

exec my_Storeproc '1234'; select * from mysecondtable 

因此,我們需要關閉引號,並做出新的聲明。這將意味着需要插入的字符串;

1234'; select * from mysecondtable where 1 = '1 

這裏有一個缺陷,無論你正在執行的命令是不是返回到用戶界面。要獲取數據,您必須將服務器連接添加到第二個命令。

爲了使第二個命令不必要,你必須注入代碼到proc中,這是一個非啓動器,因爲proc已經被編譯,sql注入依賴於編譯器關於什麼是數據和什麼是命令。對於一個更詳細的解釋看看這個答案:

https://security.stackexchange.com/a/25710

+1

我給你在這一個答案,看如何......熱心人回答它,它也是情理之中。所以基本上,我們將使用URL來修改存儲過程,然後使用另一個URL來執行它。這不是一個壞主意。無論哪種方式,我顯示漏洞。謝謝! – Lukas

+1

如果您想要使用SELECT語句進行反饋,那麼您必須創建一個反饋回送的方式,但是如果要演示UPDATE,DELETE或MODIFY,則不需要返回結果集和您的演示仍然有效。製作一個表格,用於跟蹤用戶信息或所欠的費用,然後刪除或修改您的帳戶或您的姓名。 – EMUEVIL