HOME 首頁
SERVICE 服務產品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    如何sql注入(如何sql注入攻擊)

    發(fā)布時間:2023-03-31 19:56:22     稿源: 創(chuàng)意嶺    閱讀: 112        當前文章關鍵詞排名出租

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于如何sql注入的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網頁版、PC客戶端

    官網:https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    如何sql注入(如何sql注入攻擊)

    一、什么是sql注入如何防止sql注入

    SQL注入是一種非常常見的數據庫攻擊手段,同時也是網絡世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使數據庫執(zhí)行非常規(guī)代碼的過程。

    問題來源是,SQL數據庫的操作是通過SQL語句來執(zhí)行的,而無論是執(zhí)行代碼還是數據項都必須寫在SQL語句中,也就導致如果我們在數據項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在數據庫寫入或讀取數據時得到執(zhí)行。

    解決方案

    方案一:

    采用預編譯技術

    使用預編譯的SQL語句,SQL語句的語義不會是不會發(fā)生改變的。預編譯語句在創(chuàng)建的時候就已經將指定的SQL語句發(fā)送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然后將?這個變量傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。

    方案二:

    嚴格控制數據類型

    在java、c等強類型語言中一般是不存在數字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數據類型轉換,假如我們輸入的是字符串的話,那么這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數據類型的語言,一般我們看到的接收id的代碼都是如下等代碼。

    方案三:

    對特殊的字符進行轉義

    數字型注入可以通過檢查數據類型防止,但是字符型不可以,那么怎么辦呢,最好的辦法就是對特殊的字符進行轉義了。比如在MySQL中我們可以對" '

    "進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數來轉義特殊字符。如addslashes()等,但是這些函數并非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。

    二、如何防范SQL注入漏洞及檢測

    以下是OMG我為大家收集整理的文章,希望對大家有所幫助。

    SQL注入(SQLInjection)漏洞攻擊是目前網上最流行最熱門的黑客腳本攻擊方法之一,那什么是SQL注入漏洞攻擊呢?它是指黑客利用一些Web應用程序(如:網站、論壇、留言本、文章發(fā)布系統(tǒng)等)中某些存在不安全代碼或SQL語句不縝密的頁面,精心構造SQL語句,把非法的SQL語句指令轉譯到系統(tǒng)實際SQL語句中并執(zhí)行它,以獲取用戶名、口令等敏感信息,從而達到控制主機服務器的攻擊方法。

    1. SQL注入漏洞攻擊原理

    1. 1 SQL注入漏洞攻擊實現原理

    SQL(Structured Query Language)是一種用來和數據庫交互的語言文本。SQL注入的攻擊原理就是攻擊者通過Web應用程序利用SQL語句或字符串將非法的數據插入到服務器端數據庫中,獲取數據庫的管理用戶權限,然后將數據庫管理用戶權限提升至操作系統(tǒng)管理用戶權限,控制服務器操作系統(tǒng),獲取重要信息及機密文件。

    SQL注入漏洞攻擊主要是通過借助于HDSI、NBSI和Domain等SQL注入漏洞掃描工具掃描出Web頁面中存在的SQL注入漏洞,從而定位SQL注入點,通過執(zhí)行非法的SQL語句或字符串達到入侵者想要的操作。下面以一段身份驗證的.NET代碼為例,說明一下SQL 注入攻擊的實現方法。

    SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSettings["DBconnStrings"]); string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'";

    DataSet userSet = new DataSet();

    SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);

    userAdapter.Fill(userSet, "Users");

    Session["UserID"] =Txtusername.Text.ToString();

    Session["type"] =type.Text.ToString();

    Response.Redirect("/Myweb/admin/login.aspx");

    從上面的代碼中可以看出,程序在與數據庫建立連接得到用戶數據之后,直接將username的值通過session傳給login.aspx,沒有進行任何的過濾和處理措施, 直接用來構造SQL 語句, 其危險系數是非常高的, 攻擊者只要根據SQL 語句的編寫規(guī)則就可以繞過身份驗證,從而達到入侵的目的。

    1. 2 SQL注入漏洞攻擊分析

    SQL注入可以說是一種漏洞,也可以說是一種攻擊。當程序中的變量處理不當,沒有對用戶提交的數據類型進行校驗,編寫不安全的代碼,構造非法的SQL語句或字符串,都可能產生這個漏洞。

    例如Web系統(tǒng)有一個login頁面,這個login頁面控制著用戶是否有權訪問,要求用戶輸入一個用戶名和口令,連接數據庫的語句為:

    “select * from users where username = 'username' andpassword = 'password'”

    攻擊者輸入用戶名為aa or 1=1口令為1234 or 1=1之類的內容。我們可以看出實際上攻擊者并不知道真正的用戶名、口令,該內容提交給服務器之后,服務器執(zhí)行攻擊者構造出的SQL命令,但由于攻擊者輸入的內容非常特殊,所以最后得到的SQL命令變成:

    “select * from users where username = 'aa' or 1=1 andpassword = '1234' or 1=1”

    服務器執(zhí)行查詢或存儲過程,將用戶輸入的身份信息和數據庫users表中真實的身份信息進行核對,由于SQL命令實際上已被修改,存在永遠成立的1=1條件,因此已經不能真正驗證用戶身份,所以系統(tǒng)會錯誤地授權攻擊者訪問。

    SQL 注入是通過目標服務器的80端口進行的,是正常的Web訪問,防火墻不會對這種攻擊發(fā)出警告或攔截。當Web服務器以普通用戶的身份訪問數據庫時,利用SQL注入漏洞就可能進行創(chuàng)建、刪除、修改數據庫中所有數據的非法操作。而當數據庫以管理用戶權限的身份進行登錄時,就可能控制整個數據庫服務器。

    SQL注入的方法很多,在以手動方式進行攻擊時需要構造各種各樣的SQL語句,所以一般攻擊者需要豐富的經驗和耐心,才能繞過檢測和處理,提交語句,從而獲得想要的有用信息。這個過程需要花費很多的時間,如果以這種手動方式進行SQL注入漏洞攻擊,許多存在SQL注入漏洞的ASP、JSP、PHP、JAVA等網站就會安全很多了,不是漏洞不存在了,而是手動入侵者需要編程基礎,但現在攻擊者可以利用一些現成的黑客工具來輔助SQL注入漏洞攻擊,加快入侵的速度,使SQL注入變得輕而易舉。

    由于SQL注入漏洞攻擊利用的是通用的SQL語法,使得這種攻擊具有廣泛性。理論上說,對于所有基于SQL語言的數據庫管理系統(tǒng)都是有效的,包括MSSQLServer、Oracle、DB2、Sybase和MySQL等。當然,各種系統(tǒng)自身的SQL擴展功能會有所不同,因此最終的攻擊代碼可能不盡相同。

    1. 3 SQL注入漏洞攻擊過程

    (1)繞過身份驗證

    如一個login界面,需要輸入用戶名和口令,然后Post到另一個頁面,進行身份驗證,因此攻擊者只需在用戶名和口令的輸入框中都輸入aa or’1’=’1’的內容,那么攻擊者就可以通過欺騙的驗證方式而直接進入下一個頁面,并擁有和正常登錄用戶一樣的全部特權。原因是什么呢? 我們比較一下正常用戶登錄和攻擊者登錄時的兩種SQL語句:

    1)正常用戶(如用戶名為admin,口令為1234567) :

    SQL= " selectfrom users where username = ’admin’and password= ’1234567’ ";

    2)攻擊者(用戶名和口令都為aa or’1’=’1’) :

    SQL= " select * from users where username='aa or’1’=’1’'and password = ' aa or’1’=’1’'";

    可以看到由and連接的兩個條件都被一個永遠成立的1=1所代替,執(zhí)行的結果為true,數據庫會認為條件恒成立,會返回一個true,讓攻擊者以合法身份登錄進入下一個頁面。

    (2)執(zhí)行非法操作

    如一個查詢頁面select1.asp? id=1,編程人員原本設計意圖是顯示id為1的查詢信息,而攻擊者利用程序中沒有對id內容進行檢查的機制,插入自己的代碼。

    從select1.asp中摘錄一段關鍵代碼:

    SQL= " select *from photo where photoid= 'id'";

    可以看到,id沒有進行任何的處理,直接構成SQL語句并執(zhí)行,而攻擊者在知道該系統(tǒng)數據庫中表名及字段名的情況下,利用SQL語句特性(分號是將兩句SQL 語句分開的符號),直接向數據庫Tuser表中添加記錄:

    select1.asp? id= 1;Insertinto Tuser (username,password,type) values ('hack','1234567','管理員'),然后攻擊者就可以直接用hack進行登錄了。通過這樣的方法,攻擊者還可以對系統(tǒng)做任何的事情,包括添加、刪除、修改系統(tǒng)資源的操作。

    (3)執(zhí)行系統(tǒng)命令

    如果Web主機使用MSSQL數據庫管理系統(tǒng),那么攻擊者就可以用到xp_cmdshell這個擴展存儲過程,xp_cmdshell是一個非常有用的擴展存儲過程,用于執(zhí)行系統(tǒng)命令,比如dir、net等,攻擊者可以根據程序的不同,提交不同的語句:

    execmaster.dbo.xp_cmdshell " dir "; exec master.dbo.xp_cmdshell" net user hack 1234567 /add ";

    execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";

    這樣就可以向Web主機系統(tǒng)中成功添加了一個管理員帳戶。

    2. SQL注入漏洞攻擊的檢測方式及方法

    2. 1檢測方式

    SQL注入漏洞攻擊檢測分為入侵前的檢測和入侵后的檢測。入侵前的檢測,可以通過手工方式,也可以使用SQL注入漏洞掃描工具軟件。檢測的目的是為預防SQL注入漏洞攻擊,而對于SQL注入漏洞攻擊后的檢測,主要是針對審計日志的查看,SQL注入漏洞攻擊成功后,會在Web Service和數據庫的審計日志中留下“痕跡”。

    2. 2檢測方法

    (1)動態(tài)SQL檢查

    動態(tài)的SQL語句是一個進行數據庫查詢的強大的工具,但把它和用戶輸入混合在一起就使SQL注入成為了可能。將動態(tài)的SQL語句替換成預編譯的SQL或者存儲過程對大多數應用程序是可行的。預編譯的SQL或者存儲過程可以將用戶的輸入作為參數而不是命令來執(zhí)行,這樣就限制了入侵者的行動。當然,它不適用于存儲過程中利用用戶輸入來生成SQL命令的情況。在這種情況下,用戶輸入的SQL命令仍可能得到執(zhí)行,數據庫仍然存在SQL注入漏洞攻擊的危險。

    (2)有效性校驗

    如果一個輸入框只可能包括數字,那么要通過驗證確保用戶輸入的都是數字。如果可以接受字母,檢查是不是存在不可接受的字符,那就需要設置字符串檢查功能。確保應用程序要檢查以下字符:分號、等號、破折號、括號以及SQL關鍵字。

    (3)數據表檢查

    使用SQL注入漏洞攻擊工具軟件進行SQL注入漏洞攻擊后,都會在數據庫中生成一些臨時表。通過查看數據庫中最近新建的表的結構和內容,可以判斷是否曾經發(fā)生過SQL注入漏洞攻擊。

    (4)審計日志檢查

    在Web服務器中如果啟用了審計日志功能,則Web Service審計日志會記錄訪問者的IP地址、訪問時間、訪問文件等信息,SQL注入漏洞攻擊往往會大量訪問某一個頁面文件(存在SQL注入點的動態(tài)網頁),審計日志文件會急劇增加,通過查看審計日志文件的大小以及審計日志文件中的內容,可以判斷是否發(fā)生過SQL注入漏洞攻擊事件;另外還可以通過查看數據庫審計日志,查詢某個時間段是否有非法的插入、修改、刪除操作。

    (5)其他

    SQL注入漏洞攻擊成功后,入侵者往往會添加特權用戶(如:administrator、root、sa等)、開放非法的遠程服務以及安裝木馬后門程序等,可以通過查看用戶帳戶列表、遠程服務開啟情況、系統(tǒng)最近日期產生的一些文件等信息來判斷是否發(fā)生過入侵。

    3. SQL注入漏洞防范措施

    SQL注入漏洞攻擊的防范方法有很多種,現階段總結起來有以下方法:

    (1)數據有效性校驗。如果一個輸入框只可能包括數字,那么要通過校驗確保用戶輸入的都是數字。如果可以接受字母,那就要檢查是不是存在不可接受的字符,最好的方法是增加字符復雜度自動驗證功能。確保應用程序要檢查以下字符:分號、等號、破折號、括號以及SQL關鍵字。另外限制表單數據輸入和查詢字符串輸入的長度也是一個好方法。如果用戶的登錄名最多只有10個字符,那么不要認可表單中輸入10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。

    (2)封裝數據信息。對客戶端提交的數據進行封裝,不要將數據直接存入cookie中,方法就是在編程的代碼中,插入session、if、try、else,這樣可以有效地防止攻擊者獲取cookie中的重要信息。

    (3)去除代碼中的敏感信息。將在代碼中存在的用戶名、口令信息等敏感字段刪除,替換成輸入框。

    SQL=" select from users where username = ’admin’and password= ’1234567’ "

    如:這樣顯然會暴露管理員的用戶名、口令信息??梢詫⑵湫薷某桑?/p>

    SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"

    這樣就安全了很多,入侵者也是不會輕易的就獲取到用戶名、口令信息。

    (4)替換或刪除單引號。使用雙引號替換掉所有用戶輸入的單引號,這個簡單的預防措施將在很大程度上預防SQL注入漏洞攻擊,單引號時常會無法約束插入數據的Value,可能給予輸入者不必要的權限。用雙引號替換掉單引號可以使大部分SQL注入漏洞攻擊失敗。 如:

    “select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”

    顯然會得到與

    “select * from users where username='admin' and password= '1234567'”

    相同的結果。

    (5)指定錯誤返回頁面。攻擊者有時從客戶端嘗試提交有害代碼和攻擊字符串,根據Web Service給出的錯誤提示信息來收集程序及服務器的信息,從而獲取想得到的資料。應在Web Service中指定一個不包含任何信息的錯誤提示頁面。

    (6)限制SQL字符串連接的配置文件。使用SQL變量,因為變量不是可以執(zhí)行的腳本,即在Web頁面中將連接數據庫的SQL字符串替換成指定的Value,然后將Web.config文件進行加密,拒絕訪問。

    (7)設置Web目錄的訪問權限。將虛擬站點的文件目錄禁止游客用戶(如:Guest用戶等)訪問,將User用戶權限修改成只讀權限,切勿將管理權限的用戶添加到訪問列表。

    (8)最小服務原則。Web服務器應以最小權限進行配置,只提供Web服務,這樣可以有效地阻止系統(tǒng)的危險命令,如ftp、cmd、vbscript等。

    (9)鑒別信息加密存儲。將保存在數據庫users表中的用戶名、口令信息以密文形式保存,也可以對users表進行加密處理,這樣可以大大增加對鑒別信息訪問的安全級別。

    (10)用戶權限分離。應盡可能的禁止或刪除數據庫中sa權限用戶的訪問,對不同的數據庫劃分不同的用戶權限,這樣不同的用戶只能對授權給自己的數據庫執(zhí)行查詢、插入、更新、刪除操作,就可以防止不同用戶對非授權的數據庫進行訪問。

    4. 結束語

    SQL注入漏洞攻擊在網上非常普遍,許多ASP、PHP論壇和文章管理系統(tǒng)、下載系統(tǒng)以及新聞系統(tǒng)都存在這個漏洞。造成SQL注入漏洞攻擊的主要原因是開發(fā)人員在系統(tǒng)開發(fā)的過程中編程不規(guī)范,沒有形成良好的編程習慣,問題的解決只有依賴于規(guī)范編程。此外,也可以使用現有的SQL注入漏洞掃描器對整個網站中的關鍵代碼進行掃描,查找網站頁面中存在的SQL注入點。對于有問題的頁面,可以及時刪除或更新。本文通過對SQL注入漏洞攻擊的方法、原理以及攻擊實施過程進行了闡述和總結,并給出了一些常見的SQL注入漏洞攻擊防范的方法。

    三、舉例說明SQL注入的一般過程!

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

    第一節(jié)、SQL注入原理

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

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

    Microsoft JET Database Engine 錯誤 '80040e14'

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

    /showdetail.asp,行8

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

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

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

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

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

    第二節(jié)、判斷能否進行SQL注入

    看完第一節(jié),有一些人會覺得:我也是經常這樣測試能否注入的,這不是很簡單嗎?其實,這并不是最好的方法,為什么呢?

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

    其次,部分對SQL注入有一點了解的程序員,認為只要把單引號過濾掉就安全了,這種情況不為少數,如果你用單引號測試,是測不到注入點的

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

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

    ② http://www.19cn.com/showdetail.asp?id=49 and 1=1

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

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

    可以注入的表現:

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

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

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

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

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

    第三節(jié)、判斷數據庫類型及注入方法

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

    怎么讓程序告訴你它使用的什么數據庫呢?來看看:

    SQLServer有一些系統(tǒng)變量,如果服務器IIS提示沒關閉,并且SQLServer返回錯誤提示的話,那可以直接從出錯信息獲取,方法如下:

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

    這句語句很簡單,但卻包含了SQLServer特有注入方法的精髓,我自己也是在一次無意的測試中發(fā)現這種效率極高的猜解方法。讓我看來看看它的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQLServer的一個內置變量,它的值是當前連接的用戶名,類型為nvarchar。拿一個nvarchar的值跟int的數0比較,系統(tǒng)會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQLServer的出錯提示是:將nvarchar值 ”abc” 轉換數據類型為 int 的列時發(fā)生語法錯誤,呵呵,abc正是變量user的值,這樣,不廢吹灰之力就拿到了數據庫的用戶名。在以后的篇幅里,大家會看到很多用這種方法的語句。

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

    如果服務器IIS不允許返回錯誤提示,那怎么判斷數據庫類型呢?我們可以從Access和SQLServer和區(qū)別入手,Access和SQLServer都有自己的系統(tǒng)表,比如存放數據庫中所有對象的表,Access是在系統(tǒng)表[msysobjects]中,但在Web環(huán)境下讀該表會提示“沒有權限”,SQLServer是在表[sysobjects]中,在Web環(huán)境下可正常讀取。

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

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

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

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

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

    第一節(jié)、SQL注入的一般步驟

    首先,判斷環(huán)境,尋找注入點,判斷數據庫類型,這在入門篇已經講過了。

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

    (A) ID=49 這類注入的參數是數字型,SQL語句原貌大致如下:

    Select * from 表名 where 字段=49

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

    Select * from 表名 where 字段=49 And [查詢條件]

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

    Select * from 表名 where 字段=’連續(xù)劇’

    注入的參數為Class=連續(xù)劇’ and [查詢條件] and ‘’=’ ,即是生成語句:

    Select * from 表名 where 字段=’連續(xù)劇’ and [查詢條件] and ‘’=’’

    (C) 搜索時沒過濾參數的,如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存在,反之,即不存在(請牢記這種方法)。如此循環(huán),直至猜到表名為止。

    表名猜出來后,將Count(*)替換成Count(字段名),用同樣的原理猜解字段名。

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

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

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

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

    http://www.19cn.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一個個測試,怎么樣才比較快就看各自發(fā)揮了。在得到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之間,可以用折半法加速猜解,如果寫成程序測試,效率會有極大的提高。

    第二節(jié)、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之間

    第三節(jié)、中文處理方法

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

    先說一點常識:

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

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

    四、如何在servlet 中處理sql注入

    一、經常出現漏洞的sql語句 用戶名和密碼 一起同時查詢。

    select * from users where username=‘abc’ and passwd=‘123’ or 1=‘1’

    12

    二、正確的sql語句先查詢數據庫根據用戶名查詢密碼,如果存在改用戶名,再看密碼是否相同。

    "select passwd from users where username='" + name + "' limit 1";1

    正確代碼如下:

    String name = req.getParameter("username");

    String pwd = req.getParameter("pwd");

    Connection conn = null;

    Statement statement = null;

    ResultSet resultSet = null;

    try {

    // 加載數據庫驅動

    String driver = "com.mysql.jdbc.Driver";

    Class.forName(driver);

    // 得到數據庫連接

    String url = "jdbc:mysql://localhost:3306/student";

    String user = "root";

    String password = "tianyejun6";

    conn = DriverManager.getConnection(url, user, password);

    // 創(chuàng)建statement

    statement = conn.createStatement();

    //sql語句

    String sql = "select passwd from users where username='" + name + "' limit 1";

    System.out.println(sql);

    resultSet = statement.executeQuery(sql);

    if (resultSet.next()) {

    // 說明用戶真實存在

    String passwd = resultSet.getString(1);

    if (passwd.equals(pwd)) {// 說明用戶真合法,密碼相同

    HttpSession session = req.getSession(true);

    // 向session中添加某個屬性

    session.setAttribute("pass", "ok");

    // 設置超時時間。

    session.setMaxInactiveInterval(20);

    resp.sendRedirect("Wel?username=" + name + "&pwd=" + pwd);

    } else {// 說明用戶名不存在

    resp.sendRedirect("Login");

    }

    } else {

    resp.sendRedirect("Login");

    }

    } catch (Exception e) {

    e.printStackTrace();

    resp.sendRedirect("Login");

    } finally {

    try {

    if (resultSet != null) {

    resultSet.close();

    }

    if (statement != null) {

    statement.close();

    }

    if (conn != null) {

    conn.close();

    }

    } catch (SQLException e) {

    e.printStackTrace();

    }

    }

    以上就是關于如何sql注入相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。


    推薦閱讀:

    園林工程工資待遇如何(園林工程工資待遇如何)

    景觀設計師如何在抖音推廣(景觀設計師如何在抖音推廣產品)

    設計院未來發(fā)展前景(設計院未來發(fā)展前景如何)

    AI虛擬伴侶(虛擬伴侶機器人app)

    室內魚池假山設計實景圖(室內魚池假山設計實景圖 小型)