CTF從入門到提升之寬字節注入

CTF入門到放棄
爲什麼說是從入門到放棄呢?(開個玩笑)如果說大家對CTF有了解的話,其實應該知道CTF是一個什麼類型的比賽,這個比賽涉及的範圍和影響有多大。如果說你真的想打好比賽,那也是真的非常不容易的,所以說這是非常困難的一件事情,初期可能學着學着就想放棄了,所以我就以這個來作爲一個標題,當然本意不是讓大家去放棄,就是爲了讓大家入個門然後再提升! 我會和我朋友一起來完成這門課程的講解。

課程主要針對web MISC密碼學,內容會儘可能多地去覆蓋常見比賽中涉及到的一些考點解題技巧等,我們會先舉例簡單的考點考題作爲案例來講解一下。 這樣的大家在學的同時可以上手做一個實驗,便於理解和掌握。大家有什麼問題可以留言,我們會回覆大家的。

我們進入正式課程,說到CTF它是什麼有什麼故事呢?以下是百度百科的定義: CTF(Capture The
Flag)中文一般譯作奪旗賽,在網絡安全領域中指的是網絡安全技術人員之間進行技術競技的一種比賽形式。CTF起源於1996年DEFCON全球大會,以代替之前們通過互相發起真實攻擊進行技術比拼的方式。發展至今,已經成爲全球範圍網絡安全圈流行的競賽形式。DEFCON作爲CTF賽制的一個發源地,DEFCON
CTF成爲了目前全球最高技術水平的和影響力的一個CTF競賽,類似於CTF賽場中的“世界盃”。

關於比賽模式
常見的競賽模式我這裏只舉了兩種(百度百科上還提到了第三種就是混雜模式),我們就先看前兩種:
第一種是解題模式,解題模式的話其實比較好理解,給我們一道題目去做一個解答。

參賽人員可以通過線上或線下去解出一個題目,解出題目後,你會拿到一個叫做flag的一個東西,那麼你就要去提交這個flag,如果你的flag是正確的你就會得分,類似於常規競賽。很多比賽中如果你是前三名,比如說拿到一血二血三血這樣子,你會有一個額外的一個加分;也會有其他的賽制,一道題目解出的人越多得分值就會越低(可以理解爲解出的人多題就簡單嘛)。

第二種攻防模式,攻防模式指參賽隊伍在整個網絡環境中做相互的攻防,每個隊伍它都會拿到一臺屬於他們自己的服務器。首先你要對它做一個加固,因爲其他隊伍會來攻擊你的服務器,如果攻擊成功他們就會做一些操作,如果順利可能獲得一個flag,那麼他們就得分,所以你要給自己的服務器做好防守,同時你也可以根據上述流程去攻擊別人的服務器,獲得flag。

百度百科上提到的第三種是混雜模式,其實就是先解題得基礎分,然後再進行攻防。但是實際比賽中,會有各種各樣的需求,還有防守形式,那種的話就像是誰先攻佔,誰先防守,然後看看時間長短。還有一種是每人一臺服務器,我們做攻擊,看對方的加固,目前國內還有一種工控形式的比賽。 給你一套正常的一套類似現實中的工控環境,對它進行滲透獲取flag,這種會更有趣一點。相信在之後CTF的賽制規則會越來越多,越來越有趣。

關於比賽規則
比賽的時間週期可長可短,長的有48小時短的可能幾個小時,比賽中時間會刷新,比如我有一個漏洞,按道理來說我們刷到一個漏洞,可以一直利用下去,那就可以一直得分了,其實並不是這樣子的,它有個輪數限制,每一輪我設置成5分鐘或者15分鐘,你在一個目標服務器上,在規定時間內只能得一次分,過了這十分鐘之後,那麼你才能進行第二次得分,這種競爭就會非常的激烈,每一分每一秒你都你都有可能被人超過,或者你都有可能去超過別人。 如果你發現一個別人都沒有補過的漏洞,那你就可以會全拿整個分數。

比賽的規則很多樣,如果你把別人的服務器宕機掉了,在一些規則中是要扣分的。你即使不得分,你也會讓別人失分,變相的會建立一些優勢。

有些比賽中會檢測CPU的使用率,如果服務器比較卡頓,會被認定該服務器不能正常服務,就會減分,所以說整個比賽中規則很多樣,沒有具體的非常標準化的規則,因比賽而異。

題型:
1、MISC
屬於雜項,比如說你不知道該怎麼分的時候,你就把它往雜項裏丟。常規雜項包括哪些類型呢?首先第一個就是我們常說的隱寫術,就是信息隱藏技術信息隱藏的話,你可以把信息隱藏在很多的東西中,比如說圖片文件音頻視頻等等一系列都是可以的,然後你要通過非常多的技術手段分析,或者說配合工具的一些使用,去找到你要的一些消息,去獲取到這樣的一個flag。

2、PPC
PPC是一個編程類的,編程類的話就比如說就像之前前段時間有個五子棋比賽,你要把他下贏了才能夠拿分,那你要麼可以自己下,把它下贏也是沒問題的;要麼你就可以自己去寫一個編程機器人去跟他做個對抗,去贏得比賽;通過編程來實現打分的形式,這種題目不會非常多的。

3、CRYPTO
CRYPTO是密碼學的題型,給你一串密文,去猜它使用了哪些加密方式,提取出你需要拿到的那個flag就可以。

4、REVERSE
REVERSE是逆向的,對windows或者Linux的一個破解,這裏的話因爲現在移動安全也比較火,那麼現在還會有衍生出來非常多的移動安全的題目,就類似安卓逆向等等。

5、PWN
基於程序的一個邏輯分析

6、WEB
我們就是常見的web狗,CTF鄙視鏈的低端(哈哈哈哈哈),web的題型就非常多啦。

CTF賽事介紹

  • DEFCON CTF (CTF賽事中的 “世界盃”,往年都是美國奪冠,去年是韓國的戰隊)
  • 日本的SECCON賽題也非常的難
  • XCTF全國聯賽
  • 其他各種賽事

除了國際賽的話,國內也有很多,比如說XCTF就是它的全國聯賽,它有一站一站可以打過去。然後除了這些知名賽事之外,其實還有很多那種小賽事,你也別小看它,其實很多題目也都挺有意思的。這些題少,但是也可以去關注一下。

我們會先去找一些網上可以訪問到的題目來做,之後各種考點都講完了,會把這點混在一起,去找一些那種國際事國際賽事,或者是國內知名賽事,就相對來說難度大一些的,或者說是一些他們交流的,交就會內部交流的一些題目,或者說還有那種就是某些愛好者自己放出了一個挑戰賽之類的這種題型,會拿出來給大家做一個分享。

下面給大家推薦2個網站:
在這裏插入圖片描述
第一個地址會介紹國內國際上的要舉行的一些CTF賽事的一些時間等等信息,一些戰隊的一些排名,像剛提到的SECCCON日本的黑客大會,都可以去了解一下。ctftime.org是對一個在國際上比較重要的賽事的做一些記錄,而且會還會給出賽事的一些權重,以及對這種CTF知名戰隊的一些排名,就可以去了解一下。要提升自己的實力,開始入門嘗試去找一些能夠上手去練習的地方。因爲其實如果一開始你直接去打各種比賽,都做不出來就很受打擊,所以的話一開始的練習是非常重要的。那麼這裏就減給了一些那種你能夠去練習的一些站點,如果說技術不太好的話,可以都看一看,都上手去試一試。
在這裏插入圖片描述

寬字節注入
首先對sql注入做一個系列的課程講解。它是一個系列,因爲它內容涉及非常多,就會一點一點地講下去。一開始我先會講關於一個寬字節的一個注入,因爲寬字節相對來說比較簡單,同時也就是即使你不會在這個地方你通過對寬字節注入的瞭解,你也大致能夠了解基本注入的一個方式。提到寬字節注入就要提到一些常見的編碼方式,比如第一個ASCII,我們看下這張表:
在這裏插入圖片描述
它是從0到127的,那麼其實就是阿斯克碼錶中,它會認爲這種比如說字符調入url編碼,一般來說它這種字母什麼的,可能就是你在傳輸過程中,你會發現它不是進行編碼的。因爲它這種小於128的,會認爲這是一個單單個的一個字。但是我們知道如果我們在傳說一箇中文的時候,比如說你在網頁網址中去輸箇中文,這個中文很多時候都會變成一個百分號開頭的一串的一個字符串,其實就是相當於就要做一個轉碼的形式。針對一個GBK的注入使用,GBK是關於中文的一個編碼,但這個GBK庫其實是不全的。

在這裏插入圖片描述

我們先看一下對url轉碼的一個問題:

在這裏插入圖片描述

比如說我們去使用hackbar(它是基於火狐瀏覽器的一個插件),你會發現裏面除了空格之後,你再去發出請求,你再回過頭去看url,就是地址欄的時候,你會發現這個空格都會變成一個%20,它其實就是對這個東西做了一個url編碼。

(在這裏我做一個演示,如果大家想看可以到安全牛課堂的視頻裏看動手操作 CTF從入門到提升 課時1 18分10秒)

對某些符號的url編碼其實要有要稍微要敏感一些,比如說空格在編程編之後就會變成一個%20,然後‘ 就更加要去重注意這個地方。爲什麼這樣說?我們知道在注入的時候有一個很重要的一個問題,我們不去輸入一個’,那麼我們輸入的內容是無法逃逸出對引號之間的,即使你這種時候去輸再多的語句也是沒有任何意義的。 所以說你對單引號要敏感一些。因爲單引號中很重要,比如說像還有雙引號這種,因爲它有可能能夠幫助你去逃逸,有的就是它把你限制死的框中,然後#2%#3%也很重要,因爲什麼?#就是我們常的一個註釋符對吧?這裏我們把%5C拿出來,因爲這裏就要提到一個這個函數,這函數可以簡單的看一下:
在這裏插入圖片描述

這個地方截圖是來自於php.net官方手冊上的一個截圖。上圖它給的是一個當前函數知識的版本好。然後沒有後面的話,如果講到關於php的代碼審計的一些問題的時候,就經常會去看這個手冊,因爲這些有些函數它其實它的問題是存在於某些版本之中的,或者說某某相人術它在某些版本中是棄用的,所以像這種地方可以多去關注一下。

在這裏插入圖片描述

下面就給了一個簡單說明,它的就是說它會返回一個字符串,你可以看到它該字符串就是爲了數據庫查詢語句,等待需要某些字符串,字符前加上反斜線。它提到的這些符號就是第一個是’ ",然後\,還有一個的’?你要知道加上\的一個作用,加上\之後,‘就會變成加’全部加上一個\,那麼\其實起到的就是一個轉移作用,‘就是它就會變成它是個’,但是它只有長的是個’樣,但是沒有’在代碼中的一個作用,那麼這段以後就會失去它本身的一個作用,它只是看成你能看到它’,但是不能去實現一個注入的功能。

那麼這個函數的話,其實你看它這麼簡單,但是其實很多這種php庫中很多的使用的調用的第三方代碼庫,它其實都是基於這個函數做的二次開發封裝之後的一個調用,就說它的本質還是使用了這個函數的。那麼我們是接下來重點就是說如何從這個函數中去逃逸出來,我們因爲他這個函數存在,我們就無法去插入一個’ "無法插入’,"的時候,我們就無法去實現語句的執行,因爲我們數據都在引號之中,它會把我們所有的東西都當成字符串去做一個查詢的。

這裏給兩種思路:

第一個,要麼在前面\再去加一個\,那麼\就把\給轉移掉。那麼‘是不是就生效了。那麼或者第二種思路就是’,好想辦法把它給弄沒掉去,因爲這樣‘不見了的話,那麼不是’,就是反其先給弄沒掉去,那麼這樣的話單引號就會生效了。所以就基於這兩種樹就要去做一個操作。這裏提到了這寬字節,剛纔是不是提到\其實是%5C。

之前一開始我就講到說你比如說你輸一箇中文,你會在地址欄中發現它會變成一串%一個形式。那麼但是我們其實知道%一串東西,它本意其實是一個漢字,那麼GBK它用的就是這樣一種形式,用\去和我們去數我們所有的東西,去重新構成一個漢字。

(在這裏我做一個演示,如果大家想看可以到安全牛課堂的視頻裏看動手操作)

它這地方是不是就給了一個‘?然後’在前面去加個\,它其實就是%5C%27。因爲這是url轉碼之後的。但是像下面這個地方,我就給出了一個%df%5C%27,那麼它的轉碼之後是不是就經過那個函數過濾之後,是不是會在‘去加個反斜線,那麼它其實就會變成三個字符。像GB K的問題,它就是把兩個%開頭的這種認爲是一個漢字,而且我之前提到過,就對於阿斯科碼128的一個,他就會認爲他不是一個符號,他就會認爲這兩個拼接在一起纔是一個,他就不會把它認爲單一符號,而且級PK是兩一個兩個兩兩個自己認爲一個是一個漢字,那麼他就會把%5C然後把%DF和800分和5C去拼接在一起,作爲一個漢字來識別。那麼這樣的評級在一起之後,51%是不就不見了,51%它其實就是反切線,那這個時候分二期他就會逃逸出來,去達到一個逃逸的效果。我們可以看一下它的一個效果。

(在這裏我做一個演示,如果大家想看可以到安全牛課堂的視頻裏看動手操作)

比如說像這個地方,它是一個網在線轉碼工具,我還是在這個地方去輸一個,比如說中文你好,我對他做一個url解碼,因爲GBK的我要把它換成做個編碼之後,你會看到%C4%E3是兩位的。那麼按照我剛纔的說法,是不是單引號會加\,他做個編碼的形式的話,我要做的是在單引號去前面去加個%DF我這時候再做個解碼的時候,他會把這兩個認爲是一個漢字,做一個解碼,你會看到這個時候,它把它認爲一個漢字的時候,那麼就是會變成這麼一個字,這時候單引號就做出了一個逃逸。你要注意到這個時候,GBK編碼其實是由於數據庫,它是使用GBK編碼的,要不然的話,因爲他查詢的時候是把它其實會直接把%DF和\’去直接插入到數據庫裏的,而不是說是因爲前面的就在前端的一個執行,是因爲它經過數據庫的一個執行,然後或者說我們可以簡單的去看一下。
(在這裏我做一個演示,如果大家想看可以到安全牛課堂的視頻裏看動手操作)

比如說就說本地做的環境,這個環境其實是用之前很早的時候用的一個環境,它這個地方它的注入點是?如果說我在單引號它是沒有效果,我去加個%df的時候,它其實就會報錯。它實際去抄到數據庫中去執行那個東西,這是非常老的一個工具,但是挺好用的。我在去執行一下,我對它做一個可能性。因爲看到這個時候是不是\,\X其實就是類似我們這個地方的一個%,就代表其實就是%df,因爲其實這個df代表是16進制,X代表其實就是16進制編碼。然後X和df就會和反切像組成一個字去實現一個查詢。這個其實就是對寬字節的一個基本原理。

舉例
(在這裏我做一個演示,如果大家想看可以到安全牛課堂的視頻裏看動手操作,CTF從入門到提升 課時1 28分10秒處)
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述拿一個簡單的例題來看一下,這個題目其實應該是南郵訓練平臺的一道題目。那麼我們可以整個過程來看一下,到底是怎麼來做這種題目,因爲這種的話只是爲了簡單,先讓我們回顧一下SQL注入這些問題,後面會越來越深入瞭解講講。首先的話,其實你知道我們目的是要去殺插入的單引號,因爲它這個地方給出了我們這個語句,可以說這個語句。那麼我先插入一個單引號,它是沒有用的。反斜線就用剛纔說的加了幾個加上%df去實現。然後其實剛纔提到一個點,是不是不是針對%df其實只要大於128其實就可以了,比如說A可以看一下到底行不行。你會發現A其實也是可以的,其實證明剛纔說的是沒有問題的。那麼這樣子可以之後,那麼就要去做進一步的注入。其實動畫之後你會發現,其實也沒有說如果說是這麼順利的可以坐下來,比如說你接下來就是要首先去跟一個單引號的話,配合上之後要去做一個#。他後面東西今後你發現它都是不報錯了,之前去判斷一下,看一下對不對。這就是沒有生效,他這樣纔是有用,所以這道題到就黑開發的一個使用,很多時候就要去做一個轉碼,要不然它其實是會有問題的。而且其實要拖到轉板這個問題,就不同的版本還可其實作用又不一樣,像我這邊的瀏覽器是新版火狐,像我在這個裏面是舊版火狐,又會有一些簡單的一些差異。你會發現其實就是輸出點,那麼首先去查data base,這是它的當前的一個數據庫。

要了解的話可以去網上去看一下,因爲它只是基於數據庫my
circle數據庫本身的一些自帶的一些庫,它會記錄下來那些其他的一些庫的信息,所以通過去查這個庫中庫中的某些表的數據,就可以去拿到一些數據,那麼放他的條件是推波。貼寶貝CHCHE那麼等於按道理來說,這個時候其實應該是不是要去說一個庫名,如果像你這樣的話,可以去說,可以試試看。因爲發現這個時候,它會在單以後去前面再去加一個反斜線。

這樣的話其實這個地方就會就出現問題了,那麼其實這個地方的引號其實是不能去使用的。那麼這個地方的話,第一種方法你可以用他的全具備用去代替。DATABSC在特別是去做一個大T你會看到這時候存在一種數據表示CTF對吧?除了CTF之外,它會不會其他表呢?可以試看。Q友看那就是ct
FCDFCP3CPACF這麼多的表,其實我也不知道他是哪張表,是答案所在,其實也無所謂,主要是爲了掩飾整個的一個注入過程。那麼這樣的話其實就說明我們能夠拿到你們的數據表,那麼接下來他就是我就假設,比如說要CTF這張表,我只是隨便舉例子,不一定把它做完,就是講解這麼一個方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章