Linux за българи: Форуми

Сигурност => Сигурност на кода => Темата е започната от: v01d в Jun 27, 2009, 14:17



Титла: php whois secure
Публикувано от: v01d в Jun 27, 2009, 14:17
Как може един прост код като този по-долу да се защити от сорта на
http://buggy-script.com/whois.php?domain=alabala.net;cat /etc/passwd
?
Код:
<?php

$domain=$_GET['domain'];

echo "<pre>";

system("whois $domain");

echo "</pre>";
?>


Титла: Re: php whois secure
Публикувано от: neter в Jun 27, 2009, 14:55
Например
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $domain=urlencode($_GET['domain']);
  4.  
  5. echo "<pre>";
  6.  
  7. system("whois $domain");
  8.  
  9. echo "</pre>";
  10. ?>
Въпрос на въображение ;)


Титла: Re: php whois secure
Публикувано от: ANTIADMIN в Jun 27, 2009, 15:44
Не разбирам много от пхп, но това би трябвало да работи:
system("whois $domain");
то
system("whois ", $domain);
Естествено трябва да се проверяват и други работи, например енв променливите, url,  големината на инф., с 2 думи всичко, което идва отвън :) Нека капацитетите да се изкажат, без да спамят.
p.s. в перл нещата са по-лесни :(


Титла: Re: php whois secure
Публикувано от: ivanatora в Jun 27, 2009, 16:21
p.s. в перл нещата са по-лесни :(
Езика няма значение.
Направи си един регулярен израз, с който да тестваш входните данни за непозволени символи. В случая всичко което може да се съдържа в $домейн са букви, цифри, точка, тире и долно тире.
php.net/preg_match


Титла: Re: php whois secure
Публикувано от: romeo_ninov в Jun 27, 2009, 19:06
p.s. в перл нещата са по-лесни :(
Езика няма значение.
Направи си един регулярен израз, с който да тестваш входните данни за непозволени символи. В случая всичко което може да се съдържа в $домейн са букви, цифри, точка, тире и долно тире.
php.net/preg_match
Долно тире? Забранено е използването му в имена на хостове и домейни!!!


Титла: Re: php whois secure
Публикувано от: gat3way в Jun 27, 2009, 19:29
Perl-аджиите нека си трошат главите с регулярни изрази. PHP си има escapeshellcmd() :)


Титла: Re: php whois secure
Публикувано от: laker в Jun 27, 2009, 19:38
Perl-аджиите нека си трошат главите с регулярни изрази. PHP си има escapeshellcmd() :)

$ perl -e '@args=qw(echo Hello;echo World);system(@args);'
Hello;echo World

Няма нужда :)


Титла: Re: php whois secure
Публикувано от: neter в Jun 27, 2009, 19:56
PHP си има escapeshellcmd()
Моето предложение с urlencode() е с 5 байта по-кратко :P Но твоето пък може да излезе с някоя и друга микросекунда по-бързо. Както и да е. Това са двата най-чисти варианта. Preg_match е бавен, дълъг и се рискува пропускане на вариант. Не е полезен в този случай.


Титла: Re: php whois secure
Публикувано от: neter в Jun 27, 2009, 21:14
Опа, какво си набарах... :) Нещо почвам да губя доверие към escapeshellcmd().
Да разгледаме следния сценарий. Скриптът за whois проверката се изписва с escapeshellcmd(). Допълнително, в скрипта е добавен такъв код за по-нагледно показване на клиента какво търси (част от украшенията на сайта)
Код
GeSHi (PHP):
  1. ...
  2. echo 'Информация за домейна <b>'.$domain.'</b><br><br>';
  3. ...
И скриптът се зареди по следния начин
Цитат
http://domain.com/whois.php?domain=<a href="proba">proba</a>
Някой сеща ли се как мога да използвам с користни цели това позволение на escapeshellcmd()? :)

Жокер: Не казвам, че задължително ще използвам тага <a>, макар че и той може да свърши някаква работа. И не става дума за манипулиране на сървъра, а за манипулиране на клиента, което може да ми помогне за манипулиране рейтинга на сайта, на който се намира скриптът.

P.S.0: Един вид манипулация на клиента може да се направи и с urlencode(), но вариантите се свеждат просто до написан текст и то не в прегледен вид.

P.S.1: Ако решите да отговаряте на задачата, гледайте да не давате цялостни завършени указания за манипулацията, тъй като ще влезете в нарушение на т.7 от правилата ($2) на форума.

edit: Помогнете и за намиране на по-сносна манипулация при използването на urlencode(). Невъзможни неща няма, а така ми седи някак незавършено :)


Титла: Re: php whois secure
Публикувано от: gat3way в Jun 27, 2009, 21:53
Идеята на escapeshellcmd е да филтрира кофти metacharacters, които евентуално биха отклонили изпълнението при викане на system() и компания. За "справяне" с HTML код е по-добре да се използва htmlentities(). И все пак не съм много убеден, че е практично по гореописаният начин да се осъществяват XSS атаки (за което предполагам намекваш). ОК, няма проблеми < да се escape-ва и да стане \<, обаче със затварящият тага > се чупят нещата.

Но иначе е възможно при дадени обстоятелства, примерно имаме:

Цитат
echo "Информация за домейна <a href='$domain'>$domain</b><br><br>";

тогава да речем можем да се пробваме да му предадем

Код:
' onmouseover=alert(/blabla/.source);

и вероятно ще мине номера.

Иначе да, urlencode е по-идейно.


Титла: Re: php whois secure
Публикувано от: neter в Jun 27, 2009, 22:48
Точно за XSS атаки става дума [_]3 Естествено, няма да мине каквато и да е XSS атака, но с малко въображение могат да се постигнат добри резултати. Javascript, подобен на onmouseover, го изключваме като вариант, тъй като escapeshellcmd() ще сложи наклонени черти пред скобите, символа точка и запетая, и единичната кавичка в началото (тъй като е сама). При това се надяваме програмистът да не е сложил допълнителни обработки на съдържанието на променливата $domain, като htmlentities(), urlencode(), preg_match(), addslashes() и други.


Титла: Re: php whois secure
Публикувано от: v01d в Jun 29, 2009, 00:18
Благодаря на всички за полезните отговори.