如何通过利用此代码获得管理员访问权限?

时间:2019-02-28 11:52:48

标签: python python-3.x exploit

我正在参加比赛,但我无法解决此任务。 目的是使用秘密词典中列出的不同帐户登录,而无需知道密码。 不允许更改代码。 例如,您可以使用以下输入来宾登录:

anything
0

,并与用户:

user
-1

我不知道如何用管理员登录。

#!/usr/bin/python3
# Change the pin codes here before using this software:
secrets = {
    "guest": 123456,
    "user": 123456,
    "admin": 123456
    }

def authenticate():
  selected_user = input("Enter your username: ")

  if selected_user.lower() == "admin":
    print("Administrator access is disabled on this interface!")
    return None

  real_user = "guest"
  real_pin = 0

  for (user, pin) in secrets.items():
    if user.upper() == selected_user.upper():
      real_user = user
      real_pin = pin

  try:
    pin_as_string = input("Enter your PIN code: ")
    selected_pin = int(pin_as_string)
  except:
    print("Some error occured while reading PIN code, please try again!")
    return None

  if not pin_as_string.isdigit():
    print("Warning: the PIN contains a non-digit character!")

  elif selected_pin != real_pin:
    print("Incorrect PIN code!")
    return None

  return real_user

user = authenticate()
if user is not None:
  print("Successful login as", user)

1 个答案:

答案 0 :(得分:2)

您想要一个大写时映射到"ADMIN"字母的字符。向Python索要很容易:

lst = []
for i in range(0xffff):
    try:
        c = chr(i)
        if c.upper() in "ADMIN": print(hex(i), c, c.lower())
    except Exception as e:       # don't break if any exception
        print(i, "->", e)

你得到

0x41 A a
0x44 D d
0x49 I i
0x4d M m
0x4e N n
0x61 a a
0x64 d d
0x69 i i
0x6d m m
0x6e n n
0x131 ı ı

这个有趣的值是最后一个值:U + 0131,根据unicodedata模块,这是拉丁文小写字母I

在Microsoft Windows中,此字符存在于代码页850中:print(chr(0x131).encode('cp850'))赋予b'\xd5'。因此,序列 Alt Num 2 Num 1 Num 3 将允许在控制台中输入它({{1 }}是hex(213))。 +1或-1作为密码即可解决问题!在我自己的控制台中:

'0xd5'

不确定其他系统,但Wikipedia上的Unicode input可能会有所帮助。