Problème de Piratage de Votes Urgent !!!

Résolu
simonloubs Messages postés 2 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 27 décembre 2005 - 27 déc. 2005 à 22:13
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 - 28 déc. 2005 à 11:35
Bonjour à tous,

J'ai lancé depuis deux semaines un concours de miss sur le web et quelqeus petits malins ont trouvé le moyen de "pirater" les scores en contournant les vérifications d'adresse IP et de date , ce qui fait que certaines candidates se trouvent actuellement avec des scores astronomiques alors que d'autres se trouvent "honnêtement" dans les dix dernières...

Voici le code utilisé:
<!-- #include file="../ConnectVotes.asp"-->
<%
sDate = ( Day(now()) & Month(now()) & Year(now()) )
sIPAddress = request.ServerVariables("REMOTE_ADDR")
sMistressName = request("MistressName")
sqlIPAddress "SELECT IPAddress.* FROM IPAddress WHERE IPAddress '" & sIPAddress & "' AND pollname = '" & sMistressName & "' ORDER BY IPAddress, pollname"
Set rsIPAddress = Server.CreateObject("ADODB.RecordSet")
rsIPAddress.Open sqlIPAddress, conn, 3, 3
sqlVote "SELECT * FROM Votes WHERE pollname '" & sMistressName & "' ORDER BY pollname ASC"
Set rsVote = Server.CreateObject("ADODB.RecordSet")
rsVote.Open sqlVote, conn, 3, 3

If Request("action") = " Vote for Me !!! " Then
With rsVote
.Fields("totalpoints") = Request("vote")
.Fields("totalvotes") = Request("totalvotes")
.Update
End With

With rsIPAddress
.AddNew
.Fields("pollname") = sMistressName
.Fields("IPAddress") = sIPAddress
.Fields("Date") = sDate
.Update
End With

End If
%>
<% Score = rsVote.Fields(\"totalpoints\") %>
My Actual Score is
<hr size="1" noshade>,

----

<table border="0" align="left" cellpadding="0" cellspacing="0">
----, \"></td>
<%= Score %> Points

</td>
</tr>
<% If rsIPAddress.eof Then %>
<form ACTION="MistressesGalleriesCompleteList.asp" METHOD="POST" name="vote">
<tr>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
" checked></td>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
"></td>
<td width="10%" align="center" nowrap>
"></td>
</tr>
<tr>
<td align="center" nowrap>1</td>
<td align="center" nowrap>2</td>
<td align="center" nowrap>3</td>
<td align="center" nowrap>4</td>
<td align="center" nowrap>5</td>
<td align="center" nowrap>6</td>
<td align="center" nowrap>7</td>
<td align="center" nowrap>8</td>
<td align="center" nowrap>9</td>
<td align="center" nowrap>10</td>
</tr>
<tr>
<td colspan="10" align="center" nowrap>

</td>
</tr>
+1">
">
">
">
">
</form>
<% Else %>
<tr>
<td colspan="10" align="center" nowrap>

Thank you for voting...
</td>
</tr>
<% End If %>
</table>
<%
rsIPAddress.close()
rsVote.Close()
Set rsIPAddress = Nothing
Set rsVote = Nothing
%>

Si quelqu'un a une idée ou a déjà rencontré le même problème, ce serait vraiment très sympas pour les miss non-piratées. Merci de vos avis éclairés.

Amicalement vôtre
simonloubs

4 réponses

cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
27 déc. 2005 à 22:46
Salut,

Je vois l'endroit où tu ajoute un vote mais je ne vois rien dans ton code qui empêche de cliquer 150 fois sur "Vote for Me"...

Nurgle
3
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
27 déc. 2005 à 22:46
T'es gentil de laisser la clé du serveur aux inconnus :)

le problème se trouve dans ton horrible requete sql injecté ... (je suis pas aller plus loin que ca)

sMistressName = request("MistressName")
sqlIPAddress "SELECT IPAddress.* FROM IPAddress WHERE IPAddress '" & sIPAddress & "' AND pollname = '" & sMistressName & "' ORDER BY IPAddress, pollname"

à partir de la tu peux faire ce que tu as envie !!! tu demande à l'utilisateur de directement taper du sql dans ta base !!! Il y a pleins d'exemples montrant les mefaits des requetes injectés, utilise plutot les procédures stockés beaucoup plus sur..... :)


<HR>
Cyril - MVS - MCP ASP
3
simonloubs Messages postés 2 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 27 décembre 2005
27 déc. 2005 à 23:14
Nurgle, la ligne suivante répond à ta question:

et plus haut
<% If Request("action") = " Vote for Me !!! " Then
With rsVote
.Fields("totalpoints") = Request("vote")
.Fields("totalvotes") = Request("totalvotes")
.Update
End With

With rsIPAddress
.AddNew
.Fields("pollname") = sMistressName
.Fields("IPAddress") = sIPAddress
.Fields("Date") = sDate
.Update
End With

End If
%>

Mais je pense plutôt que le problème comme dit Cyril, doit venir de mon "horrible requête injectée," je vais creuser la question des procédure stockée, excellente suggestion. Comme quoi quand on veut faire vite, ce n'est JAMAIS bien protégé...

Merci de vos avis...

Simon

Amicalement vôtre
simonloubs
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
28 déc. 2005 à 11:35
L'extrait de code que tu viens de me donner ajoute un vote, mais ne vérifie pas en lui-même si l'adresse IP utilisée est déjà présente.
C'était le "If rsIPAddress.eof Then" que je n'avais pas vu...

Bon, je vais t'expliquer ce que je voulais dire :
Imaginons que je sois un hacker assez gentil (et assez con ) pour ne pas faire d'injection SQL...
Je clique sur "Vote For Me", et d'après le code que tu m'as donné, ça ajoute une ligne (un vote) avec mon adresse IP et ça recharge donc la page avec cette fois écrit "Thank you for voting...".
Ensuite je clique sur "Précédent" et ça me recharge (à partir du cache du navigateur) la page avec le "Vote For Me", je reclique sur "Vote For Me", ça ajoute encore une ligne avec un nouveau vote mais la même adresse IP, et ainsi de suite.
Il y a problème de conception : dans le "If Request("action") = " Vote for Me !!! "" tu dois vérifier aussi si il a déjà voté (en plus de vérifier au chargement de la page) !
De plus il est extrèment simple de simuler des requêtes post avec certains programmes, donc tu dois faire cette vérification.

De plus, faire ça en fonction de l'adresse IP est totalement sucuidaire car il reste beaucoup de gens qui sont en bas débit, et dont l'adresse IP change le plus souvent à chaque déconnexion/reconnexion.

Sans oublier l'injections SQL (ça me rappelle une certaine session de Rédo là dessus aux Student Days, il doit bien y avoir un webcast là dessus...je vais chercher ) qui ne va pas vraiment permettre aux gens d'ajouter des votes, mais plutôt de faire du bordel dans ta base (supprimer des tables, etc...).

Nurgle
0
Rejoignez-nous