En raison des besoins du travail quotidien, l'unité a utilisé Serv-U pour mettre en place un serveur FTP. Cependant, après avoir pris la relève, il a été découvert qu'il y avait un problème très grave. Ce serveur FTP était ouvert au public et à de nombreux utilisateurs. n'a pas défini de mots de passe. S'il est obligatoire pour chacun de définir un mot de passe et qu'il doit être défini sur le serveur, cela ne signifie-t-il pas que tout le monde doit communiquer son mot de passe à l'administrateur. Après tout, de nombreuses personnes sont habituées à utiliser le même mot de passe ? Ce qu'il faut faire? Le meilleur moyen est bien sûr de prévoir une page Web pour proposer la fonction de modification du mot de passe.
Allez-y et vérifiez-le en ligne. Une méthode consiste à utiliser la fonction ODBC fournie par Serv-U lui-même, à utiliser la base de données pour stocker les mots de passe et à exploiter directement la base de données pour réaliser la fonction de modification du mot de passe. Cependant, après avoir testé cette méthode, pas très. possible. Étant donné que ce serveur FTP fonctionne depuis un an et compte près de 60 utilisateurs, la probabilité d'erreurs lors de la transplantation de ces utilisateurs du fichier INI vers la base de données est encore relativement élevée. Il est plus facile d'exploiter directement le fichier INI.
La première chose est de comprendre comment les informations utilisateur de Serv-U sont enregistrées dans le fichier INI et comment le mot de passe est crypté. La structure du fichier INI est relativement simple. Pour modifier le mot de passe, recherchez simplement la section commençant par [User=@UserID|1] et modifiez la valeur de la clé Mot de passe en dessous. @UserID fait référence à l'ID de connexion de l'utilisateur.
1[GLOBAL]
2Version=6.1.0.5
3PacketTimeOut = 300
4
5
6
7[Domaine1]
8Utilisateur1=
9Utilisateur2=
10Utilisateur3=
11
12
13
14[UTILISATEUR=abc|1]
15Mot de passe=niE383DC3710266ECAE04A6B3A18A2966D
16RepAccueil=D:
17AlwaysAllowLogin=1
18ChangePassword=1
19TimeOut=600
20Note1="Compte généré par l'assistant"
21Accès1=D:
vingt-deux
vingt-trois
La méthode de cryptage du mot de passe utilisateur peut être trouvée dans la base de connaissances du site officiel de Ser-U.
http://rhinosoft.com/KBArticle.asp?RefNo=1177&prod=su
Saisie manuelle de mots de passe cryptés dans le fichier ServUDaemon.ini
Pour générer un mot de passe crypté, deux premiers caractères aléatoires (le « sel » - dans la plage a..z, A..Z) sont ajoutés au début du mot de passe en texte clair. Celui-ci est ensuite haché à l'aide de MD5 et le résultat est obtenu. Le hachage est codé en hexadécimal. Le résultat est écrit en texte brut commençant par les 2 caractères de sel suivis du hachage encodé en hexadécimal.
Pour un compte d'utilisateur dans le fichier .ini, cela ressemblera à :
Mot de passe = cb644FB1F31184F8D3D169B54B3D46AB1A
. est la chaîne "cb", le hachage MD5 est "644FB1F31184F8D3D169B54B3D46AB1A".
Lors de la vérification du mot de passe d'un utilisateur, Serv-U fera de même. Il analyse le sel du mot de passe stocké de l'utilisateur (c'est-à-dire "cb" dans ce cas), ajoute le préfixe. C'est le mot de passe que l'utilisateur lui a envoyé par le client, MD5 le hache et compare le résultat avec le hachage stocké. Si les valeurs sont égales, alors le mot de passe saisi est correct.
La méthode de cryptage consiste à générer aléatoirement deux lettres, puis à fusionner les lettres et le mot de passe, puis à trouver leurs valeurs MD5. Enfin, placez les lettres aléatoires devant la valeur MD5 pour obtenir le mot de passe crypté.
Ensuite, vous pouvez écrire un programme basé sur l'analyse ci-dessus pour mettre en œuvre une modification en ligne.
1 /**//// <résumé>
2 /// Récupère la valeur MD5 de la chaîne spécifiée
3 /// </summary>
4 /// <param name="strContent"></param>
5 /// <retours></retours>
6 Chaîne publique MD5 (String strContent)
7 {
8 System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
9 octets[] octets = System.Text.Encoding.UTF8.GetBytes( strContent );
10 octets = md5.ComputeHash( octets );
11 md5.Clear();
12 chaînes ret = "" ;
13 pour (int i=0; i<bytes.Length; i++)
14 {
15 ret += Convert.ToString(bytes[i],16).PadLeft(2,'0');
16}
17 return ret.PadLeft(32,'0').ToUpper();
18}
19
20
21 /**//// <résumé>
22 /// Générer une chaîne aléatoire, la longueur de la chaîne est 2
23 /// </summary>
24 /// <retours></retours>
25 chaîne publique GetRandomString()
26 {
27 chaîne strReturn = "" ;
28 Exécution aléatoire = new Random();
29 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
30 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
31 return strReturn ;
32}
33
34 //Générer un mot de passe crypté à partir des lettres aléatoires spécifiées et du mot de passe de connexion
35 chaîne publique CreateCryPassword (chaîne strFrontChars, chaîne strPassword)
36 {
37 return strFrontChars + MD5( strFrontChars + strPassword ).ToUpper().Trim();
38 }
39
40 /**//// <résumé>
41 /// Événement de clic de "Changer le mot de passe", dans lequel le mot de passe est modifié.
42 /// </summary>
43 /// <param name="expéditeur"></param>
44 /// <param name="e"></param>
45 vide privé btnModifyPwd_Click (expéditeur d'objet, System.EventArgs e)
46 {
47 chaîne strUserID = txtLoginID.Text ;
48 si (strUserID == String.Empty)
49 {
50 controlMessage.InnerHtml = "Le nom d'utilisateur ne peut pas être vide";
51 retour ;
52 }
53
54 //Déterminer si les deux entrées de mot de passe sont identiques
55 si( txtNewPassword.Text != txtConfirmPassword.Text )
56 {
57 controlMessage.InnerHtml = "Les mots de passe saisis deux fois sont incohérents, veuillez les saisir à nouveau";
58 retour ;
59 }
60
61 IniFile ini = new IniFile( _strServUDaemonPath );
62 chaîne strSectionValue = "USER=" + strUserID.Trim() + "|1";
63
64 //Déterminer si l'utilisateur existe en lisant le HomeDir de l'utilisateur spécifié
65 if( ini.ReadString( strSectionValue, "HomeDir", "" ) == "" )
66 {
67 controlMessage.InnerHtml = "L'utilisateur spécifié n'existe pas";
68 retour ;
69 }
70
71 //Commencer à déterminer si le mot de passe est correct
72 chaîne strPassword = ini.ReadString( strSectionValue, "Password", "" );
73
74 chaînes strPasswordFrontTwoChars ;
75 bool bPasswordRight = faux ;
76 si (strPassword.Length > 2)
77 {
78 //Lire les lettres aléatoires contenues dans le mot de passe
79 strPasswordFrontTwoChars = strPassword.Substring(0, 2);
80 if( CreateCryPassword( strPasswordFrontTwoChars, txtOldPassword.Text ) == strPassword )
81 {//Correspondances de mots de passe
82 bPasswordRight = vrai ;
83}
84 autres
85 {//Le mot de passe ne correspond pas
86 bPasswordRight = faux ;
87 }
88}
89 else if( strPassword == txtOldPassword.Text) //Le mot de passe d'origine est vide
90 {
91 bPasswordRight = vrai ;
92 }
93 autre
94 {
95 bPasswordRight = faux ;
96 }
97
98 si ( bPasswordRight )
99 {
100 //Le mot de passe est correct, écrivez un nouveau mot de passe et configurez-le pour charger automatiquement les nouveaux paramètres afin qu'ils soient toujours valides la prochaine fois qu'ils seront modifiés.
101 ini.WriteString( strSectionValue, "Mot de passe", CreateCryPassword( GetRandomString(), txtNewPassword.Text ) );
102 controlMessage.InnerHtml = "Changement de mot de passe terminé";
103}
104 autres
105 {
106 controlMessage.InnerHtml = "Le mot de passe original est erroné";
107 }
108
109 }
La variable _strServUDaemonPath dans le code ci-dessus est utilisée pour enregistrer le chemin où se trouve le fichier ServUDaemon.ini. Cette valeur peut être obtenue via le paramètre Web.Config dans l'événement PageLoad.
Mais cela ne s'est pas arrêté là. Après les tests, il a été constaté qu'il y avait un problème sérieux : après avoir modifié le mot de passe, seul le redémarrage de Serv-U peut permettre au mot de passe modifié de prendre effet. Cela ne veut-il pas dire que c'est inutile ? L'administrateur ne peut pas toujours redémarrer le serveur pour que le changement de mot de passe prenne effet.
En revenant à nouveau à la base de connaissances officielle de Serv-U, j'ai trouvé le contenu suivant :
Mise à jour manuelle du fichier ServUDaemon.ini
Chaque fois que des modifications sont apportées directement au fichier ServUDaemon.ini, ajoutez la ligne suivante sous la zone Global dans le fichier INI.
ReloadSettings=True
Serv-U vérifie régulièrement le fichier INI pour ce paramètre. S'il est présent, Serv-U actualise. tous les paramètres stockés pour chaque domaine sur le serveur. Cela permet à Serv-U de reconnaître les modifications sans avoir à redémarrer.
Une fois que Serv-U a chargé les modifications, il supprime l'entrée "ReloadSettings=True". la prochaine fois que des modifications seront apportées.
En d'autres termes, tant que vous ajoutez la clé ReloadSettings dans la section GLOBAL du fichier INI et définissez sa valeur sur True, vous pouvez automatiquement mettre à jour le mot de passe après l'avoir modifié. Il suffit donc de modifier le code original et d'insérer le code suivant entre les lignes 101 et 102 :
ini.WriteString( "GLOBAL", "ReloadSettings", "True" );
À ce stade, une page Web permettant de modifier le mot de passe Serv-U en ligne est terminée.
IniFile dans le programme est une classe qui encapsule le fonctionnement de l'API sur les fichiers INI. Elle doit uniquement implémenter la lecture et l'écriture de chaînes.