我试图解决这个PHP漏洞,在https://picoctf.com/problems/php3/上找到,源代码可在上面的问题,但不能。
我发现了一个解决方案,它声称任何密码的md5哈希值在字节形式中包含字符串'='或'|'(包括单引号),如果与用户名"admin"配对,将被接受。
最初在这里找到的解决方案:(越南语)http://blog.phuongnam.org/2013/07/picoctf.html
例如,可以接受以下日志详细信息:
管理
1184941
显然这是因为1184941的字节md5哈希值为8žt¼>Pý^0'|'
那么为什么这个解决方案有效呢?
我得到md5的True参数产生一个字节而不是十六进制哈希,并且@前缀
mysql_fetch_array
强制sql忽略由于中断查询而导致的错误,但除此之外我就迷失了。
查询中的管道符号为bitwise OR
为了便于阅读,将查询稍微分割一下,它看起来像这样:
.. WHERE (pass = '8žt¼ø>Pý^0' |'')
按位或返回0(我通过打开javascript控制台并输入'8žt¼ø>Pý^0' |''
来确认)。当您针对整数查询char/varchar字段时,MySQL将字段的内容类型转换为整数以进行比较。任何没有有效整数的字段都等同于0
。所以它现在正在寻找包含值0
的密码,这是所有不是数字值的东西。
或者;您也可以使用用户名登录:') OR 'a'='a' --