Seguridad en aplicaciones Web

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

2 comments

Comments 1 - 2 of 2 previous next Post a comment

Post a comment
Embed Video
Edit your comment Cancel

3 Favorites

Seguridad en aplicaciones Web - Presentation Transcript

  1. Seguridad web en aplicaciones Rails Ernesto Jiménez Caballero ernesto.jimenez@negonation.com
  2. Sobre esta charla
  3. ¿De qué vamos a hablar?
  4. SQL Injections
  5. SQL Injections class User < ActiveRecord::Base   def self.authenticate(login, password)     return User.find(:first, :conditions => \"login = '#{login}' AND  crypted_password = '#{encrypt(password)}'\")   end end User.authenticate(\"blabla' OR 'x' = 'x') OR ('x' = 'x\", 'lo_que_sea') # => SELECT * FROM users WHERE        (login = 'blabla' OR 'x' = 'x') OR       ('x' = 'x' AND crypted_password = '4123oijsjdir32josidjr032')       LIMIT 1; User.authenticate(\"blabla' OR admin = 1) OR ('x' = 'x\", 'lo_que_sea') # => SELECT * FROM users WHERE       (login = 'blabla' OR admin = 1) OR       ('x' = 'x' AND crypted_password = '4123oijsjdir32josidjr032')       LIMIT 1;
  6. SQL Injections class User < ActiveRecord::Base   def self.authenticate(login, password)     return User.find(:first, :conditions => [       \"login = ? AND crypted_password = ?\",       login, encrypt(password)     ])   end end class User < ActiveRecord::Base   def self.authenticate(login, password)     return User.find(:first, :conditions => {       :login => login, :crypted_password => encrypt(password)     })   end end
  7. :conditions => “x = #{x}” deja que Rails escape los parámetros de las consultas
  8. Asignación masiva
  9. Asignación masiva class UsersController < ApplicationController   def create     @user = User.create(params[:user])   end end <% from_for :user, :url => users_path do |f| %>   <label>email:     <%= f.text_field :email %>   </label>   <label>password:     <%= f.text_field :password %>   </label>   <%= submit_tag 'Registrarse' %> <% end %>
  10. Asignación masiva class UsersController < ApplicationController   def create     @user = User.create(params[:user])   end end
  11. Asignación masiva class UsersController < ApplicationController   def create     @user = User.create(params[:user])   end end post :create, :user => {    :email => 'usuario@ejemplo.com',    :password => 'xxxx'} # => Usuario creado con los parámetros del formulario post :create, :user => {    :email => 'usuario@ejemplo.com',     :password => 'xxxx',    :admin => true} # => Escalada de privilegios!
  12. Asignación masiva class User < ActiveRecord::Base   has_many :posts end class Post < ActiveRecord::Base   belongs_to :user end post :create, :user => {    :email => 'usuario@ejemplo.com',    :password => 'xxxx',    :post_ids => [1,2,3]} # => Se proclama autor de los posts 1, 2 y 3!
  13. Asignación masiva class User < ActiveRecord::Base   attr_protected :admin end user = User.new(   :email => 'usuario@ejemplo.com',   :password => 'xxxx',   :admin => true) user.admin # => false user.attributes = {   :email => 'nuevo_email@ejemplo.com',   :admin => true } user.admin # => false user.admin = true user.admin # => true
  14. Asignación masiva class User < ActiveRecord::Base   attr_accessible :email, :password end user = User.new(   :email => 'usuario@ejemplo.com',   :password => 'xxxx',   :admin => true) user.admin # => false user.attributes = {   :email => 'nuevo_email@ejemplo.com',   :admin => true } user.admin # => false user.admin = true user.admin # => true
  15. attr_protected attr_accessible no introduzcas vulnerabilidades por olvidos
  16. Cross Site Scripting
  17. Cross Site Scripting <div class=\"comentario\">   <%= @comment.body %> </div> post :create, :comment => { :body => \" <script>   /* Javascript malintencionado */ </script> \" } # => <div class=\"comment\">        <script>          /* Javascript malintencionado */        </script>      </div>
  18. Cross Site Scripting <div class=\"comentario\">   <%= sanitize @comment.body %> </div> post :create, :comment => { :body => \" <script>   /* Javascript malintencionado */ </script> \" } # => <div class=\"comment\">        &lt;script>          /* Javascript malintencionado */        &lt;/script>      </div>
  19. Cross Site Scripting <div class=\"comentario\">   <%=h @comment.body %> </div> post :create, :comment => { :body => \" <script>   /* Javascript malintencionado */ </script> \" } # => <div class=\"comment\">        &lt;script&gt;          /* Javascript malintencionado */        &lt;/script&gt;      </div>
  20. sanitize Funciona con listas negras y no lo detecta todo
  21. h bueeeeno, pero... ¿qué pasa si te olvidas uno? ¡¡¡es muy fácil olvidarse una letra!!!
  22. sanitiza antes de guardar
  23. Cross Site Request Forgery
  24. Cross Site Request Forgery <img src=”http://web.com/nuevo_pass?pass=robado” />
  25. Cross Site Request Forgery No es un problema en Rails 2.0
  26. Accesos no autorizados
  27. Accesos no autorizados class DraftsController < ApplicationController   def show     @draft = Draft.find(params[:id])   end   def destroy     @draft = Draft.destroy(params[:id])   end end # => Cualquier usuario puede ver y eliminar los borradores
  28. Accesos no autorizados class DraftsController < ApplicationController   def show     @draft = current_user.drafts.find(params[:id])   end   def destroy     @draft = current_user.drafts.destroy(params[:id])   end end # => Solo el autor del borrador puede verlos y borrarlos
  29. Acciones públicas
  30. Acciones públicas # Ejemplo muy chorra :) class UsersController < ApplicationController   def invite     current_user.invitations.create(params[:email],)     send_email   end      def send_email     UserMailer.deliver_email(params[:email], params[:body])   end end get :send_email,     :email => 'cualquiera@spam.es',     :body => 'Compra V14GR4! http://www.pastillitaazul.com' # => El código de send_mail se ejecuta aunque luego de error
  31. Acciones públicas # Ejemplo muy chorra :) class UsersController < ApplicationController   def invite     current_user.invitations.create(params[:email],)     send_email   end    protected   def send_email     UserMailer.deliver_email(params[:email], params[:body])   end end
  32. algunos consejos
  33. jamás te fíes de lo que recibes en el servidor
  34. ten cuidado con los datos que recibes, pero también con los que envías
  35. controla las interfaces de tus cotroladores y modelos
  36. no filtres con listas negras
  37. no tengas miedo de escribir tests que prueben la seguridad   def test_should_avoid_xss_from_search_query     get :search, :q => '<script id=\"injection\">alert();</script>'     assert_no_tag :script, :attributes => {:id => 'injection' }   end
  38. algunas herramientas
  39. FireBug
  40. Cookie Editor
  41. Tamper Data
  42. CURL
  43. WWW::Mechanize
  44. require 'rubygems' require 'mechanize' agent = WWW::Mechanize.new page = agent.get 'http://www.gmail.com' form = page.forms.first form.Email = '***your gmail account***' form.Passwd = '***your password***' page = agent.submit form page = agent.get page.search(\"//meta\").first.attributes['href'].gsub(/'/,'') page = agent.get page.uri.to_s.sub(/\\?.*$/, \"?ui=html&zy=n\") page.search(\"//tr[@bgcolor='#ffffff']\")  do |row|   from, subject = *row.search(\"//b/text()\")   url = page.uri.to_s.sub(/ui.*$/, row.search(\"//a\").first.attributes[\"href\"])   puts \"From: #{from}\\nSubject: #{subject}\\nLink: #{url}\\n\\n\"   email = agent.get url   # .. end
  45. ¿Preguntas?

+ Ernesto JiménezErnesto Jiménez, 2 years ago

custom

5679 views, 3 favs, 5 embeds more stats

Diapositivas de la charla sobre seguridad en aplica more

More info about this document

© All Rights Reserved

Go to text version

  • Total Views 5679
    • 5410 on SlideShare
    • 269 from embeds
  • Comments 2
  • Favorites 3
  • Downloads 82
Most viewed embeds
  • 132 views on http://www.lacoctelera.com
  • 80 views on http://blog.negonation.com
  • 28 views on http://ernesto-jimenez.lacoctelera.net
  • 28 views on http://blog.ernesto-jimenez.com
  • 1 views on http://static.slideshare.net

more

All embeds
  • 132 views on http://www.lacoctelera.com
  • 80 views on http://blog.negonation.com
  • 28 views on http://ernesto-jimenez.lacoctelera.net
  • 28 views on http://blog.ernesto-jimenez.com
  • 1 views on http://static.slideshare.net

less

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

Cancel
File a copyright complaint
Having problems? Go to our helpdesk?

Categories