背景
我几年前创建的一个网站最近遭到攻击;剥削者成功地访问了我为客户端创建的PHP前端,该前端用于上传文件,他们还上传了一些PHP文件,其中包括基于PHP的文件管理器等。如果感兴趣的话,我可以发布每个上传的PHP文件的内容,但是问题当然是他们设法访问了客户端的前端。
这个站点从第一次创建以来就没有被更新过(它使用了旧的和不推荐的MySQL函数,也没有mysql_real_escape_string()
来检查登录面板中的输入(我知道)),但是我不能完全确定他们是否通过SQL注入获得了访问。
vhost运行在Windows / Parallels Plesk上,我既没有SSH访问权限,也没有访问日志的权限:我已经打开了一张票,主机提供商要求提供日志,但是我不确定它们是否能够提供日志,需要多少时间才能提供日志,因此在此期间,为了不冒任何风险,我正在试图利用自己的可疑漏洞。
我能够在用于检索用户数据的SQL语句中执行插入操作,以绕过用户检查,但是在使用PHP之后,我无法立即中断密码检查。
TL;博士
下面是用于检索用户数据和检查密码的相关代码段:我能够在SQL语句中执行注入(例如,使用" OR ""="
作为用户名),但是无法在之后立即中断密码检查:
<?PHP
// ...
else {
$query='SELECT * FROM users WHERE username="' . $username . '";';
$query_result=mysql_query($query);
if(!$query_result) {
die (mysql_error());
}
else {
$user_data=mysql_fetch_array($query_result);
if($user_data && $user_data['password']==$password) {
session_start();
$_SESSION['user_id']=$user_data['id'];
$_SESSION['user_username']=$user_data['username'];
$_SESSION['user_password']=$user_data['password'];
$_SESSION['user_privileges']=$user_data['privileges'];
session_write_close();
$next_page='control_panel.php';
}
else {
$next_page='login.php?notify=username_password_wrong';
}
}
}
mysql_close($mysql_connect);
// ...
?>
打破这种检查是可行的吗?还是我的怀疑完全错了,我应该找其他地方找弱点吗?
发布于 2015-06-22 23:43:16
简短回答:
通过if
语句进行密码检查是不够的。通过SQL注入和对身份验证脚本源代码的访问,它们拥有了完全访问所需的一切。
长答案:
我们已经确定您的auth脚本容易受到SQL注入的影响。您还将代码描述为非常老的、不变的代码。因此,我们可以合理地假设运行此应用程序的web服务器也是过时的。
如果在此服务器上启用了register_globals
,那么直接设置$_SESSION
值将非常容易--绕过if
语句密码检查。它只需使用以下URI提交GET请求即可:site.php?_SESSION[user_id]=12345
。
如果黑客能够上传他们自己的PHP文件,那么他们肯定能够获得您的身份验证脚本的完整代码,并确定是否启用了register_globals
。
Further reading关于register_globals
的安全含义。
这只是他们完全破坏您的应用程序的一种可能的方式。但是老实说,如果他们使用SQL来获取所有用户的凭据--和--他们已经将可执行文件上传到您的帐户,那么就有十亿种方法可以完全破坏您的应用程序。
发布于 2015-07-25 04:16:16
虽然不是详尽无遗的列表,但以下是绕过php密码检查的几种方法:
1)使用" union select '<?php system($_GET[cmd]); ?>',2,3,etc into outfile '/var/www/shell.php' --
的authentication有效载荷,这将创建一个后门,然后不通过身份验证检查。攻击者现在可以直接浏览到shell.php
2)使用基于错误的SQL注入检索用户表的内容,然后使用纯文本凭证登录。
3)使用联合查询返回静态值以及用户名和密码字段" union select 1,'password',privileges,etc from users --
这当然是假设这是实际的攻击矢量。
https://stackoverflow.com/questions/31216870
复制