【发布时间】:2017-03-23 13:18:43
【问题描述】:
我发现自己正在为我工作的公司的安全审计员编写测试;通过这样做,我发现了一个我仍然无法解决的 CTF 挑战。
如果想通了,最好请你们看看你们的想法。
链接是https://2013.picoctf.com/problems/php3/
测试说明说要注意md5函数的使用方式,特别是最后一个参数设置为true。
sn-p 读取:
$pass = md5($_POST[pass], True);
$query = @mysql_fetch_array(mysql_query("select user from php3 where (user='$user') and (pw='$pass')"));
md5() 结尾为 true 意味着 md5 将返回原始表示而不是字符串表示:
如果可选 raw_output 设置为 TRUE,则 md5 摘要为 而是以长度为 16 的原始二进制格式返回。
考虑到这一点,您是否知道通过此测试的程序是什么?
我猜这与 MySQL 将字符串与二进制表示进行比较的方式有关,即类似于 Why md5('240610708') is equal to md5('QNKCDZO')? 并与 http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html 中描述的浮点比较有关
mysql> SELECT '18015376320243458' = 18015376320243458;
-> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
-> 0
你能帮我理解这个挑战吗?
【问题讨论】:
-
不要使用
mysql_已弃用的函数 -
Little Bobby 说 your script is at risk for SQL Injection Attacks.。即使escaping the string 也不安全! SQL 注入! 不再只是早餐!
-
你不应该使用 SHA1 password hashes 或 MD5 password hashes 而你真的应该使用 PHP 的built-in functions 来处理密码安全。在散列之前,请确保您 don't escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。