2016-02-05 59 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

我的解决方案在理论上是正确的,但片段显然不完整。斯蒂芬的意见是非常正确的。 –