国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

追根溯源 防范SQL注入攻擊

2019-12-22 15:37:52河南劉建臣
網絡安全和信息化 2019年8期
關鍵詞:字面字符串黑客

■ 河南 劉建臣

編者按:對于目前的網絡安全形式來說,跨站腳本攻擊是黑客最常用的攻擊方式之一。當然,和SQL調用相關的安全隱患同樣不可忽視,這其實就是大家很熟悉的SQL注入問題。雖說現(xiàn)在網站管理者的安全意識不斷提高,但是還有相當數(shù)量的網站存在SQL注入漏洞,這給黑客帶來了可乘之機。因此,對SQL調用進行嚴格的管理,對于提高網站安全性是極為重要的。

SQL注入攻擊的危害

對于SQL注入漏洞來說,主要是因為SQL語句調用方法不當所產生的安全隱患。如果在網站程序中存在該漏洞,就會招致黑客直接對服務器進行主動攻擊,導致數(shù)據(jù)庫中的信息被竊取或被惡意篡改、讓登錄認證形同虛設、對服務器上的文件進行非法讀取或修改、隨意執(zhí)行服務器程序等不良后果。

可以說只要是調用SQL語句的位置,都可能存在注入漏洞,其可能影響到所有的頁面。

洞察黑客不法伎倆

兵法云,知己知彼百戰(zhàn)不殆,只有對黑客的注入手法充分了解,才可以有針對性的采取防御措施。

下面就針對實際的例子,對黑客的攻擊手法進行抽絲剝繭的分析。例如對于某在線圖書銷售網站來說,在其PHP網頁開發(fā)語言中存在“$con = " pg_connect("host=localhost dbname=newdb user=postgres password=xxx")"”語句,連接后臺的PostgreSQL數(shù)據(jù)庫,使用“postgres”超級管理員,“xxx”為該賬戶密碼。

在后臺Ubuntu系統(tǒng)中執(zhí)行“su - postgres”命令,切換到“postgres”賬戶環(huán)境,執(zhí)行“psql”命令,在提示符下執(zhí)行“c newdb;”命令連接到數(shù)據(jù)庫,在其中可以查詢各種表的內容。在網站的查詢頁面中輸入作者的名稱,可以查詢到相關的書籍。在查詢頁面中存在“$sql= "SELECT * FROM Books WHERE uname ='$uname'ORDER BY id"”之類的語句,執(zhí)行搜索后,將符合條件的內容顯示出來。

但是,這卻存在很嚴重的安全問題。如果黑客在地址欄的提交語句后面添加某些內容,發(fā)起注入攻擊,雖然該語句會出現(xiàn)執(zhí)行錯誤的提示,但會讓黑客非法查詢到數(shù)據(jù)庫中的用戶表的內容,將敏感賬戶名稱和密碼顯示出來,用戶表中的信息用于網站認證之用。

該非法注入語句中有“'”符號,實現(xiàn)了針對原查詢語句的閉合作用,并使用后面的“and”語句連接非法的查詢語句。而查詢語句針對用戶表中的賬戶ID和密碼進行搜索,并將兩者連接在一起返回,并故意使用轉換函數(shù)進行錯誤操作,讓網頁出現(xiàn)報錯提示,這樣在頁面上就會顯示非法查詢的內容了。

當然,狡猾的黑客為避開禁止顯示錯誤信息的限制,會使用聯(lián)合查詢方式進行滲透。例如其可以將上述非法查詢語句進行修改,直接將當前的表和用戶表的相關內容拼接在一起顯示。

在網站的登錄界面,要求輸入正確的賬戶名和密碼才可以通過認證。在認證頁面中存在諸如“

”的語句,將輸入的賬戶名和密碼提交給指定的PHP文件進行認證處理。在“Authention.php"”中 存 在“$id = @_POST['ID']”,“$pwd = @_POST['PWD']”語句來獲取傳遞過來的信息。利用相關語句,從用戶表中查詢該賬戶是否有效。這看起似乎沒有問題,其實存在很大的安全隱患。

例如,黑客可以在認證頁面中輸入任何賬戶名,在密碼欄中輸入特殊格式字符串,就可以繞開認證文件,這是因為在上述SQL語句的尾部添加了特殊字符串,讓Where語句始終處于成立狀態(tài)的緣故。因此說,只要登錄頁面存在SQL注入漏洞,就可能讓密碼輸入形同虛設。利用SQL注入攻擊,黑客不僅可以非法查看數(shù)據(jù),繞開認證環(huán)節(jié),甚至可以對數(shù)據(jù)進行非法修改。

實際上,不同網站采用的數(shù)據(jù)庫引擎是不同的,黑客會有針對性的采取不同手法的SQL注入攻擊,來達到諸如執(zhí)行系統(tǒng)命令、讀取文件、編輯文件、利用HTTP請求攻擊別的服務器等目的。

SQL注入攻擊的根源

根據(jù)以上分析,可以看到SQL注入攻擊之所以可以實現(xiàn),在很大程度上是因為字面量的原因,黑客通過開發(fā)者意想不到的方式(例如單引號閉合、聯(lián)合查詢、利用分號執(zhí)行下一語句等)來改變SQL語句的構造,實現(xiàn)對網站的攻擊行為。

所謂字面量,指的是SQL語句中的固定值,SQL語句中的每種數(shù)據(jù)類型都用對應的字面量,最常用是字符串和數(shù)值字面量。

對于SQL標準規(guī)格來說,字符串字面量必須以單引號括起來,如果要在字符串字面量內使用單引號,就需要使用連續(xù)兩個單引號來表示,這被稱為單引號轉義。

例 如 將“C'Apple”用于SQL字符串字面量時必須更改為“C''Apple”。但是在存在SQL注入漏洞的程序中,由于沒有轉義單引號,就會導致出諸如“select * from tb1 where name='C'Apply'”之類的語句。導致“'C'Apply'”字符串中間的單引號造成閉合現(xiàn)象,后面的“Apply'”被排斥在字符串字面量之外,造成該部分沒有任何意義,不可避免的會產生語法錯誤。

但是,如果將上述“Apply'”替換為有意義的SQL語句,就會導致SQL注入攻擊的發(fā)生,這才是SQL攻擊之所以存在的根本原因。

因為在SQL注入攻擊中,對于被插入的單引號排除出的字符串來說,其實是有意義的SQL語句,就會被應用程序調用而觸發(fā)特定的操作(例如篡改數(shù)據(jù)等)。

因此,無論SQL注入攻擊如何厲害,只要其被解釋為字面量就沒有任何問題,反之就會就會讓黑客攻擊得手。

除了針對字符串字面量的攻擊外,數(shù)值字面量也會遭到SQL注入攻擊的威脅。在網頁程序中,經常會使用到ASP、PHP等動態(tài)類型語言,其特點是不會限制變量的類型。這就會導致應該輸入數(shù)值的位置可能會被輸入其他類型的字符的情況,就會形成SQL注入攻擊。

例 如 對 于“select *from employee where age< $age”語句來說,如果將“15;delete from tb1” 這一字符串傳進來,就會被錯誤執(zhí)行造成數(shù)據(jù)被刪除的問題。

因為數(shù)字字面量沒有被單引號括起來,所以當出現(xiàn)非數(shù)值的字符串時,就會被視為數(shù)字字面量終止,上述傳入的字符串中的分號之后的內容就被排除在數(shù)值字面量之外,被解釋為SQL語句的一部分。

因此,產生SQL注入漏洞的根本原因,是在于被指定為參數(shù)的字符串的一部分被排除在字面量之外,從而造成SQL語句發(fā)生了變化的緣故。

解決SQL注入的根本策略

根據(jù)以上分析,要想有效防御SQL注入漏洞,必須防止SQL語句在拼接過程中被惡意更改。

解決的方法包括使用占位符(Place Holder)拼接SQL語句,以及在應用程序拼接SQL語句時,確保字面量被正確處理,保證SQL語句不被惡意更改。SQL語句中的問號就是占位符,表示將變量或者表達式等可變參數(shù)填到此處。對于實際的安全防御中,最常用的是前一種方式。

例如對于上述網站來說,可以在網頁中對語句進行修改,將其變?yōu)椋骸?uname = $_GET['uname'];

$m d b 2 = M D B 2::connect('pgsq l://bookuser:bookuser@localhost/bookdb?charset=utf8');

$sql = "SELECT * FROM books WHERE uname = ?ORDER BY id"

$stmt = $mdb2 ->prepare($s q l,array('text'));

rs = $stmt->execute(array($uname));

不再使用權限極大的數(shù)據(jù)庫管理員賬戶,改用權限較小的賬戶來連接數(shù)據(jù)庫,當然該賬戶擁有對該數(shù)據(jù)庫的合理訪問權限。

在上述語句中使用了“?”占 位 符,在 使 用“execute”方法調用時,指定了實際的參數(shù)值和類型(這里為“text”類型),將值分配給給占位符這一操作被稱為綁定變量。

這里的“array('text')”表示占位符中的實際數(shù) 據(jù)?!皉s = $stmt->execute(array($author));”語句表示提取用戶填入的的數(shù)據(jù)到變量中。通過占位符,讓數(shù)據(jù)庫按照指定的格式來進行預先編譯,得到執(zhí)行的數(shù)據(jù)結構,該結構是不可改變的。然后等待需要傳入的實際數(shù)據(jù),最后執(zhí)行實際的語句,得到執(zhí)行結果數(shù)據(jù)。

綜上所述,靜態(tài)占位符綁定變量的操作在數(shù)據(jù)庫引擎中執(zhí)行,包含占位符的語句被直接發(fā)送給數(shù)據(jù)庫引擎,數(shù)據(jù)庫引擎對其進行編譯后確定SQL語句結構,隨后綁定的數(shù)據(jù)被發(fā)送給數(shù)據(jù)庫引擎,數(shù)據(jù)庫引擎得到數(shù)據(jù)庫將其填入到SQL語句并執(zhí)行。因為SQL語句是在包含占位符的狀態(tài)下被編譯的,所以其是不可再次被更改的。

除了使用靜態(tài)占位符防御SQL注入攻擊外,還可以使用動態(tài)占位符來應對威脅。

動態(tài)占位符的工作方式為先在處理SQL的程序庫中執(zhí)行綁定變量操作,之后將SQL語句發(fā)送給數(shù)據(jù)庫引擎加以處理,在綁定變量時字面量會被正確處理,這可以有效防御SQL注入攻擊。

不管是靜態(tài)占位符,還是動態(tài)占位符,都可以有效消除SQL注入漏洞,兩者比較后可以發(fā)現(xiàn),靜態(tài)占位符可以徹底解除SQL注入的威脅,所以應該盡可能在實際的工作中采用靜態(tài)占位符的方式。

除了使用靜態(tài)靜態(tài)占位符這一根本性的解決方式外,還可以使用一些輔助性的技術來防范SQL注入攻擊。如禁止頁面顯示錯誤信息,對輸入的數(shù)據(jù)進行校驗,設置合理的數(shù)據(jù)庫權限等。

例如,黑客會利用錯誤信息頁面來查看SQL注入攻擊后的得到的數(shù)據(jù),為了避免顯示詳細的錯誤信息,可以在PHP配置文件中輸入“display_errors = off”行,關閉錯誤信息顯示功能,讓黑客無法通過錯誤頁面獲取敏感信息。

對用戶輸入的內容進行檢測,也可以有效避免SQL注入攻擊危害,如根據(jù)應用程序的規(guī)格檢驗輸入值,清除惡意輸入的數(shù)據(jù)等。

例如對于身份證來說,可以利 用“^d{15}|d{18}$”之類的正則表達式加以校驗。將Web應用數(shù)據(jù)庫的訪問權限進行合理的數(shù)值,例如不要使用權限很大的管理員賬戶,盡量使用最低權限的賬戶,這樣即使發(fā)生了SQL注入攻擊,也可以將損失降低到最小。

對于僅僅需要顯示普通信息的操作,只要開放對應數(shù)據(jù)表的讀取權限即可,而不要賦予其寫入權限,就可以避免數(shù)據(jù)被惡意篡改。

對數(shù)據(jù)庫管理員的權限進行適當?shù)南拗?,可以避免黑客通過SQL注入攻擊來非法讀取文件,將其對系統(tǒng)的危害降到最低。

猜你喜歡
字面字符串黑客
Dog-tired·“累成狗”
歡樂英雄
多少個屁能把布克崩起來?
網絡黑客比核武器更可怕
金縷衣
別誤會這些英語
數(shù)字在法語俚語中的使用
法語學習(2015年2期)2015-04-17 09:05:31
一種新的基于對稱性的字符串相似性處理算法
依據(jù)字符串匹配的中文分詞模型研究
一種針對Java中字符串的內存管理方案
石阡县| 突泉县| 浦城县| 招远市| 崇文区| 同德县| 全南县| 琼结县| 江都市| 贵港市| 运城市| 平遥县| 武清区| 永城市| 四川省| 水富县| 治多县| 新和县| 康平县| 家居| 丽江市| 梁山县| 奈曼旗| 巧家县| 古田县| 商南县| 启东市| 吴忠市| 泉州市| 灵武市| 黑龙江省| 旬阳县| 苏尼特左旗| 黄山市| 贵港市| 达尔| 秦皇岛市| 武胜县| 色达县| 五华县| 马尔康县|