shal()函数绕过和session验证绕过

一、shal()函数绕过

Your password can not be your name!

'; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else echo '

Invalid password.

'; } else echo '

Login first!

'; ?>

审计这段代码可以发现要输出flag就必须满足2个条件
1、name和password的值不相同
2、name和password的值和类型都相同
payload为?name[]=1&password[]=2这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回false,if 条件成立,获得flag。
注意md5()函数同样存在此漏洞。

二、session验证绕过

Wrong guess.

'; } mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000)); ?>

审计代码发现,需要session中的password值和用户传的一样,就可以打印flag,
所以只需要删掉session值,或者修改session值为一个不存在的session,服务器获取不到session,则password为空,用户传一个空的password的进去即可拿到flag。
注意:
在PHP配置中的默认情况下,Session是用Session ID来确定当前对话所对应的服务器Session,sessionID可在cookie中找到,当我们删除cookie中的sessionID后,$_SESSION[‘password’]就会返回空,我们同样传入空的password就能绕过了。
payload为password=

你可能感兴趣的:(PHP代码审计(偏基础的))