Распространенные способы обхода функций PHP в CTF

Оглавление

1. Распространенные обходы md5() и sha1()

1. Используйте обход массива

2. Используйте специальные строки для обхода

2. обход strcmp

3. Переключить байпас

4. Интвал байпас


1. Распространенные обходы md5() и sha1()

Введение знаний:

1. Для сильного и слабого сравнения PHP: функции md5(), sha1() не могут обрабатывать массивы. Если передан массив, будет возвращен NULL. Два массива будут иметь значение NULL после шифрования, что эквивалентно.

2. Для некоторых специальных строк зашифрованный текст, полученный после шифрования, начинается с 0e, PHP будет трактовать его как научную запись, то есть 0 в n-й степени, и полученные значения будут одинаковыми при сравнении.

Ниже приведена обычная зашифрованная строка зашифрованного текста, начинающаяся с 0e:

md5:

240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361


sha1:

10932435112: 0e07766915004133176347055865026311692244
aaroZmOk: 0e66507019969427134894567494305185566735
aaK1STfY: 0e76658526655756207688271159624026011393
aaO8zKZF: 0e89257456677279068558073954252716165668
aa3OFF9m: 0e36977786278517984959260394024281014729
0e1290633704: 0e19985187802402577070739524195726831799

Часто задаваемые вопросы:

Требуется, чтобы два переданных параметра не были равны, но должны быть равны после шифрования md5.

 Есть два способа обойти эту проблему:

1. Используйте обход массива

Передаются два разных массива. После шифрования md5 оба результата равны нулю. При сравнении они равны.

2. Используйте специальные строки для обхода

Просто выберите две зашифрованные строки, начинающиеся с 0e, и передайте их.

Иногда вопросы будут иметь дополнительные ограничения, например, ограничение на невозможность передачи массивов, поэтому мы можем использовать специальные строки, чтобы обойти его:

Если оба передают массивы:  

 Измените одну из групп на специальную строку:

2. обход strcmp

Введение знаний:

strcmp сравнивает две строки и возвращает <0, если str1<str2, >0, если str1 больше, чем str2, и 0, если они равны.

strcmp сравнивает строковые типы. Если принудительно передать параметры других типов, произойдет ошибка. После возникновения ошибки будет возвращено значение 0. Это используется для ее обхода.

Здесь мы передаем нестроковый тип, например массив:

3. Переключить байпас

Взгляните и посмотрите, больше ли входящий параметр 10.

Конечно нет, здесь нам нужно передать param1=0

Я думаю, вам тоже интересно, почему это 0?
Посмотрите на два примера:

<?php
$a = 0;
switch ($a) {
    case $a <= 10:
            echo '小于10';
        break;

    case $a <= 20:
            echo '小于20';
        break;

    case $a <= 30:
            echo '小于30';
        break;

    default:
        	echo '大于30';
        break;
}

Первоначально я думал, что результат вывода: меньше 10,
но фактический результат был: больше 30.

Давайте посмотрим на другой пример:

<?php
$a = 0;
switch ($a) {
    case $a <= 10:
            echo '小于10';
        break;

    case $a > 20:
            echo '大于20';
        break;

    default:
        	echo '大于30';
        break;
}

Выходной результат: больше 20

Первый пример: a=0, a<=10 удовлетворяется, поэтому значение выражения истинно, а затем определяется 0==true? Нет, переходим к следующему случаю до тех пор, пока последний случай не станет равным, поэтому используется значение по умолчанию.

Второй пример: a=0, a<=10 удовлетворено, так будет ли код считать 0== истинным? Нет, переходим к следующему случаю: $a>20 не удовлетворено, поэтому оно ложно, а затем устанавливается 0==false, поэтому выходное значение «больше 20».

На этом этапе вы можете легко понять, почему передача 0 в этом вопросе приведет к выводу флага.

4. Интвал байпас

Функция intval() используется для получения целочисленного значения переменной.

echo intval(53);                      // 53
echo intval(5.3);                     // 5

При фильтрации 5 мы можем ввести 5.3, чтобы обойти

Формат:int intval(var,base)

var — это количественное значение, которое необходимо преобразовать в целое число, а base относится к базе, используемой для преобразования. 
Если base равно 0, используемая база определяется путем определения формата var;
если строка включает «0x» (или «0X» ) Префикс, используйте шестнадцатеричный (hex);
если строка начинается с «0», используйте восьмеричный (восьмеричный);
в противном случае используйте десятичный (десятичный). 
Мы можем использовать его базовое преобразование для обхода.

Возвращает целое значение var в случае успеха, возвращает 0 в случае неудачи; возвращает 0 для пустого массива и возвращает 1 для непустого массива.

Если это слабое сравнение a==b, мы передаем a[]=1 и b[]=2,

На данный момент они разные, но оба возвращают 1 и также могут использоваться для обхода.

В функции intval есть уязвимость:

echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1

Когда одинарные кавычки передают значения, они распознают только первую часть буквы. Когда мы передаем параметры через get, одинарные кавычки добавляются по умолчанию. В PHP знак + будет расценен как вынуждающий преобразовать его в научную запись. Вычислить +1 вместо строки.

Supongo que te gusta

Origin blog.csdn.net/Myon5/article/details/131773778
Recomendado
Clasificación