Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

Re: lug-bg: system() problem


  • Subject: Re: lug-bg: system() problem
  • From: Peter Pentchev <roam@xxxxxxxxxxx>
  • Date: Wed, 27 Oct 2004 10:27:10 +0300

On Wed, Oct 27, 2004 at 10:08:33AM +0300, Peter Pentchev wrote:
> On Wed, Oct 27, 2004 at 09:44:19AM +0300, Dimitar Dimitrov wrote:
[snip аналог на snprintf("echo %s | smbclient -M %s", ...) ]
> > system("command")
> 
> А това, което всъщност искаш да направиш, е system(command), а не
> system("command")   :))
> 
> > Този инструмент ми трябва за да изпращам съобшения със самба до Windows 
> > машините през php интерфейс.
[snip]
> ...а всъщност не съм прав - и unquote
> може да се справи :)  Просто направи от PHP-то нещо като:
> 
>   system("unquote 1 /bin/echo ".bin2hex(msg).
>       " | unquote 2 /usr/bin/smbclient -M ".bin2hex(destination))
> 
> ...и няма да имаш нужда от външна програмка :)

Е, разбира се, ако не броиш самата unquote за външна програмка ;)

> Но ако го искаш съвсем просто и не съвсем сигурно (достатъчно дълго
> съобщение ще препълни този буфер от 50 байта), просто махни кавичките :)

И, разбира се, проблемът не е само в достатъчно дългото съобщение, а и в
това, че някой може за съобщението или за името на машината да напише
нещо, съдържащо точка-и-запетая или обратни апострофи или $променливи
или $(команди) или какво ли не още, и твоето инструментче просто ще ги
изпълни.  Това беше същинската причина да напиша unquote - точно
изпълнение на външни команди с untrusted user input от PHP интерфейс,
като в онзи случай беше особено важно нещо да не се счупи, защото 1. то
вървеше с административни права, и 2. сменяше пароли за електронна поща
:)

А като говоря за административни права..  В началото на програмата ти
има setuid(0); setgid(0).  Каква точно е целта на това?  Нали ти е ясно,
че ако тази програма се изпълни от акаунт, чието user ID *не* е 0, с
едно просто setuid(0) не можеш да се докопаш до uid 0?  Т.е. ако твоят
уебсървър изпълнява PHP скриптове като друг потребител, не root (а би
трябвало да прави точно това!), то това setuid(0) изобщо, ама изобщо
няма да ти помогне...  Ако случаят е такъв, бързо инсталирай sudo и се
научи да му ползваш конфигурацията с NOPASSWD за определени потребители
и определени команди - на теб май ти трябва само за unquote smbclient,
демек от PHP-то можеш да направиш:

  system("unquote 1 echo ".bin2hex(msg).
      " | sudo unquote 2 smbclient -M ".bin2hex(destination));

...и ако си указал за потребителя www (или apache, или http, или както
там е при твоята инсталация) да може да изпълнява като root командата
"unquote 2 smbclient -M [0-9A-Fa-f]*", без да задава парола, всичко ще
бъде наред! :)

Поздрави,
Петър

-- 
Peter Pentchev	roam@xxxxxxxxxxx    roam@xxxxxxxx    roam@xxxxxxxxxxx
PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint	FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
This sentence is false.

Attachment: pgpN2ODAQNZig.pgp
Description: PGP signature



 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.