PHP反序列化注入姿势

作者: 康康 分类: Web安全 发布时间: 2018-04-18 09:27

反序列化注入姿势

既然能够控制服务器返回数据了,我们来看看将我们自己的任意数据传递到unserialize()还能做到什么事情。 为了节省自己一些时间,让我们在“./system/ee/legacy/libraries/Session.php”文件中修改一下代码:

if (md5($payload.$this->sess_crypt_key) == $signature)

替换为:

if (1)

这样,我们就无需去满足函数的限制条件了!

既然我们可以控制序列化数组里面的:new:username => admin的值,我们再看到“./system/ee/legacy/libraries/Session.php”的内容,并注意以下函数:

335 function check_password_lockout($username = '')
336 {
337   if (ee()->config->item('password_lockout') == 'n' OR
338     ee()->config->item('password_lockout_interval') == '')
339   {
340     return FALSE;
341   }
342
343   $interval = ee()->config->item('password_lockout_interval') * 60;
344
345   $lockout = ee()->db->select("COUNT(*) as count")
346     ->where('login_date > ', time() - $interval)
347     ->where('ip_address', ee()->input->ip_address())
348     ->where('username', $username)
349     ->get('password_lockout');
350
351   return ($lockout->row('count') >= 4) ? TRUE : FALSE;
352 }

这个函数似乎是通过数据库检查用户的存在性和合法性。 $username的值可控,我们应该能够在这里注入我们自己的SQL参数,进而导致SQL注入。 Expression Engine使用数据库驱动类来与数据库交互,但原始数据库语句就像下面这样(我们可以猜得八九不离十):

SELECT COUNT(*) as count FROM (`exp_password_lockout`WHERE `login_date` > '$interval' AND `ip_address` = '$ip_address' AND `username` = '$username';

我们将$payload数据修改为:

 a:2:{s:13:":new:username";s:1:"'";s:12:":new:message";s:7:"taquito";}

并发出请求,希望能够出现“Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line“的错误

发表评论

电子邮件地址不会被公开。 必填项已用*标注