将python代码注入TCP套接字服务器

将python代码注入TCP套接字服务器,python,sockets,tcp,code-injection,Python,Sockets,Tcp,Code Injection,我被困在这个任务中,因为我要解决一个关于渗透测试的问题,我们得到一个简单的TCP web服务器,我们要连接到它并给出两个值,如果它们最终匹配,我们得到标志,我们还得到一段服务器代码。我已经尽了我所知的一切去得到国旗。代码如下: clientsock.send("Welcome to Maths_Server 1.0\n") try: clientsock.send("Enter the first number, so I can EVALuate it:\n") firstNu

我被困在这个任务中,因为我要解决一个关于渗透测试的问题,我们得到一个简单的TCP web服务器,我们要连接到它并给出两个值,如果它们最终匹配,我们得到标志,我们还得到一段服务器代码。我已经尽了我所知的一切去得到国旗。代码如下:

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()

请注意,使用
eval
将数字从字符串转换为“数字”。这意味着您不需要传入一个数字,只需传入一个值为1的数字。由于
eval
使用局部变量,您可以为
firstNum
输入字符串
-0.5*(ord(标志[4])+ord(标志[8])+ord(标志[5])
,这将使下一行设置
firstNum
。然后您可以为
secondNum
传递literal
0
,并获取
标志


您可能需要将字符串填充到1024个字符。我会做一些类似于
output.center(1024,”)
的事情请注意,数字是使用
eval
从字符串转换为“数字”的。这意味着您不需要传入一个数字,只需传入一个值为1的数字。由于
eval
使用局部变量,您可以为
firstNum
输入字符串
-0.5*(ord(标志[4])+ord(标志[8])+ord(标志[5])
,这将使下一行设置
firstNum
。然后您可以为
secondNum
传递literal
0
,并获取
标志


您可能需要将字符串填充到1024个字符。我会做一些类似于
output.center(1024,”)

的事情,只需将字符串
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)
作为第一个数字发送,它会立即将flag的值发送回您。请注意,这不适用于测试服务器,因此我猜源代码略有不同,并且不只是执行远程用户提供的任何类型的代码,而是仅当它符合您得到的任务的期望时。但它与给定代码的测试安装配合使用


这很可能会让你得出这样的结论:永远不要只评估未初始化的用户输入。

只需将字符串
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)
作为第一个数字发送,它会立即将flag的值发送回您。请注意,这不适用于测试服务器,因此我猜源代码略有不同,并且不只是执行远程用户提供的任何类型的代码,而是仅当它符合您得到的任务的期望时。但它与给定代码的测试安装配合使用


这很可能会让你得出这样一个结论:永远不应该只评估未初始化的用户输入。

你可以尝试的次数有限制吗?无需担心。你不需要超过一次。你可以尝试的次数有限制吗?没关系。你不需要超过一个。不工作,它不要求我提供第二个号码,然后它关闭连接,可能是因为它引发了一个异常,并且它有except:pass,或者可能是因为我通过终端上的nc连接?我不确定是否有一个网站或什么东西有说明?我不想随机地ping一个我不熟悉的服务器。我的解决方案理论上是正确的,但代码片段显然是不完整的。Stephen的回答非常正确。不起作用,它不要求我提供第二个号码,然后关闭连接,可能是因为它引发了一个异常,它有except:pass,或者是因为我通过终端上的nc连接?我不确定是否有一个网站或什么东西有说明?我不想随机地ping一个我不熟悉的服务器。我的解决方案理论上是正确的,但代码片段显然是不完整的。斯蒂芬的回答非常正确。。。。我不敢相信我没有想到这一点,我想我今天要做的其他20多个问题让我很紧张,非常感谢。。。。我不敢相信我没有想到这一点,我想我今天要做的其他20多个问题让我很紧张,非常感谢。