Mastermindzh

User input saniteren + Hearthbleed in simpel Nederlands

Apr 18th, 2014
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.12 KB | None | 0 0
  1. Soon to be blog 1:
  2.  
  3.  
  4. Waarom ik een blogpost schrijf terwijl mijn blog nog "under construction" is?
  5. Omdat ik veels te vaak een van de volgende vragen krijg:
  6. - "Is het saniteren van user input nu echt zo belangrijk"
  7. - "Welke inputs moet ik saniteren?"
  8. - "Waarom kan ik niet gelijk uit de $_GET lezen"?
  9. maar vooral omdat iedereen het heeft over de openssl bug "heartbleed"
  10.  
  11. Hoe kwam ik erop om vandaag de blog te schrijven?
  12. Eerder vandaag heeft een of andere "handige Joris" geprobeerd op Mi-Soft.nl misbruik te maken van het e-mail formulier.
  13. Dit door te proberen code te injecteren in de website. Dit is hem / haar echter niet gelukt omdat ik de
  14. user input afvang en controleer op narigheid (sanitize).
  15. Had ik dit niet gedaan dan had deze "handige Joris" zijn testscript met succes kunnen uitvoeren.
  16.  
  17. Een voorbeeld van een "injectie" is als volgt:
  18.  
  19. - 1' or '1'='1'
  20. Deze injectie wordt gebruikt om in te loggen op een pagina waar de "hacker" geen toegang toe zou moeten hebben. Deze injectie werkt op niet gesaniteerde inlogvelden vrijwel altijd. Dit omdat de gehele query als volgt wordt:
  21.  
  22. -- Select * from members where name = 'username' and password = '1' or 1=1
  23.  
  24. Deze query geeft ALTIJD een positieve reactie.
  25. De naam en het wachtwoord doen er niet toe want we zeggen tegen de database:
  26. selecteer alles waar de naam "username" is en het wachtwoord "1" of als 1 gelijk is aan 1. Zoals u ziet is dat laatste stukje cruciaal! 1 is altijd gelijk aan 1!
  27. De "hacker" zal dan ook in kunnen loggen op andermans account.
  28.  
  29. ====== Hearthbeat bug (heartbleed)
  30. Dan komen we bij de grote openssl bug heartbleed (ja dit hele verhaal lijd nog tot iets productiefs!), zelfs een groot project zoals openSSL heeft nog wel eens last van een niet gesaniteerde user input!
  31.  
  32. Ok ok.... ik overdrijf misschien een (klein) beetje.
  33. Ik zal in normaal Nederlands even uitleggen hoe heartbeat(de echte naam van de functie) werkt.
  34.  
  35. Heartbeat is eigenlijk een super simpel ding. Iemand stuurt een pakketje, een server ontvangt en leest dat pakketje, en vervolgens stuurt de server een reactie. Normaliter stuurt een applicatie of website dit pakketje. En in dat geval wordt het pakketje keurig opgemaakt en verstuurd.
  36.  
  37. Het probleem zit hem echter in de opbouw (en afvang) van zo'n pakketje.
  38. Het pakketje is namelijk opgebouwd uit een aantal stukjes. Voor het gemak zeggen we even dat het pakketje bestaat uit 2 stukjes(dat is niet zo):
  39. - Een nummer
  40. - Het bericht
  41.  
  42. Als we een normaal pakketje sturen met een bericht (payload) van 2 woorden dan zouden we het pakketje als volgt opmaken:
  43. 2|woord woord
  44. In dit geval stelt de | de scheiding tussen het nummer en het bericht voor.
  45. De server ontvangt dit dan en voert de volgende stappen uit:
  46.  
  47. * ontvang pakketje
  48. * lees hoeveel woorden (2)
  49. * lees woorden
  50. * maak antwoord op
  51. * kopieer nummer voor aantal woorden uit het geheugen
  52. * kopieer [insert nummer](2) woorden uit het geheugen
  53.  
  54. Niks mis mee, de applicatie krijg netjes weer een pakketje terug met de volgende inhoud:
  55. 2|woord woord
  56.  
  57. Maar nu ga ik, als de superhacker die ik ben, zo'n heartbeat pakketje maken.
  58. Echter ben ik een "bad guy" en ga ik me dus niet aan de regels houden.
  59. Ik vul als nummer namelijk "256" in en stuur lekker maar 1 woord mee.
  60. Het pakketje ziet er dus als volgt uit:
  61. 256|woord
  62.  
  63. Nu doet de server de volgende stappen weer:
  64. * ontvang pakketje
  65. * lees hoeveel woorden (256)
  66. * lees woorden
  67. * maak antwoord op
  68. * kopieer nummer voor aantal woorden uit het geheugen (nog steeds 256)
  69. * kopieer [insert nummer](256) woorden uit het geheugen
  70.  
  71. Ik had echter maar 1 woord meegestuurd dus de server kan onmogelijk MIJN 256 woorden uit het geheugen halen. Echter hebben we tegen de server wel gezecht dat deze 256 woorden moet halen uit het geheugen. En dat doet het beestje dan ook braaf.
  72.  
  73. Maar waar komen de 255 andere woorden dan vandaan?? De 255 woorden zijn dus andere dingen die nog in het geheugen stonden! En dat kan vanalles zijn, ook inlognamen en wachtwoorden!
  74.  
  75. Nu stuurt de server mij dus een pakketje terug met mijn woord, en 255 andere woorden.
  76. Als ik dit vaak genoeg doe dan krijg ik uiteindelijk vanzelf een keer een wachtwoord van een andere gebruiker (want in de pc wereld gaat alle data ooit het geheugen in).
  77. Een zeer gevaarlijke bug dus!
  78.  
  79. Hoe is deze bug opgelost??
  80. Simpel! Door niet uit te gaan van het nummer dat het pakketje meegeeft, maar door de woorden echt te tellen.
  81. Als ik dus een pakketje stuur met de inhoud:
  82. 256| woord
  83. Dan telt de server nu het aantal woorden achter de streep (1) en retourneerd dat aantal (1) woorden ook weer terug.
  84.  
  85.  
  86. Een van de grootste bugs dit jaar was dus een user input fout!
  87.  
  88. Ik hoop dat iedereen na dit artikel nog eens gaat nadenken over het belang van het saniteren van de user input.
  89. En om daar nog een handje bij te helpen wil ik jullie verwijzen naar: http://bobby-tables.com/
  90. Een website waar stukjes code staan om SQL injections te voorkomen.
  91.  
  92.  
  93. Disclaimer: Ik heb de werking van openSSL (voornamelijk de heartbeat functie) hier heel simpel weergegeven, als u wilt weten hoe het precies werkt kunt u de sourcecode van openSSL downloaden op: http://www.openssl.org/source/
Advertisement
Add Comment
Please, Sign In to add comment