Вопрос окружения:
ФЛАГ НУЖНЫ ВАШИ 100000000 ДЕНЕГ Флагу нужны ваши 100 000 000 юаней.
F12 Взгляните на исходный код:
if (isset($_POST['password']))
{
$password = $_POST['password'];
if (is_numeric($password))
{
echo "password can't be number"
}
elseif ($password == 404)
{
echo "Password Right!
}
}
Аудит PHP-кода:
Два параметра: пароль и деньги, передаваемые методом POST. Функция isset определяет, существует ли параметр и является ли значение пустым. Если он существует или не пуст, она возвращает TRUE. is_numeric() Функция используется для определения того, является ли переменная числом или строкой чисел; здесь следует отметить, что значением числовой строки является литеральная строка, состоящая из чисел, например: «123456789» Если это число или строка цифр, будет выведено «пароль». can’t be number" Если пароль 404, пароль правильный
Если пароль равен 404, хотя второй оператор elseif выполняется, первый оператор if не выполняется. Потому что 404 — это число и строка цифр. Если вы хотите удовлетворить первую простоту, просто создайте пароль в виде обычной строки: 404a, 404b, 404c, 404%10, 404,%20, 404%30 и т. д. Таким образом, выполняется и второе условие. Почему? (Преобразуйте значение в числовую строку во время сравнения) «==" — логический оператор слабого сравнения PHP.
Слабое сравнение PHP:
Слабое сравнение в PHP — это метод сравнения двух значений на равенство, но он не выполняет строгое сравнение на равенство между двумя значениями. Вместо этого он позволяет определенным типам значений подвергаться автоматическому преобразованию типов при сравнении. Слабые сравнения используют следующие правила:
Передайте параметры и используйте Burpsuite для захвата пакетов.
password=404a&money=100000000
Сначала выполните передачу параметров POST через плагин браузера Firefox Max HackBar, а затем запишите пакет. Таким образом, пакет данных является методом передачи параметров POST, если метод передачи параметров метода GET изменен на передачу параметров метода POST. непосредственно в пакете данных, это все равно может быть метод GET. При передаче параметров необходимо обратить на это внимание.
鼠标右键Repeater->Send进行重放
Только студенты-пользователи могут приобрести FLAG. Примечание. Файл cookie:user=0 user — это пользователь, 0 обычно означает «ложь» (ошибка), 1 обычно означает «истина» (правильно). Мы меняем пользователя на 1, чтобы фоновая программа могла работать нормально.
Изменить пользователя=1 Продолжить Отправить на повтор
Пользователи и пароли обходятся Nember lenth is too long Ваш номер слишком длинный 到这里想到了Используйте научную нотацию, чтобы обойти 1e9 означает 1, за которым следуют 9 нулей. => 1000000000 > 100000000 (Оно должно быть больше денежной стоимости, требуемой вопросом!) Условия соблюдены и длина номера не слишком велика.
Обход денег, используя научные обозначения:
password=404a&money=1e9
Когда деньги=1
у тебя недостаточно денег, неудачник у тебя недостаточно денег
После тестирования параметра денег в различных ситуациях есть три типа выходных результатов.
Я предполагаю, что функция strcmp() используется для сравнения двух строк, а также может сравнивать количество символов в двух строках.
strcmp(string1,string2)
Следовательно, если фильтрация неправильная и неполная, ее можно обойти, превратив параметры в массив. В этом случае сравнение невозможно, и значение true будет возвращено напрямую.
Вот смелое предположение о его исходном коде:
<?php
$flag=100000000;
$Flag='flag{0c531ed2-9c1e-479a-adcb-d975b1376ca6}'
if (isset($_POST['money'])) {
if (strcmp($_POST['money'],$flag) == 0)#Сравнить значения денег и флагов и количество символов, "=="Логический оператор слабого сравнения PHP
echo $Flag;
elseif(strcmp($_POST['money'],$flag) < 0)
print 'you have not enough money,loser';
else
print 'Nember lenth is too long';
}
?>
Обход денег через массивы:
password=404a&mony[]=0
На полпути Репитер в моей версии Burp 2023 года исчез. Я спросил мастеров, что случилось сейчас, поэтому я снова использовал версию Kali 2021 года. Это горько.
Получить флаг:
flag{cb3acdc3-dcda-49d0-9597-b7247f9c6ff0}