您的位置:首页 > 编程语言 > PHP开发

[漏洞分析] Smart PHP Poll认证绕过漏洞

2015-05-19 14:27 666 查看
漏洞编号为36386;OSVDB-ID:119631

首先,可以在网址:http://www.scriptsez.net/download/download.php?action=download&p=smart_php_poll.zip&ns=1处下载程序源码。

首先在安装的过程中需要注意,在配置文件conf.php中,需要更改变量$db_name,$databse_user,$database_pass的内容,分别用相应的数据库名,

用户名和密码赋值。

漏洞存在于登录页面www.target.com/path/admin.php

正常情况下输入用户名和密码登录到今系统中,系统默认的登录凭证为admin/password





在源码的第350行,得到对话框中用户输入的用户名和密码值。

echo "<form method=\"post\" action=\"admin.php\"><table width=50% align=center cellspacing=0 cellpadding=2><TR height=26 bgcolor=#E6E6E6><TD colspan=3 align=center><B>Please Login</B></TD></TR><TR height=26 bgcolor=#F6F6F6><TD width=15% align=center rowspan=\"2\" style=\"BORDER-LEFT:#E6E6E6 1px solid;\"><img src=\"images/admin_info.png\"></TD><TD width=20%>Admin ID</td><td width=65% style=\"BORDER-RIGHT:#E6E6E6 1px solid;\"><input type=text name=admin_id></td></tr><TR height=26 bgcolor=#F6F6F6><TD width=20%>Password</td><td style=\"BORDER-RIGHT:#E6E6E6 1px solid;\"><input type=password name=admin_pass></td></tr><TR height=26 bgcolor=#F6F6F6><TD width=\"35%\" colspan=\"2\" style=\"BORDER-LEFT:#E6E6E6 1px solid;BORDER-BOTTOM:#E6e6e6 1px solid;\"><BR><BR><BR></td><td style=\"BORDER-RIGHT:#E6E6E6 1px solid;BORDER-BOTTOM:#E6E6E6 1px solid;\"><input type=submit value=\"Login\"></td></tr></table></form>";


随后将收到的值交给一个SQL语句用于查询该用户是否存在。在代码的第19~25行。

if($admin_id!="" && $admin_pass!=""){
$search=mysql_query("SELECT * FROM smp_ad WHERE admin_id='$admin_id' AND admin_pass='$admin_pass'");
if(mysql_num_rows($search)==1){
$_SESSION['ein']=base64_encode($admin_id);
header("location: admin.php?action=dologin");
}
}
这段代码首先判断用户输入的用户名和密码是否为空。如果不为空,则进行SQL语句查询,利用函数mysql_num_rows()返回结果集中的行数目。如果返回结果为1,用户的身份存在于数据库中,即用户存在,随后将用户指引到下一个页面admin.php?action=dologin

问题存在于对用户查询的SQL语句中,程序将用户的输入未作任何过滤就直接插入到SQL语句当中。

当用户在用户名处输入admin' or '1'='1,并且在密码中输入任何内容时,所进行的SQL查询语句为:

SELECT * FROM smp_ad WHERE admin_id='admin' or '1'='1' AND admin_pass='[ANYTHING]'
这句话的内容等同于SELECT * FROM smp_ad WHERE admin_id='admin',即攻击者只要输入一个合法的用户名,不需要密码,即可通过认证。





加固的方法为,使用PHP中的addslashes函数,

$search=mysql_query("SELECT * FROM smp_ad WHERE admin_id='".addslashes($admin_id)."' AND admin_pass='".addslashes($admin_pass)."'");
此函数会将用户的输入中存在的单引号,双引号反斜线以及NULL字符进行转义。即如果用户试图用同样的方法绕过登录时,SQL语句会是如下样子:

SELECT * FROM smp_ad WHERE admin_id='admin\' or \'1\'=\'1' AND admin_pass='[ANYTHING]'
用户无法通过可控的输入来闭合单引号以达到单引号平衡,因此无法绕过认证,最终起到加固的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: