hacking - alfredocentinaro.it https://www.alfredocentinaro.it/tag/hacking/ Sito personale di Alfredo Centinaro, ingegnere informatico, insegnante, musicista. Programmazione, appunti, esercizi, sistemi e reti, tpsit, esami di stato, arduino Fri, 10 Nov 2023 20:26:01 +0000 it-IT hourly 1 https://wordpress.org/?v=6.9.4 https://www.alfredocentinaro.it/wp-content/uploads/2022/01/logo_alfredocentinaro-150x150.png hacking - alfredocentinaro.it https://www.alfredocentinaro.it/tag/hacking/ 32 32 Esempio di SQL Injection in PHP (parte 2) https://www.alfredocentinaro.it/lezioni/php/esempio-di-sql-injection-in-php-parte-2/ Thu, 24 Jan 2019 17:24:47 +0000 https://www.alfredocentinaro.it/2019/01/24/esempio-di-sql-injection-in-php-parte-2/ Un altro esempio sull’argomento delle SQL Injection dopo l’articolo già visto precedentemente con la form di login che potete rileggere qui. Questa volta invece di compilare la form in modo malevolo, sfruttiamo una possibile vulnerabilità del PHP: il passaggio di parametri attraverso URL e la funzione GET[]. Predisponiamo una prova sfruttando il db precedente di ... Leggi tutto

L'articolo Esempio di SQL Injection in PHP (parte 2) proviene da alfredocentinaro.it.

]]>
Un altro esempio sull’argomento delle SQL Injection dopo l’articolo già visto precedentemente con la form di login che potete rileggere qui. Questa volta invece di compilare la form in modo malevolo, sfruttiamo una possibile vulnerabilità del PHP: il passaggio di parametri attraverso URL e la funzione GET[].

Predisponiamo una prova sfruttando il db precedente di cui useremo la tabella prodotti. Creiamo uno script php che possiamo chiamare prodotti.php

<?php
$mysql_host = 'localhost';
$mysql_user = 'test';
$mysql_pass = 'test';
$mysql_db = 'test';
/* Connessione e selezione del database */
$connessione = mysqli_connect($mysql_host,$mysql_user,$mysql_pass);
if(mysqli_connect_errno())
  die("Connessione non riuscita: " . mysqli_error($connessione));
$db_select= mysqli_select_db($connessione,$mysql_db);
if (!$db_select)
  die("Selezione del database non riuscita");

//passa il parametro via link http://127.0.0.1/prodotti.php?idp=1
$idp = $_GET["idp"];
$sql = "select codice, descrizione, prezzo from prodotti where idp = $idp ";
print $sql;
$res = mysqli_query($connessione,$sql) or die("Errore in check.php : " . mysqli_error($connessione));
while ($row = mysqli_fetch_array($res, MYSQLI_ASSOC))
{
  print "<div style=’margin-left:30px; margin-top:30px; width:400px; padding:30px; border: 1px solid brown; font-family:Helvetica’>";
  print "Scheda prodotto : <br>";
  print "CODICE: <b>{$row["codice"]}</b><br>";
  print "DESCRIZIONE: <b>{$row["descrizione"]}</b><br>";
  print "PREZZO: <b>{$row["prezzo"]}</b><br>";
  print "</div>";
}
?>

Come possiamo vedere, lo script semplicemente si collega al db, reperisce un prodotto e ne stampa le informazioni tabellate. Per esempio, potremmo lanciare lo script opportunamente piazzato nella directory del nostro server web con il seguente URL

http://127.0.0.1/prodotti.php?idp=1 equivalente a http://localhost/prodotti.php?idp=1

Questo potrebbe essere un link che si lancia da un’altra pagina in modo ingenuo. Un attaccante malevolo potrebbe provare ad inserire un frammento di codice sql malevolo come il seguente:

http://localhost/prodotti.php?idp=1 union select username, password, 0 from users;

Come possiamo vedere, il codice malevolo non opportunamente confinato crea un bug che permette all’attaccante di visualizzare le credenziali del nostro database! 

Come difenderci?

Esistono funzioni predefinite, ovviamente a prova di errore come mysqli_real_escape_string che eliminano alcuni caratteri non ammissibili come le virgolette, chiocciole, cancelletti. 

Un esempio di codice potrebbe essere il seguente:

$idp_sicuro = mysqli_real_escape_string($con, $_GET['idp']);

Altri sistemi utilizzatissimi sono sicuramente le funzioni:

$pulito = $trim($variabile); //toglie gli spazi
$piupulito = stripslashes($pulito); //toglie gli slash
$quasiperfetto = htmlspecialchars($piupulito); //toglie i caratteri malevoli, apici, &, < e >

Altri sistemi utilizzati per “ripulire” una variabile possono essere di controllare o forzare una tipologia di dato atteso da quella variabile. E’ indicato quando si sta passando con GET o POST un dato numerico, ad esempio action.php?idp=1234

//forzare il cast cast (int)$idp o intval($idp)
$idp = (int)$_GET["idp"]

oppure

if (is_numeric($_GET["idp"]))
    echo "ok è solo numero";

//oppure
if (is_numeric($_GET["idp"]) 
    echo "ok!";  

//oppure ancora
if ($idp > 0 || $idp <100) ... 

L'articolo Esempio di SQL Injection in PHP (parte 2) proviene da alfredocentinaro.it.

]]>
Esempio di SQL Injection in PHP (parte 1) https://www.alfredocentinaro.it/lezioni/php/esempio-di-sql-injection-in-php-parte-1/ Thu, 24 Jan 2019 08:14:39 +0000 https://www.alfredocentinaro.it/2019/01/24/esempio-di-sql-injection-in-php-parte-1/ Le SQL Injection sono un genere di attacco informatico molto semplice ma potenzialmente molto dannoso. Si basa su una vulnerabilità del codice ormai nota e nei sistemi software complessi quasi del tutto debellata a patto che lo sviluppatore abbia un pizzico di esperienza sull’argomento. L’idea è quella di inserire all’interno di testo che viene passato ... Leggi tutto

L'articolo Esempio di SQL Injection in PHP (parte 1) proviene da alfredocentinaro.it.

]]>
Le SQL Injection sono un genere di attacco informatico molto semplice ma potenzialmente molto dannoso. Si basa su una vulnerabilità del codice ormai nota e nei sistemi software complessi quasi del tutto debellata a patto che lo sviluppatore abbia un pizzico di esperienza sull’argomento.

L’idea è quella di inserire all’interno di testo che viene passato al database attraverso una interfaccia, ad esempio una form html, una stringa di testo con delle porzioni di testo che usano però la sintassi delle query SQL. In questo modo si inganna il db con una query malevola a restituirci un risultato non consono. Vediamo un esempio! Di seguito il codice e le istruzioni su come usarlo. Per test potreste provare ad usare le stesse istruzioni in fondo all’articolo su altri siti. Provatele da prima su qualche sito magari più artigianale, su quelli professionali o che usano CMS come Joomla e WordPress, sicuramente non avrete vita facile poiché hanno criteri e misure di controllo che annullano il rischio di tali vulnerabilità. Nei prossimi articoli vedremo alcuni elementi per scrivere codice resistente alle SQL Injection.

Creiamo una cartella sul nostro server Apache/WAMP gia predisposto ad usare PHP e possibilmente collegato gia con un PHPMyAdmin. Il codice è stato testato su Wamp 2.5 e su Linux Ubuntu 18, su versioni più vecchie potrebbero esserci delle noie con le funzioni del database (vedi msql vs msqli).

Predisponiamo 3 file/script ed una tabella su DBMSMySQL come la seguente. E’ banale e per il nostro test, inseriamo un campo password in chiaro, sapendo che non è una procedura convenzionale.

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(128) NOT NULL,
  `password` varchar(128) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `users` (`id`, `username`, `password`) VALUES
(1, 'pippo', 'pippo'),
(2, 'pluto', 'pluto'),
(3, 'test', 'test');

Il form.html e style.css con i rispettivi codici:

<!DOCTYPE html>
<html lang="it">
<head>
<title>Form di prova</title>
<meta charset="utf-8">
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>

<form method="post" action="sql.php">
<fieldset class="form1">
<legend>Anagrafica cliente</legend>

<label for="username">Nome:</label>
<input type="text" name="username" id="username" required size=30> <br /><br />

<label for="password">Password:</label>
<input type="password" name="password" id="password" required size=30> <br /><br />

<input type="submit" value="Invia"><!-- controlla ed invia-->
<input type="reset" value="Sbianca"> <!-- reset-->
</fieldset>
</form>

</body>
</html>

il foglio di stile in realtà è molto semplice ma ci permette di formattare le caselle di input della form in modo ordinato:

label
{
	width: 100px;
    display: table-cell;
    float: left;
}

e finalmente lo script PHP che viene lanciato dal submit della form inserita nella pagina HTML

<?php
error_reporting(E_ALL);

$mysql_host = 'localhost';
$mysql_user = 'test';
$mysql_pass = 'test';
$mysql_db = 'test';
/* Connessione e selezione del database */
$connessione = mysqli_connect($mysql_host,$mysql_user,$mysql_pass);
if(mysqli_connect_errno())
  die("Connessione non riuscita: " . mysqli_error($connessione));
$db_select= mysqli_select_db($connessione,$mysql_db);
if (!$db_select)
  die("Selezione del database non riuscita");
// recupero username
$u = $_REQUEST["username"];
$p = $_REQUEST["password"];
$sql = "select * from users where username = \"$u\" and password = \"$p\" ";
print "La query usata e': ".$sql ." <br><br>";
$res = mysqli_query($connessione,$sql) or die("Errore in check.php : " . mysqli_error($connessione));
$info_utente = "";
while ($row = mysqli_fetch_array($res, MYSQLI_ASSOC))
{
      $info_utente = $row;
}
if ($info_utente == "")
{
      print "Username o Password errati";
}
else
{
      print "Utente riconosciuto : ";
      print_r($info_utente);
}
?>

Come testiamo il nostro lavoro?

1. Proviamo prima di tutto ad inserire un utente e/o password di fantasia. Lo script ci stampa la combinazione inserita e segnala che l’autenticazione è fallita.

2. Proviamo invece ad inserire uno degli utenti validi. Ad esempio nel nostro db c’è l’utente pluto con password pluto. Lo script ci indica che l’utente è riconosciuto

3. Inseriamo una username valida come “pluto” mentre nella password inseriamo una stringa con una password di fantasia, ad esempio abc ma acui facciamo seguire una stringa SQL malevola con opportune virgolette ->  abc” or “1”=”1

In questo caso cosa stiamo dicendo al database: trovami un utente pluto che abbia password abc oppure che sia valida la condizione 1=1 

Ovviamente la condizione farlocca 1=1 è sempre verificata e quindi inganna il db a trovarci il record dell’utente pluto anche se non abbiamo inserito la password corretta!!!

L'articolo Esempio di SQL Injection in PHP (parte 1) proviene da alfredocentinaro.it.

]]>