gpt4 book ai didi

php - 如何获取md5加密的密码

转载 作者:行者123 更新时间:2023-11-29 08:09:41 26 4
gpt4 key购买 nike

我有一个大问题。

我拥有一个带有成员(member)区的网站。我有一个竞争对手,经常黑客攻击成员(member)的帐户。

我为此聘请了一位安全专家。他修复了一些 sql 查询,但没有发现登录代码有任何问题。

真正的问题 - 如果有人输错了密码,它会自动插入到数据库中,这样我就能知道他提交了什么字符串。

DB上的密码是用MD5加密的。但同一个竞争对手入侵了我自己的帐户,当我更改密码时,他试图提交我最后的密码。所以现在我知道他确切地知道我的密码是什么。

我的密码非常长且棘手,它不可能存在于任何在线 MD5 保留中。

你知道问题出在哪里吗?他是如何破解这个的?他是怎么知道我的密码字符串的?

谢谢!

这是包含的 login.php 文件:

if(isset($_POST['login'])){
//Input filteren
$name = htmlspecialchars(addslashes($_POST['username']));
$ww = htmlspecialchars(addslashes($_POST['password']));
//Wachtwoord omzetten naar md5
$wwmd5 = md5($_POST['password']);

//Gegevens laden voor het foute inloggen.
$inlog_fout_sql = mysql_query("SELECT `datum`, `ip`, `spelernaam` FROM `inlog_fout` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."' ORDER BY `id` DESC");
$inlog_fout = mysql_fetch_array($inlog_fout_sql);
$aftellen = 1200-(time()-strtotime($inlog_fout['datum']));

//Geen inlognaam ingevuld
if($_POST['username'] == '')
$inlog_error = $txt['alert_no_username'];
//Geen wachtwoord ingevoerd
elseif($ww == '')
$inlog_error = $txt['alert_no_password'];
//Is het wel drie keer mis gegaan
elseif((mysql_num_rows($inlog_fout_sql) >= 300) AND ($inlog_fout['ip'] === $_SERVER['REMOTE_ADDR']) AND ($aftellen > 0)) {
$inlog_error = $txt['alert_time_sentence'].' <span><script type="text/javascript">writetimer("'.$aftellen.'")</script></span>';
}
else{
if($aftellen < 0)
mysql_query("DELETE FROM `inlog_fout` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."'");

// Gegevens laden om te kijken voor de gebruiker
$naam = $_POST['username'];
$gegevens_sql = mysql_query("SELECT `id`, `username`, `wachtwoord`, `premiumaccount`, `account_code` FROM `members` WHERE `username`='".$naam."'");
// Gegevens laden om te kijken voor de gebruiker
$gegeven_sql = mysql_query("SELECT `username`, `wachtwoord`, `account_code` FROM `members` WHERE `wachtwoord`='".$wwmd5."' AND `username`='".$naam."'");
$gegeven = mysql_fetch_array($gegevens_sql);

if(mysql_num_rows($gegevens_sql) == 0)
$inlog_error = $txt['alert_unknown_username'];
elseif($gegeven['username'] != $naam)
$inlog_error = $txt['alert_unknown_username'];
//Kijken of account niet is verbannen
elseif(mysql_num_rows(mysql_query("SELECT id FROM ban WHERE id = '".$gegeven['id']."'")) > 0)
$inlog_error = $txt['alert_account_banned'];
elseif(mysql_num_rows($gegeven_sql) == 0){
$datum = date("Y-m-d H:i:s");
mysql_query("INSERT INTO `inlog_fout` (`datum`, `ip`, `spelernaam`, `wachtwoord`)
VALUES ('".$datum."', '".$_SERVER['REMOTE_ADDR']."', '".$naam."', '".$ww."')");

if((mysql_num_rows($inlog_fout_sql) < 300) AND ($gegeven['wachtwoord'] != $wwmd5))
$inlog_error = 'סיסמא שגויה';
}
elseif($gegeven['account_code'] != 1)
$inlog_error = $txt['alert_account_not_activated'];
else{
//If Onthoud Check box is checked save cookie
setcookie("pa_1", $gegeven['username'], time()+(60*60*24*365));
setcookie("pa_2", $_POST['password'], time()+(60*60*24*365));

//Zorgen dat gebruiker weer 3 pogingen heeft.
mysql_query("DELETE FROM `inlog_fout` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."'");

//tijd opslaan dat het lid inlogt, zodat de site weet dat hij online is.
$tijd = time();
mysql_query("UPDATE `members` SET `ip_ingelogd`='".$_SERVER['REMOTE_ADDR']."', `online`='".$tijd."' WHERE `username`='".$gegeven['username']."'");

//Datum opvragen
$date = date("Y-m-d H:i:s");
//Opslaan in de inlog_logs tabel
$queryloginlogs = mysql_query("SELECT `id` FROM `inlog_logs` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."' AND `speler`='".$gegeven['username']."'");
if(mysql_num_rows($queryloginlogs) == "0"){
mysql_query("INSERT INTO `inlog_logs` (`ip`, `datum`, `speler`)
VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$date."', '".$naam."')");
}
else
mysql_query("UPDATE `inlog_logs` SET `datum`='".$date."' WHERE `speler`='".$gegeven['username']."' AND `ip`='".$_SERVER['REMOTE_ADDR']."'");

//zet naam in variabele, zodat het later nog gebruikt kan worden
$_SESSION['id'] = $gegeven['id'];
$_SESSION['naam'] = $gegeven['username'];
//Hash opslaan
$_SESSION['hash'] = md5($_SERVER['REMOTE_ADDR'].",".$gegeven['username']);
//Ben je wel premium
if($gegeven['premiumaccount'] > 0)
$_SESSION['userid'] = $gegeven['id'];
//naar de ingame pagina sturen
header('location: ?page=home');
}
}
}

最佳答案

我至少可以看到攻击者可以使用您的代码读取您的密码的一种方法,不会破坏 MD5 哈希值。

$naam = $_POST['username'];
. . .
$gegevens_sql = mysql_query("SELECT `id`, `username`, `wachtwoord`, `premiumaccount`, `account_code` FROM `members`
WHERE `username`='".$naam."'");

您正在将 $_POST['username'] 插入 SQL 查询中,而根本没有对其进行保护。

<小时/>

不——等等,我错了。他们可以在您显示的代码中的至少两个位置进行 SQL 注入(inject)攻击,但我不知道他们如何读取密码,因为以下代码:

elseif($gegeven['username'] != $naam)
$inlog_error = $txt['alert_unknown_username'];

他们无法将明文密码提取到 $gegeven['username'] 通过此 if 测试。

<小时/>

不过,您的代码容易受到 SQL 注入(inject)攻击这一事实是一个巨大的危险信号。如果您习惯将 $_POST 变量直接复制到查询中,那么他们可能会通过另一种方式在您的应用程序的其他部分利用它,但我们在这里没有看到。

建议:

  1. @EPB 建议重置数据库中的所有密码。

  2. 学习 how to prevent SQL injection .

  3. 询问您的安全分析师为什么他们没有发现这一点。

  4. 切勿存储明文密码。

关于php - 如何获取md5加密的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21896549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com