版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章SQL注入攻擊01SQL注入攻擊的原理02SQL注入攻擊的分類03SQL注入攻擊的流程04常見(jiàn)防護(hù)手段及繞過(guò)目錄CONTENTSSQL注入攻擊的原理SQL注入SQL注入攻擊的定義
SQL注入攻擊是指攻擊者通過(guò)把惡意SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串中,并且插入的惡意SQL命令會(huì)導(dǎo)致原有SQL語(yǔ)句作用發(fā)生改變,從而達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令的一種攻擊方式。
SQL注入攻擊已經(jīng)多年蟬聯(lián)OWASP高危漏洞的前三名。SQL注入會(huì)直接威脅數(shù)據(jù)的數(shù)據(jù)安全,因?yàn)樗蓪?shí)現(xiàn)任意數(shù)據(jù)查詢,嚴(yán)重時(shí)會(huì)發(fā)生“拖庫(kù)”的高危行為。更有甚者,如果數(shù)據(jù)庫(kù)開(kāi)啟了寫權(quán)限,攻擊者可利用數(shù)據(jù)庫(kù)的寫功能及特定函數(shù),實(shí)現(xiàn)木馬自動(dòng)部署、系統(tǒng)提權(quán)等后續(xù)攻擊。SQL注入攻擊的原理SQL注入SQL注入攻擊的原理用戶發(fā)送請(qǐng)求服務(wù)器接收請(qǐng)求業(yè)務(wù)功能拼接SQL語(yǔ)句SQL語(yǔ)句數(shù)據(jù)庫(kù)查詢結(jié)果用戶SQL注入的產(chǎn)生原因是用戶提交參數(shù)的合法性。如果用戶提交的數(shù)據(jù)中,不僅僅包含正常的查詢信息,而且在查詢信息后面拼接了其他查詢語(yǔ)句,恰好服務(wù)器沒(méi)有對(duì)用戶輸入的參數(shù)進(jìn)行有效過(guò)濾,那么數(shù)據(jù)庫(kù)就會(huì)根據(jù)用戶提交的語(yǔ)句進(jìn)行查詢,返回更多的信息。01SQL注入攻擊的原理02SQL注入攻擊的分類03SQL注入攻擊的流程04常見(jiàn)防護(hù)手段及繞過(guò)目錄CONTENTS工具注入SQL注入SQL注入常見(jiàn)的攻擊工具有:“啊D小子”“havji”“SQLmap”“pangolin”等,這些工具用法簡(jiǎn)單,能提供清晰的UI界面,并自帶掃描功能,可自動(dòng)尋找注入點(diǎn),自動(dòng)查表名、列名、字段名,并可直接注入,可查到數(shù)據(jù)庫(kù)的信息。其標(biāo)準(zhǔn)注入流程為:查找注入點(diǎn)→查庫(kù)名→查表名→查字段名→查重點(diǎn)數(shù)據(jù)手工注入手工注入就是利用攻擊者的知識(shí)、技術(shù)和經(jīng)驗(yàn),通過(guò)在交互點(diǎn)手工輸入命令的方式來(lái)完成查找注入點(diǎn)、確定回顯位及字段數(shù)、注入并獲取數(shù)據(jù)的完整流程。在注入過(guò)程中,根據(jù)前臺(tái)的數(shù)據(jù)是否回顯和后臺(tái)安全配置及防護(hù)情況,可以將手工注入又分為:回顯注入和盲注。SQL注入SQL注入攻擊的分類01SQL注入攻擊的原理02SQL注入攻擊的分類03SQL注入攻擊的流程04常見(jiàn)防護(hù)手段及繞過(guò)目錄CONTENTSSQL注入攻擊的流程SQL注入工具注入的流程查找注入點(diǎn):Sqlmap.py-u“
?id=1”獲取數(shù)據(jù)庫(kù):Sqlmap.py-u“
http://?id=1”--current-db(假設(shè)得到的數(shù)據(jù)庫(kù)名叫db)獲取數(shù)據(jù)庫(kù)中的表:Sqlmap.py-u“
http://?id=1”-Ddb--tables(假設(shè)得到的表名叫tb)獲取表中的字段名:Sqlmap.py-u“
http://?id=1”-Ddb-Ttb--columns(假設(shè)獲得的列名包括a和b)獲取表中的數(shù)據(jù):Sqlmap.py-u“
http://?id=1”-Ddb-Ttb-Ca,b--dumpSQL注入攻擊的流程SQL注入回顯手工注入的流程尋找注入點(diǎn):基本方法是在參數(shù)后面加單引號(hào),觀察其返回頁(yè)面的內(nèi)容。由于添加單引號(hào)會(huì)導(dǎo)致SQL語(yǔ)句執(zhí)行錯(cuò)誤,因此,若存在SQL注入漏洞,當(dāng)前頁(yè)面會(huì)報(bào)錯(cuò),或者出現(xiàn)查詢內(nèi)容不顯示的情況。SQL注入攻擊的流程SQL注入回顯手工注入的流程尋找注入點(diǎn):“1=1”“1=2”測(cè)試法此測(cè)試法的目的在于發(fā)現(xiàn)用戶輸入的參數(shù)是否可影響服務(wù)器端的查詢。由上述兩個(gè)測(cè)試我們發(fā)現(xiàn)輸入的查詢參數(shù)影響了后臺(tái)的查詢,可以改變服務(wù)端的查詢語(yǔ)句的結(jié)構(gòu)。SQL注入攻擊的流程SQL注入回顯手工注入的流程尋找注入點(diǎn):“1=1”“1=2”測(cè)試法/index.php?name=‘jack’/index.php?name=‘jack’and‘1’=‘1/index.php?name=‘jack’and‘1’=‘2訪問(wèn)以上三個(gè)鏈接時(shí),產(chǎn)生的情況可能有如下幾種:SQL注入攻擊的流程SQL注入回顯手工注入的流程頁(yè)面沒(méi)有變化:說(shuō)明后臺(tái)針對(duì)此查詢點(diǎn)的過(guò)濾比較嚴(yán)格,是否存在SQL注入漏洞還需要進(jìn)行后續(xù)測(cè)試頁(yè)面中少了部分內(nèi)容:如訪問(wèn)前兩個(gè)鏈接正常,訪問(wèn)第三個(gè)鏈接有明顯的內(nèi)容缺失,則基本可以確定有漏洞存在。回顯錯(cuò)誤:如果訪問(wèn)第三個(gè)鏈接后出現(xiàn)數(shù)據(jù)庫(kù)報(bào)錯(cuò),可以判定當(dāng)前查詢點(diǎn)存在注入,用標(biāo)準(zhǔn)的回顯注入法即可實(shí)現(xiàn)SQL注入攻擊。跳轉(zhuǎn)到默認(rèn)界面:如果訪問(wèn)第一個(gè)鏈接正常,第二、三個(gè)鏈接直接跳轉(zhuǎn)到首頁(yè)或其他默認(rèn)頁(yè)面,那么可能是后臺(tái)有驗(yàn)證邏輯,或者是有在線防護(hù)系統(tǒng)或防護(hù)軟件提供實(shí)時(shí)保護(hù)。可以嘗試?yán)@過(guò)防護(hù)工具的思路。直接關(guān)閉鏈接:如果在訪問(wèn)上述第二、三個(gè)鏈接時(shí)出現(xiàn)訪問(wèn)失敗,通常為防護(hù)工具直接開(kāi)啟在線阻斷所致,后續(xù)可利用編碼、換行等方式嘗試?yán)@過(guò)(極難成功)。SQL注入攻擊的流程SQL注入回顯手工注入的流程通過(guò)回顯位確定字段數(shù):回顯位是指數(shù)據(jù)庫(kù)查詢結(jié)果在前端界面中顯示出來(lái)的位置,也就是查詢結(jié)果返回的數(shù)據(jù)庫(kù)中的哪列。在SQL注入中,一般利用orderby、unionselect等命令來(lái)獲取回顯位的信息業(yè)猜測(cè)表內(nèi)容。orderby在SQL語(yǔ)句中的功能是將查詢結(jié)果按某個(gè)字段排序。orderby用在SQL注入中的主要目的是判斷當(dāng)前數(shù)據(jù)表的列數(shù)。如果orderby后接的數(shù)值大于當(dāng)前數(shù)據(jù)表的列數(shù),則查詢語(yǔ)句執(zhí)行失敗,由于頁(yè)面沒(méi)有隱藏報(bào)錯(cuò)信息,因此報(bào)錯(cuò)內(nèi)容將進(jìn)行顯示。SQL注入攻擊的流程SQL注入回顯手工注入的流程通過(guò)回顯位確定字段數(shù):回顯位是指數(shù)據(jù)庫(kù)查詢結(jié)果在前端界面中顯示出來(lái)的位置,也就是查詢結(jié)果返回的數(shù)據(jù)庫(kù)中的哪列。在SQL注入中,一般利用orderby、unionselect等命令來(lái)獲取回顯位的信息業(yè)猜測(cè)表內(nèi)容。unionselect在SQL語(yǔ)句中的功能是聯(lián)合查詢,也即執(zhí)行完union前面的查詢后再執(zhí)行unionselect查詢。unionselect在SQL注入中的功能之一就是判斷頁(yè)面顯示字段是數(shù)據(jù)表中的第幾個(gè)字段,從而控制輸出位置。SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。Information_schema庫(kù)中對(duì)SQL注入有用的表有如下幾個(gè):SCHEMATA:存儲(chǔ)MySQL中各數(shù)據(jù)庫(kù)的相關(guān)信息,其中SCHEMA_NAME即為數(shù)據(jù)庫(kù)的名字。TABLES:存儲(chǔ)所有表的名字,其中TABLE_NAME表示表的名稱;TABLE_SCHEMA字段顯示該表所屬的數(shù)據(jù)庫(kù)名字。COLUMNS:存儲(chǔ)字段名,其中TABLE_SCHEMA表示表所屬的數(shù)據(jù)庫(kù)名稱;TABLE_NAME表示所屬的表的名稱;COLUMN_NAME表示字段名。SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。獲得當(dāng)前數(shù)據(jù)庫(kù)的名字:SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。獲得當(dāng)前數(shù)據(jù)庫(kù)的所有表:SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。獲得userinfo表的所有字段:SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。獲得userinfo表的user字段的所有數(shù)據(jù):SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。獲得userinfo表的password字段的所有數(shù)據(jù):SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。僅查詢admin用戶的密碼:SQL注入攻擊的流程SQL注入回顯手工注入的流程注入并獲取數(shù)據(jù):在MySQL5.0之后的版本中,數(shù)據(jù)庫(kù)內(nèi)置了一個(gè)庫(kù)information_schema,用于存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)中的所有庫(kù)名、表名等信息。因此,可利用SQL注入方式,通過(guò)遠(yuǎn)程注入查詢語(yǔ)句實(shí)現(xiàn)讀取此數(shù)據(jù)庫(kù),從而獲取感興趣的信息。若覺(jué)得前面用戶查詢信息比較影響SQL注入顯示效果,可以將前面查詢出錯(cuò),則只顯示union查詢結(jié)果:SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)萬(wàn)能密碼:
如果知道用戶名,在用戶框中輸入username’#
如果不知道用戶名,在用戶名框或者密碼框中輸入‘or1=1#可以任意用戶名登錄SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)萬(wàn)能密碼:在查詢時(shí)輸入‘or1=1使得前面的條件無(wú)論成立與否,查詢都可以進(jìn)行,從而可以查到數(shù)據(jù)庫(kù)中所有信息SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)數(shù)字型注入和字符型注入:當(dāng)輸入的參數(shù)為整型時(shí),如果存在注入漏洞,可以認(rèn)為是數(shù)字型注入。當(dāng)輸入的參數(shù)為字符型時(shí),如果存在注入漏洞,可以認(rèn)為是字符型注入。
主要用在參數(shù)為id的情況下。判斷方法:SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)手工注入的思路:1.判斷是否存在注入,注入是字符型還是數(shù)字型2.猜解SQL查詢語(yǔ)句中的字段數(shù)3.確定顯示的字段順序4.獲取當(dāng)前數(shù)據(jù)庫(kù)5.獲取數(shù)據(jù)庫(kù)中的表6.獲取表中的字段名7.下載數(shù)據(jù)SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Low:1’orderby2#1’unionselect1,2#10'unionselectNULL,database()#10'unionselectNULL,group_concat(table_name)frominformation_schema.tableswheretable_schema=database()#10'unionselectNULL,group_concat(column_name)frominformation_schema.columnswheretable_name='users'#10'unionselectgroup_concat(user_id,first_name,last_name),group_concat(password)fromusers#SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysqli_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。1.判斷是否存在注入,注入是字符型還是數(shù)字型:抓包更改參數(shù)id為1′or1=1#說(shuō)明存在數(shù)字型注入。(由于是數(shù)字型注入,服務(wù)器端的mysql_real_escape_string函數(shù)就形同虛設(shè)了,因?yàn)閿?shù)字型注入并不需要借助引號(hào)。)先將源代碼倒數(shù)第二行改為:$number_of_rows=mysqli_num_rows($result);SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。2.猜解SQL查詢語(yǔ)句中的字段數(shù):抓包更改參數(shù)id為1orderby2#抓包更改參數(shù)id為1orderby3#,說(shuō)明執(zhí)行的SQL查詢語(yǔ)句中只有兩個(gè)字段,即這里的Firstname、Surname。SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。3.確定顯示的字段順序:抓包更改參數(shù)id為1unionselect1,2#說(shuō)明執(zhí)行的SQL語(yǔ)句為selectFirstname,Surnamefrom表whereID=id…SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。4.獲取當(dāng)前數(shù)據(jù)庫(kù):抓包更改參數(shù)id為1unionselect1,database()#說(shuō)明當(dāng)前的數(shù)據(jù)庫(kù)為dvwaSQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。注意:5.獲取數(shù)據(jù)庫(kù)中的表:抓包更改參數(shù)id為1unionselect1,group_concat(table_name)frominformation_schema.tableswheretable_schema=‘dvwa’#因?yàn)閐vwa兩邊的單引號(hào)’被轉(zhuǎn)義為\’SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。5.獲取數(shù)據(jù)庫(kù)中的表:抓包更改參數(shù)id為1unionselect1,group_concat(table_name)frominformation_schema.tableswheretable_schema=database()#說(shuō)明當(dāng)前的數(shù)據(jù)庫(kù)中一共有兩個(gè)表,guestbook與users。SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。6.獲取表中的字段名:抓包更改參數(shù)id為1unionselect1,group_concat(column_name)frominformation_schema.columnswheretable_name=’users’#這是因?yàn)閱我?hào)被轉(zhuǎn)義了,變成了\’SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。6.獲取表中的字段名:可以利用16進(jìn)制進(jìn)行繞過(guò),抓包更改參數(shù)id為1unionselect1,group_concat(column_name)frominformation_schema.columnswheretable_name=0×7573657273#SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-Medium:利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶的輸入。使用burpsuit抓包的方法可以修改數(shù)據(jù)包。7.下載數(shù)據(jù):抓包修改參數(shù)id為1or1=1unionselectgroup_concat(user_id,first_name,last_name),group_concat(password)fromusers#SQL注入攻擊的流程SQL注入回顯手工注入的流程(進(jìn)階)Dvwa-High:只是在SQL查詢語(yǔ)句中添加了LIMIT1,希望以此控制只輸出一個(gè)結(jié)果。我們可以通過(guò)#將其注釋掉。其他步驟同Low級(jí)別。請(qǐng)大家自行操作。需要特別提到的是,High級(jí)別的查詢提交頁(yè)面與查詢結(jié)果顯示頁(yè)面不是同一個(gè),也沒(méi)有執(zhí)行302跳轉(zhuǎn),這樣做的目的是為了防止一般的sqlmap注入,因?yàn)閟qlmap在注入過(guò)程中,無(wú)法在查詢提交頁(yè)面上獲取查詢的結(jié)果,沒(méi)有了反饋,也就沒(méi)辦法進(jìn)一步注入。Dvwa-Impossiable:采用了PDO技術(shù),劃清了代碼與數(shù)據(jù)的界限,有效防御SQL注入,同時(shí)只有返回的查詢結(jié)果數(shù)量為一時(shí),才會(huì)成功輸出,這樣就有效預(yù)防了“脫褲”,Anti-CSRFtoken機(jī)制的加入了進(jìn)一步提高了安全性。01SQL注入攻擊的原理02SQL注入攻擊的分類03SQL注入攻擊的流程04常見(jiàn)防護(hù)手段及繞過(guò)目錄CONTENTS參數(shù)過(guò)濾SQL注入的防護(hù)參數(shù)過(guò)濾分為:數(shù)據(jù)類型限制和危險(xiǎn)字符處理??偟乃悸肪褪潜M可能限制用戶可提交的參數(shù)類型。針對(duì)SQL注入設(shè)計(jì)防護(hù)體系時(shí),一定要與實(shí)際業(yè)務(wù)場(chǎng)景進(jìn)行配合,很多時(shí)候用簡(jiǎn)單的方式可獲得非常好的防護(hù)效果。預(yù)編譯處理也稱為參數(shù)化查詢,是指數(shù)據(jù)庫(kù)服務(wù)器在數(shù)據(jù)庫(kù)完成SQL指令的編譯后,才套用參數(shù)運(yùn)行,因此就算參數(shù)中含有特殊的參數(shù),也不會(huì)被數(shù)據(jù)庫(kù)所運(yùn)行。SQL注入常見(jiàn)防護(hù)手段及繞過(guò)SQL注入?yún)?shù)類型檢測(cè)及繞過(guò)例如輸入?yún)?shù)要求是數(shù)字,并且長(zhǎng)度為一定值,那么如果能對(duì)參數(shù)進(jìn)行過(guò)濾,避免參數(shù)中出現(xiàn)非數(shù)字類型字符,并且對(duì)參數(shù)長(zhǎng)度進(jìn)行限制,即可有效避免SQL注入攻擊。防護(hù)思路:使用以下函數(shù)實(shí)現(xiàn)對(duì)輸入數(shù)據(jù)類型的檢查。intintval(mixed$var[,int$base=10])
用于獲取var變量的整數(shù)值。通過(guò)使用指定進(jìn)制base轉(zhuǎn)換(默認(rèn)是十進(jìn)制),返回變量var的整數(shù)數(shù)值。boolis_numeric(mixed$var)檢測(cè)var變量是否為數(shù)字,但此函數(shù)允許輸入負(fù)數(shù)和小數(shù)。boolctype_digit(string$str)檢測(cè)str中的字符是否都為數(shù)字,負(fù)數(shù)和小數(shù)無(wú)法通過(guò)檢測(cè)。在特定情況下,使用這三個(gè)函數(shù)可限制用戶輸入數(shù)字型參數(shù),這在一些僅允許用戶參數(shù)為數(shù)字的情況下非常適用。如查詢需要輸入ID號(hào)、學(xué)號(hào)、電話號(hào)碼等業(yè)務(wù)場(chǎng)景。常見(jiàn)防護(hù)手段及繞過(guò)SQL注入?yún)?shù)類型檢測(cè)及繞過(guò)有效繞過(guò)方式:當(dāng)Web應(yīng)用對(duì)數(shù)據(jù)進(jìn)行數(shù)字類型的限制時(shí),受制于字符類型要求,因此無(wú)法構(gòu)造出有效的語(yǔ)句,也就無(wú)法利用SQL注入攻擊來(lái)獲取數(shù)據(jù)庫(kù)內(nèi)的信息。但能使用某些技巧令數(shù)據(jù)庫(kù)報(bào)錯(cuò)。如is_numeric支持十六進(jìn)制與十進(jìn)制,提交0x01時(shí)它也會(huì)進(jìn)行查詢;intval雖然默認(rèn)支持十進(jìn)制數(shù)字,但依然會(huì)有問(wèn)題,比如提交id=-1時(shí)會(huì)出錯(cuò)。這些細(xì)微的差異可以幫助攻擊者識(shí)別后臺(tái)的過(guò)濾函數(shù)。常見(jiàn)防護(hù)手段及繞過(guò)SQL注入?yún)?shù)長(zhǎng)度檢測(cè)及繞過(guò)檢測(cè)思路:當(dāng)攻擊者構(gòu)造SQL語(yǔ)句進(jìn)行注入攻擊時(shí),其SQL注入語(yǔ)句一般會(huì)比較長(zhǎng),遠(yuǎn)遠(yuǎn)大于正常業(yè)務(wù)中有效參數(shù)的長(zhǎng)度。因此,如果某處提交的內(nèi)容具有固定的長(zhǎng)度(如密碼、用戶名、郵箱、手機(jī)號(hào)等),那么嚴(yán)格控制這些提交點(diǎn)的字符長(zhǎng)度,大部分注入語(yǔ)句就沒(méi)辦法成功執(zhí)行。這樣可以實(shí)現(xiàn)很好的防護(hù)效果。檢測(cè)代碼:在PHP下,可用strlen函數(shù)檢查輸入長(zhǎng)度,并進(jìn)行長(zhǎng)度判斷,如果參數(shù)長(zhǎng)度在限制范圍內(nèi)即通過(guò),超過(guò)限制范圍則終止當(dāng)前流程。繞過(guò)方式:在特定環(huán)境下,利用SQL語(yǔ)句注釋符來(lái)實(shí)現(xiàn)對(duì)查詢語(yǔ)句語(yǔ)義的變更,增加的字符長(zhǎng)度很少,卻會(huì)造成比較嚴(yán)重的危害。如萬(wàn)能密碼?;蛘咔擅罾胊nd、or條件查詢。因此,在SQL注入防護(hù)中,限制參數(shù)長(zhǎng)度雖然能夠限制絕大部分語(yǔ)句無(wú)法執(zhí)行,但是在特定環(huán)境下仍有繞過(guò)的可能。常見(jiàn)防護(hù)手段及繞過(guò)SQL注入危險(xiǎn)參數(shù)過(guò)濾及繞過(guò)防護(hù)思路:常見(jiàn)的危險(xiǎn)參數(shù)過(guò)濾方法包括關(guān)鍵字、內(nèi)置函數(shù)、敏感字符的過(guò)濾,其過(guò)濾方法主要有:黑名單過(guò)濾:將一些可能用于注入的敏感字符寫入黑名單中,如’(單引號(hào))、union、select等,也可能使用正則表達(dá)式做過(guò)濾,但黑名單可能會(huì)有疏漏。白名單過(guò)濾:例如,用數(shù)據(jù)庫(kù)中的已知值校對(duì),通常對(duì)參數(shù)結(jié)果進(jìn)行合法性校驗(yàn),符合白名單的數(shù)據(jù)方可顯示。參數(shù)轉(zhuǎn)義:對(duì)變量默認(rèn)進(jìn)行addsalashes或mysql_real_escape_string(在預(yù)定義字符前添加反斜杠),使得注入語(yǔ)句構(gòu)造失敗。由于白名單方式要求輸出參數(shù)有著非常明顯的特點(diǎn),因此適用的業(yè)務(wù)場(chǎng)景非常有限。總體來(lái)說(shuō),防護(hù)手段仍以黑名單+參數(shù)轉(zhuǎn)義方式為主,這也是目前針對(duì)SQL第三參數(shù)處理的主要方式。常見(jiàn)防護(hù)手段及繞過(guò)在復(fù)雜場(chǎng)景中,有效的防護(hù)手段還包括對(duì)參數(shù)中的敏感信息進(jìn)行檢測(cè)及過(guò)濾,避免危險(xiǎn)字符被系統(tǒng)重構(gòu)成查詢語(yǔ)句,導(dǎo)致SQL注入執(zhí)行成功??梢?jiàn),過(guò)濾危險(xiǎn)參數(shù)的工作非常必要。SQL注入危險(xiǎn)參數(shù)過(guò)濾及繞過(guò)防護(hù)代碼:黑名單過(guò)濾:針對(duì)參數(shù)中的敏感字符進(jìn)行過(guò)濾,如果發(fā)現(xiàn)敏感字符則直接刪除。這里利用str_replace()函數(shù)進(jìn)行過(guò)濾,過(guò)濾的關(guān)鍵字為union、\、exec、select。參考代碼如下:常見(jiàn)防護(hù)手段及繞過(guò)If(isset($_GET[‘name’]))
{$name=$_GET[‘name’];
$name=str_replace(‘union’,’’,$name);
$name=str_replace(‘\’,’’,$name);$name=str_replace(‘exec’,’’,$name);$name=str_replace(‘select’,’’,$name);……
}SQL注入危險(xiǎn)參數(shù)過(guò)濾及繞過(guò)防護(hù)代碼:白名單過(guò)濾:首先設(shè)置白名單為當(dāng)前用戶名,之后對(duì)由GET方式傳入的用戶名進(jìn)行對(duì)比,若相同則進(jìn)行查詢,若不相同則提示輸入有誤。參考代碼如下:常見(jiàn)防護(hù)手段及繞過(guò)if(isset($_GET[‘name’]))
{$name=$_GET[‘name’];
$conn=mysql_connect($DB_HOST,$DB_USER,$DB_PASS)
ordie(“connectfailed”.mysql_error());
mysql_select_db($DB_DATABASENAME,$conn);
$sql=“select*fromuser”;
$result=mysql_query($sql,$conn);
$isWhiteName=is_in_white_list($result,$name);
if(&isWhiteName){(輸出)}
else{echo“輸入有誤”;}mysql_free_result($result);mysql_close($conn);
}functionis_in_white_list($result,$username){while($row=mysql_fetch_array($result))
{$username2=$row[‘user’];
if($username2==$username)
{returnTRUE;}
}}SQL注入危險(xiǎn)參數(shù)過(guò)濾及繞過(guò)防護(hù)代碼:參數(shù)轉(zhuǎn)義:在PHP中,addsalashes和mysql_real_escape_string都是內(nèi)置的一種安全過(guò)濾函數(shù),
addsalashes功能是在用戶提交的參數(shù)中的敏感字符單引號(hào)(’)、雙引號(hào)(”)、反斜線(\)、和NUL(NULL字符,)前添加反斜杠(\),
mysql_real_escape_string對(duì)特殊符號(hào)\x00\n\r\’”\x1a進(jìn)行轉(zhuǎn)義。參考代碼如下:常見(jiàn)防護(hù)手段及繞過(guò)mysql_query(“SETNAMES‘GBK’”);Mysql_select_db(“XX”,$conn);$user=addslashes($user);$pass=addslashes($pass);$sql=“select*fromusertbwhereuser=‘$user’andpassword=‘$pass’”;$result=mysql_query($sql,$conn)ordie(mysql_error());$row=mysql_fetch_array($result,MYSQL_ASSOC);Echo“<p>{$row[‘user’]}<p><p>{$row[‘password’]}<p>\n\n”;SQL注入危險(xiǎn)參數(shù)過(guò)濾及繞過(guò)繞過(guò)方式:黑名單:繞過(guò)黑名單防護(hù)措施的思路是:將關(guān)鍵字或特定符號(hào)進(jìn)行不同形式的變換,從而實(shí)現(xiàn)繞過(guò)繞過(guò)過(guò)濾器的目的。目前存在的繞過(guò)方式有以下幾種:使用大小寫變種:通過(guò)改變攻擊字符中的大小寫嘗試避開(kāi)過(guò)濾,因?yàn)閿?shù)據(jù)庫(kù)中使用不區(qū)分大小寫的方式處理SQL關(guān)鍵字,所以可以嘗試將諸如or改為oR來(lái)試驗(yàn)?zāi)芊窭@過(guò)。但如果系統(tǒng)對(duì)輸入使用了大小寫轉(zhuǎn)換,那么該方法就沒(méi)有用了。使用
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- DSA護(hù)理實(shí)踐中的法律問(wèn)題
- 蒙醫(yī)護(hù)理康復(fù)指導(dǎo)
- 新教材政治部編版必修階段復(fù)習(xí)課第一課社會(huì)主義從空想到科學(xué)從理論到實(shí)踐的發(fā)展教案
- 護(hù)理質(zhì)量評(píng)價(jià)與法律法規(guī)
- 護(hù)理康復(fù)與運(yùn)動(dòng)療法
- 袋鼠常見(jiàn)疾病預(yù)防
- 護(hù)理超聲常見(jiàn)問(wèn)題及解決方案
- 2025 七年級(jí)數(shù)學(xué)下冊(cè)對(duì)頂角相等的幾何證明步驟分解課件
- 2025 七年級(jí)數(shù)學(xué)下冊(cè)不等式與不等式組解題技巧歸納課件
- 危重癥護(hù)理與生命支持
- 2026屆八省聯(lián)考(T8聯(lián)考)2026屆高三年級(jí)12月檢測(cè)訓(xùn)練地理試卷(含答案詳解)
- 2025民生銀行總行資產(chǎn)經(jīng)營(yíng)管理部社會(huì)招聘筆試題庫(kù)帶答案解析
- 民主建國(guó)會(huì)會(huì)史課件
- 鸚鵡熱護(hù)理措施
- 員工勞務(wù)合同書(shū)
- 人體形態(tài)學(xué)(山東聯(lián)盟)智慧樹(shù)知到期末考試答案章節(jié)答案2024年青島濱海學(xué)院
- 《辦公用房租賃合同》范本標(biāo)準(zhǔn)版可打印
- 人機(jī)環(huán)管安全管理措施
- 大慶一中、六十九中初四上學(xué)期期末質(zhì)量檢測(cè)物理試題
- 小學(xué)生一、二、三年級(jí)家庭獎(jiǎng)罰制度表
- 2022年12月華中科技大學(xué)科學(xué)技術(shù)發(fā)展院基地辦招聘1名社會(huì)用工筆試參考題庫(kù)含答案解析
評(píng)論
0/150
提交評(píng)論