2016-02-05 94 views
0

我被困在這個任務中,我正在解決與滲透測試有關的問題,我們給了一個簡單的TCP Web服務器,我們要連接到它並給出兩個值,如果他們最終匹配,我們會得到國旗,我們也會得到服務器代碼片段。我嘗試了我所知道的一切來獲得國旗。以下是代碼:注入python代碼到TCP套接字服務器

clientsock.send("Welcome to Maths_Server 1.0\n") 
try: 
    clientsock.send("Enter the first number, so I can EVALuate it:\n") 
    firstNum = eval(clientsock.recv(1024)) 
    firstNum = firstNum + firstNum + ord(flag[4]) + ord(flag[8]) + ord(flag[5]) 
    clientsock.send("Enter the second number, so I can EVALuate it:\n") 
    secondNum = eval(clientsock.recv(1024)) 
    if secondNum == firstNum: 
     clientsock.send("The flag is: " + flag + "\n") 
     firstNum = 0 
     secondNum = 0 
except: 
    pass 

clientsock.close() 
+0

您可以嘗試的次數是否有限制? –

+0

沒關係。你不需要超過一個。 –

+0

不錯的腦筋傳情。 –

回答

2

只要發送字符串firstNum作爲第二條消息。然後,你一定會成功,不管你的價值作爲初始用途是什麼firstNum:

secondNum = eval(clientsock.recv(1024)) 
-> secondNum = eval("firstNum") 
-> secondNum = ... value of firstNum 

這很容易通過telnet進行

$ telnet services.cyberprotection.agency 3166 
Welcome to Maths_Server 1.0 
Enter the first number, so I can EVALuate it: 
10 
Enter the second number, so I can EVALuate it: 
firstNum 
The flag is: .... (try yourself)... 

另一種可能性是,你只是發送字符串clientsock.send(flag)作爲第一個數字,其馬上會給你發回標誌的價值。請注意,這不適用於測試服務器,所以我猜測源代碼稍有不同,並且不會簡單地執行由遠程用戶提供的任何類型的代碼,但前提是它符合您獲得的任務的期望。但它適用於我給定代碼的測試安裝。

這有望讓您得出一個結論,即永遠不應該只是評估非用戶輸入。

+0

......我不敢相信我沒有想到這一點,我想今天我必須做的其他20多個問題讓我感到非常緊張,非常感謝。 – Zunon

1

請注意,使用eval將數字從字符串轉換爲「數字」。這意味着你不需要傳遞一個數字,只是一個評估爲一個的東西。由於eval使用局部變量,因此可以輸入字符串-0.5 * (ord(flag[4]) + ord(flag[8]) + ord(flag[5]))作爲firstNum,這將使下一行設置爲firstNum爲零。然後你可以通過字面0secondNum並得到flags

您可能需要將字符串填充到1024個字符。我會做一些像output.center(1024, ' ')

+0

不起作用,它不問我第二個數字,然後它關閉連接,也許這是因爲它拋出一個異常,它有 ,除了: 通過 或者可能是因爲我通過NC連接終點站?我不確定 – Zunon

+0

有沒有網站或有指示的東西?我不想隨機ping一個我不熟悉的服務器。 –

+0

我的解決方案在理論上是正確的,但片段顯然不完整。斯蒂芬的意見是非常正確的。 –