在此PHP表单中利用MD5 / Salt漏洞?

时间:2016-06-13 18:16:33

标签: php sql hash sql-injection

我一直在练习与安全相关的科目,这个挑战让我感到困惑。注意:我无法访问任何PHP源代码,也无法编辑它。我只能查看它。

以下是:

我有两个输入,"用户"并且"通过" 表格发送30次后,盐,哈希和最终溶液发生变化。所以暴力不是一个选择(可悲的是!) @页面的底部(由于某种原因未在代码中显示),它回应它找到了9个用户(调用getnumberofusers()函数) 我设法提取了这个:

username = root
hashed password = 551e18b35e17017742a8ce4ed27f626e
Token (possibly salt?) = 0St31ez14wOT6jTh

到目前为止我尝试的结果不成功:

使用SQL注入,选择一个已知的MD5冲突作为密码,并将其对应物发送为"传递",但是盐正在困扰这个过程。显然,我无法强迫这一点,因为在30次尝试之后,盐会发生变化。 我尝试找到整个用户列表,但它没有在任何地方打印输出(只有错误) 这是我们收到的代码:

<?php
//by Mawekl
//Objective: login as root.
//Objective is NOT:
// - Blind SQLI
// - Bruteforce password/salt/id

#WARNING
#ANTI-BLIND
#for every 30 queries
#all hashes, salt
#and final solution
#will be reset.

function getnumberofusers()
{
    $q = "SELECT 1 FROM `sqlinjection1`";
    $r = mysql_query($q);
    return 'Number of users: '  . mysql_num_rows($r);
}

function getinfo($user)
{
    $q = "SELECT `id`, `password` FROM `sqlinjection1` WHERE `username`='$user'";
    $r = mysql_query($q);
    if(!$r)
        return mysql_error();
    $r = mysql_fetch_array($r);
    if(!$r)
        return "Username doesn't exists.";
    return $r;
}

function getfullinfo($id)
{
    $q = "SELECT * FROM `sqlinjection1` WHERE `id`=$id";
    $r = mysql_query($q);
    if(!$r)
        return mysql_error();
    $r = mysql_fetch_array($r);
    if(!$r)
        return "What the hell?!";
    return $r;
}

function confirmpassword($pass, $passcorrect, $salt)
{
    $pass = md5(md5(md5($pass)).$salt);
    return $pass===$passcorrect;
}

function challenge($user, $pass)
{
    $info = getinfo($user);
    if(!is_array($info))
        return $info;
    $confirm = confirmpassword($pass, $info['password'], $_ENV['ST_SALT']);
    if(!$confirm)
        return 'Wrong password!';
    $info = getfullinfo($info['id']);
    if(!is_array($info))
        return $info;
    $returnmessage = "Welcome " . $info['username'] . "!" . PHP_EOL .
    $info['welcomemessage'] . PHP_EOL;
    return $returnmessage;
}

?>

任何帮助都表示赞赏,如果您有任何问题,我很乐意澄清我的问题!

现在我们可以使用sql选择欢迎消息/其他任何内容 $用户=&#34; 1&#39;或exp(〜(select * from(从sqlinjection1中选择welcomemessage,其中username =&#39; user1&#39;)a))或&#39; 1&#39; =&#39; 1&#34; 但是当我们发现一个秘密令牌(我写在那里^)隐藏在数据库中并尝试使用它时:

想法:使用SQL注入选择散列版本为password,以便散列匹配。

以下是代码:

<?php

$salt = "v5IftFb0Tx1Jhp4b";
$hashed = "";
$p = "hello";
$hashed = md5(md5(md5($p)).$salt);

echo "The Query: " . "' AND 1 = 0 UNION SELECT `id`, '$hashed' AS `password` FROM sqlinjection1 WHERE `username` = 'root';#";
?>

它回应了我们在&#34;用户名&#34;中添加的查询。领域。在&#34;密码&#34;我们进入的领域&#34;你好&#34;。

然而它不起作用......

但它不起作用,任何人都知道我们还能做些什么?我们怎样才能找出/修改$ _ENV [&#34; ST_SALT&#34;]?显然它不是我们发现的秘密标记

0 个答案:

没有答案