[php] Shell exec met parameters

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ik heb een php programma dat via het commando shell_exec een c programma zou moeten aanroepen, dit programma verwacht bij de aanroep een getal tussen 0 en 255.

Nu is het probleem dat de uitvoering van shell_exec maar niet lukt met parameters, verbouw ik het programma zodat hij het uitvoert zonder parameters dan doet hij het wel succes vol, dus het probleem zit hem in de parameters.

Ik doe het zo:

code:
1
2
3
 $test=shell_exec("./kernel".$dec."");
 ook heb ik al geprobeerd:
 $test=shell_exec("./kernel $dec ");


Geen enkele van de in mij denkbare methodes werken.

Werkt shell_exec wel met parameters en zoja hoe dan?

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

De waarde van $dec lijkt me wel relevant in deze :) . En volgens mij wordt op de manual page aangegeven dat paramaters gewoon gebruikt worden. Het probleem zit hem dan ook denk ik niet zozeer in je PHP code, maar meer in de string die naar de shell wordt gestuurd.

DM!


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
in $dec zit dus het getal tussen 0 en 255.

Als ik hem aanroep via shell_exec("./kernel '255'");

doet hij het ook niet.

Het is trouwens onder linux..

Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
als ik nu shell_exec("./kernel 128") or die("Kan niet uitvoeren"); doe dan zegt hij dus effectief kan niet uitvoeren. Ik begin me al meer en meer af te vragen of php wel gecompiled is met shell_exec, weet iemand waar ik dit kan zien? (moet dit gewoon in phpinfo() staan?).

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Safe mode moet iniedergeval niet aan staan :) . Ook mag disable functions niet shell_exec bevatten, wat in de php.ini zou staan, en je ook terug kan vinden via phpinfo().

DM!


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Daar staan ze niet in dus hij zou het normaal moeten kunnen uitvoeren..

Acties:
  • 0 Henk 'm!

  • FTPlus
  • Registratie: Februari 2003
  • Laatst online: 10-11-2024

FTPlus

Pluisje

Probere anders even:
PHP:
1
$test=shell_exec("./echo $dec ");


Als dat niks op levert moet er ergens haast wel een directive zijn die shell executions uitschakeld.
Als dit wel weer werkt is er misschien iets mis met je C-applicatie :)

-=Waiz=-


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ik weet niet wat het moet opleveren, maar ik krijg dus een wit scherm te zien.

Er zit dus ergens iets niet snor in mijn instellingen neem ik dan aan?

Maar waar moet ik ergens gaan zoeken?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

bibawa schreef op zondag 02 april 2006 @ 22:06:
Ik weet niet wat het moet opleveren, maar ik krijg dus een wit scherm te zien.
Je zou de waarde van $dec in de variabele $test gekopiëerd moeten krijgen.
Er zit dus ergens iets niet snor in mijn instellingen neem ik dan aan?

Maar waar moet ik ergens gaan zoeken?
Safe mode. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:10

Robtimus

me Robtimus no like you

-NMe- schreef op zondag 02 april 2006 @ 22:11:
Je zou de waarde van $dec in de variabele $test gekopiëerd moeten krijgen.
Als je die print wel ja ;)

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zei dan ook dat die waarde gekopiëerd wordt in de variabele $test, niet dat ie weergegeven wordt. :P

Doet dit trouwens wel wat?
PHP:
1
$test = shell_exec('./kernel 12');

...of om helemaal l33t te doen (:P):
PHP:
1
$test = `./kernel 12`;


Als het met deze regels wel gewoon doet wat je verwacht dan heeft $dec gewoon niet de goeie waarde. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ja ik print ze natuurllijk wel af, dat had ik ook al door..

Als ik phpinfo(), nogmaals doe dan zie ik daar staan : safeMode:OFF;

Het is wel de mod_php versie die ik in gentoo heb gemerged, ik weet niet of er alles in zit maar ik dacht het wel...
Als safeMode afstaat, en er in php.ini er bij de disable functions nergens exec ofzo bijstaan dan is er toch iets anders niet pluis.

Dit is trouwens mijn php code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
       mysql_connect("localhost","***","***") or die("Kan de database server niet vinden");
    mysql_select_db("tuinberegening") or die("Kan de database niet selecteren");

    $f=fopen("/var/www/localhost/htdocs/test.txt","w");
    
    $tijd=date("H:i");
    fwrite($f,$tijd."\n");
    $output="";
    $qryAansturing="SELECT * FROM zones ORDER BY id ASC";
    $resAansturing=mysql_query($qryAansturing);
    while($a=mysql_fetch_array($resAansturing)){
            $waarde=-1;
        $qryVelden="SELECT * FROM velden WHERE zonenr='".$a['id']."'";
        $resVelden=mysql_query($qryVelden);
        while($v=mysql_fetch_array($resVelden)){
            if($v['tijd']==$tijd){
                if($v[stop]==1){
                  $waarde=0;
                }else{
                   $waarde="1";    
                }
            }
        }
        if($waarde==-1){
            $waarde=0;
        }
       $output.=$waarde;    
    }
    $output.="000";
    echo($output);
      $dec=0;    
      $n = strlen($output) - 1;
      $k=0;
      for($t=7;$t>=0;$t--){
    
        $x = substr($output, $t, 1);    
    if($x=="1"){
        
        $dec+=pow(2,$k);
    }
    $k++; 
     }
         exec("./kernel 128");
      echo("<p>".$dec);
?> 


En dit de c code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>

#define base 0x378           /* printer port base address */

main(int argc, char **argv)
{                    
  int value;

  if (argc!=2)
    fprintf(stderr, "Error: Wrong number of arguments. This program needs one argument which is number between 0 and 255.\n"), exit(1);
  if (sscanf(argv[1],"%i",&value)!=1)
    fprintf(stderr, "Error: Parameter is not a number.\n"), exit(1);
  if ((value<0) || (value>255))
    fprintf(stderr, "Error: Invalid numeric value. The parameter number must be between 0 and 255\n"), exit(1);
  if (ioperm(base,1,1))
    fprintf(stderr, "Error: Couldn't get the port at %x\n", base), exit(1);

  outb((unsigned char)value, base);
}


Met die code kan ik bepaalde pinnen van mijn lpt poort hoog en laag zetten.

Het c programma werkt perfect, als ik via commandline ./kernel waarde invoer dan doet het ding perfect wat ik ervan verwacht dat het doet.. Het zit hem dus echt in de php code en nog meer in die exec().

[ Voor 86% gewijzigd door bibawa op 02-04-2006 22:45 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En als je het volledige pad naar die kernel-executable opgeeft?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
En misschien execute rechten toekennen voor de user waaronder php draait (je weet nooit natuurlijk ;) ). Verder weet ik niet wat de standaardinstellingen van gentoo zijn, maar het kan zijn dat de apache user helemaal geen shell heeft...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ben de wanhoop bijna nabij:

M'n apache ondersteund wel degellijk shell_exec, als ik shell_exec('dir'); doe dan krijg ik wel degellijk te zien in welke map hij zit, dus dat werkt.

PROBLEEM: Het probleem zit hem volledig in de aanroep van het c programma als je het mij vraagt, de c code werkt perfect als ik hem in terminal uitvoer.

Heb ook al eens geprobeerd het volledige pad mee te geven maar dat gaat niet, via dir ben ik te weten gekomen dat ik in de juiste directory zit op de server.

Hoe kan ik dit oplossen? Hoe roep ik een .c programma feilloos aan?

Groeten,

Bibawa

Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Volgens mij zit het hem in dat php niet genoeg rechten heeft om het .c programma uit te voeren (heeft root rechten nodig om poort aan te spreken). Maar zou ik dit kunnen aanpassen? En zoja waar dan?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik denk dat je wat die laatste vraag betreft beter even een topic kunt openen in Non-Windows Operating Systems. Rechtenconfiguratie heeft verder vrij weinig met programmeren te maken, maar als ik dit topic naar NOS zou kopiëren wordt het zaakje er voor de mensen daar ook niet duidelijker op. Open dus even een nieuw topic in NOS waarin je die laatste vraag stelt. Mocht dat de oplossing niet zijn, dan kun je altijd hier verder kijken of het aan je code ligt. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
bibawa schreef op maandag 03 april 2006 @ 18:47:
Volgens mij zit het hem in dat php niet genoeg rechten heeft om het .c programma uit te voeren (heeft root rechten nodig om poort aan te spreken). Maar zou ik dit kunnen aanpassen? En zoja waar dan?
Aangezien je (nog) geen ander topic hebt. Om de rechten te controleren kun je in eerste instantie de -l optie van ls gebruiken:
code:
1
2
3
4
5
user@box:~$ ls -l
-rwxr--r--   1 user group     17560 2005-10-09 19:35 bpmcount
-rwxr-----   1 user group      2566 2006-03-22 11:11 class.urlhandler.php
drwxr-xr-x   6 user group      4096 2006-03-12 05:40 data
user@box:~$

De eerste 10 karakters geven de rechten weer die gebruikers hebben op elk bestand. Het eerste teken geeft een speciale status aan. De 'd' in bovenstaand voorbeeld geeft aan dat het om een directory gaat. De overige 9 tekens geven respectievelijk voor de eigenaar, groep en anderen aan wat er mag. read voor lezen, write voor schrijven en execute voor uitvoeren.
Om vanuit PHP de executable uit te voeren moet de gebruiker waaronder PHP (apache) runt dus execute rechten hebben op het bestand. Om er zeker van te zijn dat hier het probleem niet ligt kun je (tijdelijk) met "chmod 755 bestandsnaam" iedereen het recht geven om het programma uit te voeren. (Aangezien het aansturen van de parallelle poort een proces is waar je toch wat controle over wil hebben zou je er later beter aan doen om er een groep voor in te stellen. Hieraan kun je dan de users toevoegen die er ook wat mee moeten kunnen)

Gezien het karakter van de parallelle poort - je hebt er maar 1 van, en als daar 2 gebruikers tegelijk data heen schrijven kunnen er verrassende zaken gebeuren... - lijkt het me niet onwaarschijnlijk dat in een default config alleen de root user dat mag. Het zou dus kunnen zijn dat het nog niet werkt, ook al staan de rechten op het programma wel goed. Uit het hoofd zijn er zo 3 oplossingen mogelijk:
  1. Je past de totale configuratie aan om de root restrictie op te heffen (imho het slechtste plan)
  2. Je maakt de executable SUID root. Hierdoor wordt het programma altijd als root uitgevoerd, ongeacht welke user het aanroept.
  3. Je gebruikt sudo om een normale user (in dit geval de apache user) het programma met root privileges te laten uitvoeren.
De SUID oplossing is waarschijnlijk het snelst voor elkaar, maar afhankelijk van waarvoor je de machine gebruikt kan het de moeite waard zijn om sudo op te zetten. Op een multi-user systeem kan dat zorgen voor betere beveiliging en een beter overzicht wie precies wat mag...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Bedankt voor de hulp, maar het werkt nog niet, als ik alles chmod naar 777 doet hij het ook nog niet.

Wat me wel opvalt:

de eigenllijke c kode (kern) wordt uitgevoerd onder "root".
De phpcode die instaat voor de aanroep van de c code wordt uitgevoerd onder de user "ftpgebruiker" uit de groep "ftpgroep".

Hier zou het probleem wel eens kunnen liggen, ik open alvast een topic in NOS.
Pagina: 1