by: 大蝉
昨晚无事,看到一个感兴趣的网站,职业病又犯了,随便转转,发现是一个叫PHP168的整站,没见过,于是去官方网站下了份代码来读,看到困的要死的时候,发现了点什么.
在global.php中有这样的代码:
function login_logs($username,$password){
global $timestamp,$onlineip;
$logdb[]="$username\t$password\t$timestamp\t$onlineip";
@include(PHP168_PATH."cache/adminlogin_logs.php");
$writefile=" $jj=0;
foreach($logdb AS $key=>$value){
$jj++;
$writefile.="\$logdb[]=\"$value\";";
if($jj>200){
break;
}
}
write_file(PHP168_PATH."cache/adminlogin_logs.php",$writefile);
}
当登陆admin界面时,每次登陆的username都记录在cache/adminlogin_logs.php中,但是却没有对$username变量进行过滤,导致攻击者可以构造恶意$username变量,最终向cache/adminlogin_logs.php写入木马程序.
哈哈,这就是我要找的了,我开始考虑构造的问题,由于前面有结束掉前面的脚本标记,可是问题又来了
$logdb[]="$username\t$password\t$timestamp\t$onlineip";
在$username之前有个极其讨厌的”号,必须要再写入一个”来关闭它,可是默认设置下写入”或者’会在前面加上\,从而变成\”,双引号也就没用了.
这个问题困扰了我5个小时,凌晨4点钟,困的实在是受不了了,准备放弃了,谁知峰回路转,上帝在我失败的前一秒钟眷顾了我,我突然发现程序过滤\和$,也就是说,第一次写入”,自动加上了\,但是再次写入的时候,\就被去掉了
哈哈哈,大功告成,去官方网站测试了一下,轻松拿到shell
入侵到此结束.
已经提醒程序开发者,官网漏洞已补上,补丁也已经出来了