注入攻擊之sql注入

2021-07-10 17:20:36 字數 1645 閱讀 1645

在2023年,一位名為rfp的黑客發表了一篇題為「nt web technology vulnerabilities」的文章

注入攻擊的兩個條件:

(1).使用者能夠克制資料的輸入--在這裡,使用者能夠控制變數;

(2).原本要執行的**,憑藉了使用者的輸入;

一般輸入乙個『單引號就能引起執行查詢語句的語法錯誤,有些伺服器會直接返回錯誤回顯,有些伺服器則不返回任何東西。

盲注(blind injection)

在web伺服器關閉了錯誤回顯的時候,我們就可以採用盲注的技巧

所謂盲注,就是在伺服器沒有錯誤回顯時完成的注入攻擊。伺服器沒有錯誤回顯,對於攻擊者來說缺少了非常重要的「除錯資訊」,所以攻擊者必須找到乙個方法來驗證注入的sql語句是否得到執行。

最常見的就是構造簡單的條件語句,根據返回頁面是否法神變化,來判斷sql語句是否得到執行

例 ?id=2 and 1=2,因為1=2是個假命題,所以永遠無法成立。?id=1 and 1=1,如果它能正確的返回時,就說明了sql語句的「and" 成功執行,所以就存在注入的漏洞。

timing attacks

在mysql中有乙個benchmark()函式用於測試函式效能的。利用這個benchmark()函式,可以讓同乙個函式執行若干次,使得結果返回的時間比平時要長;通過時間長短的變化,可以判斷出注入語句是否執行成功。

payload:

1170 union select if(substring(current,1,1)=char(119),benchmark(5000000,encode('msg','by 5 seconds')),null) from (select database() as current) as tbl;

這段payload用於判斷庫名的第乙個字母是否是char(119),即小寫的w。

mysql->benchmark(10000000,md5(1)) or sleep(5)

porstgresql->pg_sleep(5) or generate_series(1,1000000)

ms sql server->waitfor delay '0:0:5'

資料庫攻擊方式

雖然有各種各樣的payload,但是有一些非常麻煩,記起來也不怎麼容易。

所以上sqlmap跑就好了。

命令執行

除了可以通過到處webshell間接的執行命令外,還可以利用」使用者自定義函式「的技巧,即udf(user-defined functions)來執行命令

另外的方法,通過lib_mysqludf_sys提供的幾個函式執行系統命令,其中最主要的函式是sys_eval()和sys_exec()。

編碼問題

當使用gbk編碼時,0xbf27和0xbf5c都會被認為是乙個字元(雙位元組字元)

在進入資料哭之前,在web語言中則沒有考慮到雙位元組字元的問題,雙位元組字元會被認為是兩個位元組,比如php中的addslashes()函式,或者當magic_quotes_gpc開啟時,會在特殊的字元前增加乙個轉義字元"\"。

如何防禦sql注入攻擊

1.使用預編譯的語句

使用預編譯的語句,sql語句的語義不會發生改變,變數用?表示,攻擊者無法改變sql的結構

2.使用儲存過程

使用安全的儲存過程對抗sql注入。

3.檢查資料型別

4.使用安全函式

sql注入攻擊

使用者可以利用向php表單輸入的資料完成對mysql的注入攻擊。例如我的查詢是 insert table into xx values 使用者名稱 號碼 檔案 0 在使用者輸入時最後一位只能是0.使用者不需要輸入 這時使用者在號碼處輸入 10000 x.gif.1 雙連字元後加乙個空格是sql的注釋...

sql注入攻擊

簡單判斷是否有漏 www.abc.asp?id 1,www.abc.asp?id 1 and 1 1 kali 檢視所有的資料庫 sqlmap u www.abc.asp?id 1 dbs current user 是否有漏洞會有相應資訊 檢視所有的表 sqlmap u www.abc.asp?id...

jdbc之防sql注入攻擊

1 sql注入攻擊 由於dao中執行的sql語句是拼接出來的,其中有一部分內容是由使用者從客戶端傳入,所以當使用者傳入的資料中包含sql關鍵字時,就有可能通過這些關鍵字改變sql語句的語義,從而執行一些特殊的操作,這樣的攻擊方式就叫做sql注入攻擊 preparedstatement利用預編譯的機制...