6. Injection Flaws -1

 WebGoat-Injection Flaws 1

 

401261102 顏嘉村 401261449 王思涵 401262584 周思妤

 

大綱

1. 準備工具 -- Burp Suite
2. Injection Flaws
   A. Command Injection
   B. Numeric SQL Injection
   C. Log Spoofing
   D. XPATH Injection
   E. Blind Numeric SQL Injection
3.參考資料

 

1. 準備工具 -- Burp Suite

我們在做題目的時候,有用到一個攔截封包的工具,Burp Suite。比較需要注意到的地方是,在開啟WebGoat的時候,他會占用到port 8080,而Burp Suite預設開的port也是8080,記得要另外開一個port,避免會卡在這裡納悶為甚麼勾勾一直勾不起來。

 

 

2. Injection Flaws

A. Command Injection

我們要在Server端注入指令,但是在輸入指令前,

我們必須先知道Server端的作業系統!

而我們可以從這個頁面觀察到"cmd.exe",

發現它的作業系統為Windows。

 

按下View之後,可以看到上一張圖後面的"BasicAuthentication.html"

變成"AccessControlMatrix.html",

這個動作是使用網頁的選單去選取頁面,然後利用指令來請求Server顯示內容。

在這過程中,我們可以利用一些工具去攔截這些請求,試圖更改其內容。

 

看到"HelpFile",它的值就是我們剛剛所選的頁面。

 

接著我們試著在後面隨意地打了一些值。

 

按下"Forward"後,可以發現網頁的指令被更改。

我們知道這裡是Windows的指令,

從上面框起來的地方可以發現它的指令是由雙引號所包起來的。

 

 

在"HelpFile"值的地方,我們先打上一個雙引號讓前面的指令提早結束,由於我們知道Server的作業系統是Windows,而Windows連接指令的符號為&,所以這邊加上一個&,後面再連接我們想要注入的指令。

 

 按下Forward後,就可以看到我們注入的指令成功顯示在頁面上,

以及過關的訊息。

 

B. Numeric SQL Injection

 

這題的目標是,試著去注入SQL字串,讓結果可以顯示所有的weather資料。

 

試著按下Go!的按鈕,我們可以看到它所下的SQL指令,以及顯示出來的結果。

 

我們一樣使用工具去攔截這個請求,可以看到station這個欄位,原本它是根據下拉式選單所選擇而不同,那依照它提示的SQL語法
“SELECT * FROM weather_data WHERE station = 101”
我們可以將這個欄位改成如圖所示的”Solution 1”和” Solution 2”。

 

 按下"Forward"後,它就顯示所有地區的weather,以及過關的訊息。

 

C. Log Spoofing

 

 

這題的目的是要在灰色部分呈現出

"Login succeeded for username: admin"

 

 接著我們試著在"User Name"和"Password"裡隨意地輸入字串,

按下Login後我們可以看到"Login failed for username: 123"。

 

 

接著我們在"User Name" 打入 "123 Login succeed for username: admin"

,輸入之後的結果沒有換行,而是在同一行。

我們就在123的後方,加入%0a(換行符號),之後按下Login。

 

 

最後就會看到,"Login succeed for username: admin",這句出現在第二行,以及成功過關的訊息。

 

D. XPATH Injection

 

這題的題目是,XPath Injection,當然得先對XPath稍有一點認識!

XPath,XML path language,是XML的一個路徑語言,能夠找出在XML文件裡特定位置的語言,藉由XML的樹狀結構,提供尋找節點的能力。

他的表示式為路徑表達式,為從XML的一個節點,到另一個或一組節點的書寫步驟,每個節點用「/」分開。

而每一步則有分成三個成分,分別為:

軸描述,以最直接的方式接近你所指定的節點。其軸描述有許多縮寫語法,詳細查詢Wiki

節點測試,決定節點的位置跟名稱。比較常用的如text()為尋找節點名稱。

節點描述,決定節點的屬性跟子節點特徵。


尤其為節點描述,其格式大致如下。

//a[@href='help.php'],這將檢查元素a有沒有href屬性,並且該它的值是help.php。

可以得知這算是一個真假(布林)表達式,那其中可以用布林符號(AND、OR)做運算。

 

詳閱過後,發現其實XPath的模式和SQL語法十分相似。

軸描述就像是 SELECT __ FROM __ 。

節點測試和描述就像是 WHERE 在描述其條件,亦可用布林符號做運算。

 

這題的目標是,想辦法看到其他員工的資料,他有給一組帳號密碼分別是Mike/test123,那我們把它輸入進去後登入,即得到下面的那個表格。

 

那我們試著打一個單引號看看?有問題!

根據上面XPath的特性,我們可以推估大致上語法會是下面這個樣子:

/employees/employee[loginID/text()=username AND password/text()=password]

在employee下的所有子節點,其子節點必須符合特定的帳號密碼組合

 

text()後面所接的字串必須用單引號包起來,那實際可能會是:

 

/employees/employee[loginID/text()='username' AND password/text()='password']

我們所輸入進去的「username」和「password」,需要甚麼條件才能讓後面這段恆成立(True)呢?

即 username= ' or 1=1 or 'a'='a

前面的單引號讓text()所包覆的字串提早結束, or 1=1 即讓到這段恆成立(True)

但別忘記後面還有個單引號,為了使式子語法不會錯誤,即加 'a'='a ,最後會加上原本的那個單引號,變成字串=字串,前後型態相同才不會Error,password等於甚麼就不影響了,因為,整句判斷式將會是:

/employees/employee[( loginID/text()=' ' or 1=1) or ('a'='a' AND password/text()='password' )]

在XPath,and的優先度比or高,即變成上面這個樣子。

 

 最後點Submit,即可以看到所有員工的資料,以及過關的訊息。

 

 

E. Blind Numeric SQL Injection

 

這題的目標是,找到特定的pin value。

題目有提示,可以輸入Account Number,按下Go!後會得知是Valid(True) 或是 Invalid(False),藉由這個功能去確認在資料庫的其他欄位的值。他預設的值,101,為Valid的值。

 

輸入101以外的值去測試看看,得到的結果果然為,Invalid(False)

 

打一個簡單的判斷式看看,101 AND True。

在Server端可能會被視為:True AND True,那結果當然是Valid(True) 。

 

接著看題目給的另一個提示,即在描述這個pin value在哪裡以及他的條件,可以寫成下列這個SQL語法:


 SELECT pin FROM pins WHERE cc_number=1111222233334444

 

接著我們就可以預估這個值了,在那個格子裡填入:

101 AND ( ( SELECT pin FROM pins WHERE cc_number=1111222233334444 ) >1000 )

即為 TRUE AND ( ( SELECT pin FROM pins WHERE cc_number=1111222233334444 ) >1000 )

如果這個 pin value > 1000 的話,那就會得到Valid。

 

得到Valid了!看來這個值是大於一千的。接著以此類推,試著猜 pin value >10000

 

得到Invalid了!看來這個值是小於一萬的。接著來回測試,等到區間小到你可以接受的地步(50?20?),一個一個輸入進去測試看看吧。

 

 

最後得到答案是2364,輸入後送出,得到過關的訊息。

 


3. 參考資料

 

OWASP - XPATH Injection

Wiki - XML

Wiki - XPath

XPath教程

w3c - XPath