PHP 探测任意网站密码明文/加密手段办法: md5('240610708') == md5('QNKCDZO')

2015-05-04 15:51:31 +08:00
 est
var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump('0010e2' == '1e3');
var_dump('0x1234Ab' == '1193131');
var_dump('0xABCdef' == ' 0xABCdef');

感觉这个不科学啊

https://news.ycombinator.com/item?id=9484757
27109 次点击
所在节点    PHP
79 条回复
Daniel65536
2015-05-05 13:33:00 +08:00
@iyaozhen username= " ' or 1=1 or ' "
iyaozhen
2015-05-05 13:41:50 +08:00
@Daniel65536 这个我知道,一般账号也只允许字母或数字。而且分号会被mysql_real_escape_string过滤掉吧。

我的本意是若网站使用 SELECT count(*) FROM user WHERE username = '$username' AND password = '$password'; 这种方式的话“把你的密码设成 0x1234Ab,然后退出登录再登录,换密码 1193131 登录,如果登录成功,那么密码绝对是明文保存的没跑。”就不能说明网站是明文保存呀。
lincanbin
2015-05-05 13:42:33 +08:00
http://www.94cb.com/t/2516

昨晚睡觉前写了一篇来解释PHP中隐式转换的这个问题。
lincanbin
2015-05-05 13:46:36 +08:00
@iyaozhen 引号过滤然后直接拼接SQL语句是个不推荐的做法了,现在PHP官方建议使用PDO类或者mysqli类来替代mysql系列函数。
也就是参数绑定,这样做的话,SQL命令与参数会分两次传到MySQL的socket,MySQL根据接收顺序就可以识别出命令和参数,从而避免在参数中构造命令(也就是SQL注入)。
PDO的话可以参考这个
https://github.com/lincanbin/PHP-PDO-MySQL-Class
est
2015-05-05 13:55:43 +08:00
@iyaozhen 逻辑老师呢?

“只要改成A密码用B密码也能登录,说明是该php网站一定是明文保存密码的。”

反过来一定成立吗?
iyaozhen
2015-05-05 14:00:08 +08:00
@lincanbin 嗯,谢谢。这个我了解过。产品线上是使用mysqli类或者框架自身的参数绑定的方式。拼 sql 的方式几年前已经交过学费了,不过感觉学费还是交的不够。。。
iyaozhen
2015-05-05 14:07:04 +08:00
@est 非常抱歉,逻辑错误了。

还有就是才疏学浅,以为都是使用 sql 直接判断的。
WKPlus
2015-05-05 14:39:18 +08:00
@est
把你的密码设成 0x1234Ab,然后退出登录再登录,换密码 1193131 登录,如果登录成功,那么密码绝对是明文保存的没跑。

这句话补充是不是这样:
1. 把你的密码设成 0x1234Ab,然后退出登录再登录,换密码 1193131 登录,如果登录成功,那么密码绝对是明文保存的且密码对比的时候用的是php的==符号
2. 但是如果密码比较的时候用的是===,那么就算是明文保存的,上述探测手段也是发现不了的
est
2015-05-05 15:21:59 +08:00
@WKPlus 第一句话也不完全一定。万一别人恰好特别写了 1193131 是万能登录密码呢?

第二句话理论是这样的。 但是既然都知道用 === 怎么还会用明文密码。。。。。。。
WKPlus
2015-05-05 19:50:59 +08:00
@est 如果1193131是万能密码的话,你“把你的密码设成 0x1234Ab,然后退出登录再登录,换密码 1193131 登录,如果登录成功,那么密码绝对是明文保存的没跑”这句话就不成立了呀

我的那两句解释只是想把你原来那句话的隐含意思说出来
est
2015-05-05 20:15:48 +08:00
@WKPlus 这不很容易解决么。把密码改成任意密码,如果1193131也能登录,那么说明1193131就是万能密码。


准确的说,顶楼给出的几个密码对,可以衍生展开,如果尝试几组都符合特征,那么可以得到明文密码/md5无盐加密的结论。
RemRain
2015-05-05 22:40:54 +08:00
@gDD 所以说 PHP 密码比较要这样:"X$pass1" == "X$pass2"
gDD
2015-05-05 22:57:17 +08:00
@RemRain 天……上面的帖子你都白看了吗?最次最次用 "$pass1" === "$pass2" 或者 strcmp(),最好用 hash_equals() 啊。
123123
2015-05-07 14:10:44 +08:00
@gDD 只要最前方加个X就不会转换成数字进行比较,说的也没错就是了,不过加个=不是更方便么。。
mahone3297
2015-05-07 22:08:33 +08:00
这个帖子很赞,学习了。。。
mingyun
2015-05-11 21:40:00 +08:00
果真脑洞打开,不过'240610708' ,'QNKCDZO'这种字符是怎么发现的?
fhefh
2015-10-17 21:48:14 +08:00
学习了 mark~~
wusuopuBUPT
2015-10-17 23:58:51 +08:00
@est 原来如此!
Kratoshy
2015-12-08 15:16:31 +08:00
var_dump(md5('240610708') === md5('QNKCDZO'));
这个是 false 吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX