主页 > 网络知识 > MetInfo5.3.19代码审计思路(3)

MetInfo5.3.19代码审计思路(3)

 

MetInfo5.3.19代码审计思路

 

所以猜想可能在前面会有将数据插入authpass字段的地方,往前搜索authpass找到了一段代码

在$action=next2且abt_type==1后

 

MetInfo5.3.19代码审计思路

 

执行这段代码的前提是$smsok==‘SUCCESS’,而

$smsok=sendsms($admin_list['admin_mobile'],$message,5);

 

MetInfo5.3.19代码审计思路

 

sendsms()为发送短信的方法,我没有开通发送短信,所以$authpass无法插入数据,那么if($codeok)就无法成立,后面的update语句也没法执行了,所以这一处没法绕过。

第二处

还是$action=next4后,但是abt_type的值不能为1

 

MetInfo5.3.19代码审计思路

 

这里最关键的是if(!$p)die();$p要有值才能执行后面的update语句,传入$p后会对$p进行处理,处理的代码还是在该页面里

if($p){ $array = explode('.',authcode($p,'DECODE', $met_webkeys)); $array[0]=daddslashes($array[0]); $sql="SELECT * FROM $met_admin_table WHERE admin_id='".$array[0]."'"; //从这sql语句可得$array[0]必须为要修改的密码对应的用户名 $sqlarray = $db->get_one($sql); $passwords=$sqlarray[admin_pass]; $checkCode = md5($array[0].'+'.$passwords); if($array[1]!=$checkCode){ okinfo('../admin/getpassword.php',$lang_dataerror); } if(!$action){ $action='next3'; $abt_type=2; $nbers[1]=$sqlarray[admin_id]; } }

还是从后往前推

if($array[1]!=$checkCode){ okinfo('../admin/getpassword.php',$lang_dataerror); }

必须让$array[1]=$checkCode才能往下执行,$array为$p解密后经过explode()函数得来,explode(‘.’,authcode($p,’DECODE’, $met_webkeys))以‘.’作为分隔符将解密后的$p分割后组成数组。$checkCode = md5($array[0].’+’.$passwords),$passwords = $sqlarray[admin_pass];,$passwords为管理员表中用户名对应的密码的值。所以可以得出$array[1]的值必须为md5(用户名+密码),$array[0]的值为用户名,所以authcode($p,’DECODE’, $met_webkeys)的值为用户名.md5(用户名+密码)。所以如果能找到加密这个值并且能得到它的地方,那么就可以构造出满足条件的$p,达到任意修改密码的目的。

通过全局搜索发现还真有这地方

 

MetInfo5.3.19代码审计思路

 

跟进后发现还是在getpassword.php这个文件下

执行的前提是$action=next2,$abt_type!=1,admin_mobile=存在的用户名

 

MetInfo5.3.19代码审计思路

 

最后是将这串满足条件的加密值赋值给了$String,然后$mailurl的值又拼接了‘p=$String’

但是$mailurl最后出现的地方是在往下几十行的$body .=”<p><a href=http://www.52bug.cn/hkjs/’$mailurl’>$mailurl</a></p> ”;,

构造参数发送数据包后显示如下

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!