Вверх ↑
Ответов: 195
Рейтинг: 7
#1: 2022-10-14 12:52:38 ЛС | профиль | цитата
Assasin, спасибо
Assasin писал(а):
Лучше почитай про PDO и prepared statements

Переведу все PDO

То, как ты сейчас передаешь аргументы в SQL строку - полная свобода для любителей SQL-injection (погугли, если не в курсе что это).

Думаю такие вещи тоже будут полезны новичкам)))

Делаем пентест авторизации методом SQL-injection

у меня есть функция которую я использую dataprotect()
она как раз и сделана для того чтобы проверять входные данные и убирать всякую гадость
например:
буду использовать полученные данные без обработки в функции dataprotect()

было так
$authPassw = dataprotect($_GET['passw']);

стало так

$authPassw = $_GET['passw'];


приложу кусочек кода с которым будем работать
elseif ($action=='auth' AND $authLogin!="" AND $authPassw!="")
{
$user_arr=mysql_fetch_array(mysql_query("SELECT * FROM `user` WHERE `name`='$authLogin' AND `pass`='$authPassw'"));
if($user_arr[0]!="")
{

define("auth",true);
echo 'succes';
}
else
{
define("auth",false);
echo'falled';
}
}

Вот API для авторизации, делаем проверку добавляем вместо значения одинарную кавычку вот так passw='
https://labdev.ml/api/api.php?action=auth&login=admin&passw='

Соответственно получаем ошибку MySql такого типа
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in labdev.ml/api/api.php on line 87
falled

Отлично! значит защиты нет, идем дальше:

Встраиваем наше новое условие

https://labdev.ml/api/api.php?action=auth&login=admin&passw=' OR '1'='1

и запрос в MySQL у нас получается такой

SELECT * FROM `user` WHERE `name`='$authLogin' AND `pass`='' OR '1'='1'

Круто, не зная пароля мы получаем авторизацию
+ бонусом
весь список юзеров что есть у нас в таблице)))




ответ: succes


теперь возвращаю все как было с использованием функции dataprotect()

делаю запрос
https://labdev.ml/api/api.php?action=auth&login=admin&passw=' OR '1'='1

результат работы функции dataprotect($_GET['passw'])
\'OR\'1\'=\'1\'

получаем ответ: falled

Ура защита от SQL Injection сработала!!!


Отправляю на API уже хешированный пароль

в приложении я использую такой принцип, отправляю на API уже хешированный пароль

Add(FormatStr,3576882,504,259)
{
DataCount=1
Mask="http://labdev.ml/api/api.php?action=auth&%1"
link(onFString,9567034:doCharset,[])
link(Str1,14717093:GetData,[])
}
Add(EventFromData,1594050,434,259)
{
link(onEvent,3576882:doString,[])
}
Add(Charset,9567034,560,259)
{
Type=6
link(onCharset,1594050:doData,[(619,265)(619,227)(422,227)(422,265)])
}
Add(FormatStr,2358365,455,119)
{
Mask="login=%1&passw=%2"
link(onFString,14717093:doData,[])
link(Str1,13262524:getVar,[])
link(Str2,7507619:Var,[])
}
Add(EventFromData,14717093,504,119)
{
link(onEvent,7229491:doStrCatDlm,[])
}
Add(Hashsum,12102409,616,119)
{
link(onResult,12206786:doValue,[])
link(Data,7229491:Result,[(622,107)(601,107)(601,167)(559,167)])
}
Add(Memory,12206786,665,119)
{
link(onData,2358365:doString,[(719,125)(719,189)(443,189)(443,125)])
}
Add(StrCatDelim,7229491,553,119)
{
Delimiter="\"
Str1="x1sdiNenEjdQ"
link(onStrCatDlm,12102409:doHashsum,[])
link(Str1,11818382:Value,[])
link(Str2,1790314:getVar,[])
}
Add(Memory,11818382,553,49)
{
Default=String(x1sdiNenEjdQ)
}
Add(LineBreakEx,13262524,455,63)
{
Caption="login"
Type=2
}
Add(LineBreakEx,1790314,560,84)
{
Caption="pass"
Type=2
}
Add(LineBreak,442454,665,161)
{
Type=1
link(Data,12206786:Value,[])
Primary=[7507619,-203,-77]
}

карма: 0

0
Редактировалось 8 раз(а), последний 2022-10-14 13:42:35