UPD论坛安全性分析作者: [ITS]Jambalaya
小组论坛: www.itaq.org
前言:不久前看到一篇关于UPD论坛安全性的文章,因为闲来无事就从网上弄了一个下来,准备随便看看。我听很多人和我说CGI不安全,PHP安全。其实没有一种语言具备先天安全性,安全性是存在于编写代码人的思想中的,尽管PHP从刚开始的对magic_gpc_quote的限制到PHP4.0中对register_globals的禁止都没有阻拦住php各种论坛和系统的漏洞层出不穷,任何代码编写思想的不严谨和对漏洞成因的不了解对会直接或间接导致漏洞,如果你不信,那我们就来一起来看看吧!
一、profile.php中的逻辑错误
1、描述
^^^^^^^
profile.php是修改资料的文件,在profile.php中存在基本的逻辑错误导致恶意用户可以通过本地提交直接修改管理员的密码。
2、漏洞具体成因:
^^^^^^^^^^^^^^^
拿到论坛代码简单的浏览了一下,发现修改用户密码的地方并没有检查用户原来的旧密码。而是直接输入新密码,源代码如下:
<td bgcolor='$table1' width=80%><font size='$font_m' face='$font_face' color='$font_color_main'><b>用户名</b></font></td>
<td bgcolor='$table1' width=80%><font size='$font_m' face='$font_face' color='$font_color_main'>
$rec[user_name]
</td>
</tr>
<tr>
<td bgcolor='$table1' width=80%><font size='$font_m' face='$font_face' color='$font_color_main'><b>新密码</b></td>
<td bgcolor='$table1' width=80%><font size='$font_m' face='$font_face' color='$font_color_main'>
<input type='password' name='u_newpass'></font>
我们注意到用户名就是简单的$rec[user_name]直接提取了出来的,如果我们在源代码中修改这个值,并提交一个管理员的ID,然后通过本地提交就可以轻易的更改管理员的密码。
3、利用方法
注册一个用户Jambalaya,打开profile.php的页面,另存为1.htm,打开后找到Jambalaya修改为admin(或者其他管理员Id).查找action后面的地址,更改为要试验的的URL,如:http://127.0.0.1/myhome/upd/profile.php.输入密码后提交。看看,你已经可以用管理员登陆了。
二、admin_members.php
1、描述
^^^^^^^
因为后台程序admin_members.php验证存在缺陷,导致恶意用户可以直接添加或者更改、删除论坛管理员,进而威胁论坛或服务器安全。
2、具体漏洞成因
^^^^^^^^^^^^^^^
我们先来看一下具体的代码:
if(!isset($verify))
{
$verify = "";
}
if(isset($power_env) && isset($user_env) && isset($pass_env) && isset($id_env))
{
if(is_logged_in($user_env, $pass_env, $power_env, $id_env))
{
if (isset($action))
{
if($action == "edit")
{
if(isset($id))
{
$rec = get($id, "./db/users");
if(isset($level))
{
@$rec[level] = $level;
$rec = implode("<~>", $rec);
edit($id, $rec, "./db/users", "no");
echo "successfully edited user!";
} else {
//......
$power_env是权限的设置,id_env是你的级别。当$power_env等于3并且id_env=2的时候是论坛管理员,可是在整个程序中并没有检查权限是否为管理员,只是检查了power_env是否为空,并且power_env和id_env也并没有初始化,呵呵,好极了~~~~我们可以直接提升自己为管理员,不信?来看看~~~
3、利用方法
^^^^^^^^^^^
注册一个用户
用户名: itaq
密码: www.itaq.org
重复密码: www.itaq.org
信箱: love@myheart.org
然后我们提交如下的URL:
http://127.0.0.1/myhome/upd/admin_members...._env=3&id_env=2
id是你在论坛的id值,level为3是管理员,2是斑竹,1是普通会员。
提交后看到什么了?
successfully edited user!
呵呵,重新登陆看看,你已经是管理员了吧~~~
这篇文章只是挑了其中两个错误来说明问题,其实这个论坛诸如此类的漏洞还有很多,很多没过滤或者缺少验证的地方,大家有兴趣自己看吧。
正如你所见,安全是一种意识,而不是一种功能。所以没有哪种语言是安全的,就好像没有哪个国家的语言不存在二义性一样。论坛的代码导致的漏洞层出不穷,希望这能给编写代码的朋友们一些警示。
在这里感谢IT安全的各位好友们对我的支持和鼓励,特别是SystEM32他一直在激励我努力学习技术。也感谢analysist在上次面对面的聊天中给我的一些启示,让我明白了不少东西。
行问仓促,难免有错,欢迎来www.itaq.org交流技术。