PDA

Просмотр полной версии : Шифруем php скрипт с помощью пароля


Dr.Z3r0
11.11.2007, 22:25
Вообщем может народ сразу не догнал поясню. Данный скрипт шифрует любой php скрипт с помощью пароля без которого вы ни запустите скрипт, ни почитаете его сорцы(Я думаю вы поняли отличие от Зенда)...
Зачем? Ну собственно я это писал на заказ для того чтобы зашифровать админ панель одного типа, удобно знаете ли ведь пасс впринципе то нигде не хранится, и если найти его, то только перебором, что также весьма проблематично :))
А вариантов масса для того же криптования веб-шелла и вроде как и антивирь не учует, и без пасса ваш веб шел никто не заюзает...или создание чего то типа контейнера с БД какого нить похеканного сайта..вообщем сами придумаете...

Я думаю многим пригодится. Вот собсно сам скрипт для шифрования:
<?php
function crypting($str,$pas){
$sum_pas=0;
for($i=0;$i<strlen($pas);$i++)$sum_pas+=ord($pas[$i]);
$intp=0;
$crypt_str='';
for($i=0;$i<strlen($str);$i++){
$new_str[$i]=ord($str[$i])+(($sum_pas+ord($pas[$intp]))%255);
if($new_str[$i]<100)$crypt_str.='0'.$new_str[$i];
else $crypt_str.=$new_str[$i];
if($intp===strlen($pas)-1)$intp=0;
else $intp++;
}
return $crypt_str;
}

$set['version']='1.0';
$set['comment_cop']=true;
$set['key_name']='key';

if((!empty($_POST['file']))&&(!empty($_POST['pass']))){
$fff=$_POST['file']; $new_file=gzuncompress(base64_decode('eJxtUEFuwjAQ PAeJP/hgFG8dIBBxavclKEIQnNZS6kS2o6qq+HttJwFHcLF2Z2fGu7Nc 1L2qrGwVqfRvZ6X6ZNRYndHubOBvuUhkzVzfCBVwICtSIOZhlF CpbIf5e6iV+Dk5Bqbp0Jv+++RMxnHdakala6j8mPz8F67nHCYy x1Zfw+BIZQlPytkq22JUh10S2jZXv4BXoukvrhxOKd6ozIrBzJ 8TE495iYhpnsJLeYRlu2w/esyo1dect2bsfk10jAuqBFjtDweYXMbANhjLH1uGbBHjsNY7iC NPRGMECQjnAbn5Rwvba0Umfz9w+O0f5g2Nsw==')).'
if(!empty($_GET["'.$set['key_name'].'"]))eval(crypting("'.crypting($fff,$_POST['pass']).'",$_GET["'.$set['key_name'].'"]));';
$new_file='<?php '.($set['comment_cop']?'
//=============================================//
//Created by PHPCryptor V '.$set['version'].' ((c) by I-I()/Ib)//
//=============================================//':'').'
eval(gzuncompress(base64_decode("'.base64_encode(gzcompress($new_file)).'")));
?>';
echo('<pre>'.htmlspecialchars($new_file).'</pre>');
}else{
echo('<html>
<head><title>Created by PHPCryptor V '.$set['version'].' ((c) by I-I()/Ib)</title><head>
<body>
<form method="post">
<input type="password" name="pass" value="">:Пароль каким будет широваться файл<br>
Php фйал:<br>
<textarea name="file" cols="30" rows="7"></textarea><br>
<input type="submit" value="Зашифровать">
</form>
</body>
</html>');
}
?>
Как юзаем. Забиваем пароль и в другое поле собственно все тело шифруемого скрипта(без <?php и ?>). Затем полученный код сохраняем и юзаем как http://site/script.php?key=[пароль] ну и собсно все...
В результате шифрования паролем 131 вот этого файла<?php
echo('Hello world');
?>Получаетсо:<?php
//=============================================//
//Created by PHPCryptor V 1.0 ((c) by I-I()/Ib)//
//=============================================//
eval(gzuncompress(base64_decode("eJxtUdtOg0AQfaZJ/wHJNrCCujsrtKTuo/EHfGuaprZb3UiBcNE0xn93dgsVoskEZs6cc5gZppNDm+8aXeTu rjqVjc5fA1I3VUTKbU2/phNHHwKsM5VbnLozV0jJbMshOm9KyZY2z9XnBhnS98913R43aN K1D0UVEI0F0Q+9n/kE1mFIe3Ioi2pvGyui1/SPcjTKnejUdhaHFNneDGCUsm5fMD2vIq6JjsTZzKwzJK7YWkrp M5/+Kx9gEY+g8xhRd29j3k0QXLYZLIOHWlM6gzimvUt3sFs5lP9Oa W8r5fBYN5wOT+6orFauRcLQIt/mUammrXK39zcNxDHQ9Uody+YUkM3T4/PKe1cnD6dSH9ssuPx+DxIOCUC8wERwEAwEZ8AFsAWkKYZBWAr3 +JrDnAnGBUtMcMMWfI6JFSJoOSKFOAXsokMiIGHWXKCtNQeket F4puUPs862iQ==")));
?>Да я согласен размеры несколько отличаются, но это для маленьких скриптов, а так вроде отношение старого и нового объемов как 2 к 3...

Sov1et
13.11.2007, 00:29
Прикольно... Наверное найду применение ;)

DWORD
13.11.2007, 14:21
Ну смотри. У тебя там есть такая функция, расшифровывающая пароль:

function crypting($str,$pas){
if(strlen($str) % 3==0){
$intp=0;
$new_str='';
$sum_pas=0;
for($i=0;$i<strlen($pas);$i++)$sum_pas+=ord($pas[$i]);
for($i=0;$i<(strlen($str)/3);$i++){
$old_str[$i]=substr($str,3*$i,3);
if($old_str[$i][0]==='0')$old_str[$i]=substr($old_str[$i],1,2);
$old_str[$i]=chr($old_str[$i]-(($sum_pas+ord($pas[$intp]))%255));
$new_str.=$old_str[$i];
if($intp===strlen($pas)-1)$intp=0;
else $intp++;
}
return $new_str;
}
}
Согласно твоему алгоритму, в исходном тексте есть две предопределенные последовательности.
Вначале это: "?>" или с большой вероятностью "?><? ", "?><?php " и пр. похожие варианты.
Вконце это: "<?php " или с большой долей вероятности "?> <?php ", "php?> <?php " и пр. похожие варианты.

Вот так можно попробовать восстановить пароль:

Внимание на строку в дешифрующей функции:
$old_str[$i]=chr($old_str[$i]-(($sum_pas+ord($pas[$intp]))%255));
Нам известны несколько символов исходного текста в начале строки, допустим их 7 ("?><?php"). Назовем код iого символа этой строки бувой С (old_str[$i] из левой части), old_str[$i] из правой части тоже известно (это кусочек шифротеста), назовем его А, $summ_pass это сумма кодов всех символов пароля, назовем ее Х, а ord($pas[$intp]))%255 назовем Y. Из этой строки можно получить такое уравнение:
255*n + С = А - Х - У
группируем известные и неизвестные:
Х + У + 255*n = Q

Где Q = A - C - известно
Это уравнение с тремя неизвестными, каждое неизвестное является целым числом.

Аналогичное уравнение можно получить для каждого из 7и начальных символов шифротекста:

X + Y1 + 255*n1 = Q1
X + Y2 + 255*n2 = Q2
X + Y3 + 255*n3 = Q3
...
X + Y7 + 255*n7 = Q7

В действительности n1...n7 могут принимать только до двух различных значений - n или m (потому что добавление кода одного символа к числу может варьировать целочисленное частное этого числа от деления на 0xFF только лишь в пределах двух значений), количество возможных вариантов матрицы такой системы 2^7.

На самом деле Х это сумма всех Yi где i = 1..Длина_пароля.

С учетом этих замечаний, можно сделать вывод, что пароль длиной не больше 5 символов однозначно восстанавливается из этой системы, т.к. все n1..n7 сводятся к n и m, в итоге получается система из 7 уравнений не больше чем при 7 неизвестных (как решать такие системы, недавно обсуждалось в разделе "написания программ на "С/С++, C#, Delphi, .NET, Asm"). Верность подобранного пароля длиной 5 символов проверяется на последних символах шифротекста, соответствующих так же известным символам исходного текста. Верность пароля длиной меньше 5 символов автоматически проверяется при решении СЛАУ.

Если пароль больше 5 символов, то нужно сделать следущее:
1) Задаться длиной пароля (в цикле она будет перебираться)
2) Пройтись по шифротексту и определить какие по номеру символы пароля участвовали в конце шифротекста при его шифровании (интересуют символы предопределенной конечной последовательности). Включить в СЛАУ эти символы
3) Решить СЛАУ, получив набор независимых решений
4) Устроить перебор независимых решений, получая на их основе зависимые. Анализ дешифрованного текста при этом можно проводить на соответствие печатным символам и на поиск ключевых слов языка PHP.

Вот такой вот небольшой "криптоанализ" позволяет расшифровывать файлы, полученные твоим скриптом!

Dr.Z3r0
13.11.2007, 15:28
Ну вот хотел как лучше а получилось как всегда :((
Ну а теперь как? всмысле без "предопределенной последовательности"?

DWORD
13.11.2007, 16:03
Ну вот хотел как лучше а получилось как всегда :((
Ну а теперь как? всмысле без "предопределенной последовательности"?
Просто надо взять алгоритм шифрования по-сложнее. А предопределенные последовательности вынести из шифруемого текста, хотя при хорошем алгоритме шифрования это необязательно.