背景:
我一年前制作的一个网站最近遭到袭击;剥削者设法访问我为客户端制作的PHP前端,用于上传文件,他们设法上传一些包含漏洞的PHP文件,比如基于PHP的文件管理器。如果有兴趣,我可以发布每个上传的PHP文件的内容,但问题当然是他们设法访问客户端的前端。
网站自首次制作以来一直没有更新(它使用旧的和不推荐使用的MySQL函数而没有mysql_real_escape_string()
来检查登录面板中的输入(我知道)),但是我&#39 ;我不完全确定通过SQL注入他们设法获得访问权。
vhost在Windows / Parallels Plesk上运行,我既没有SSH访问权限也没有访问日志:我已经与托管服务提供商打开了一张要求提供日志的票证,但是我这样做了。我不确定他们是否可以提供他们以及需要多少钱,所以在此期间不要冒任何风险,我试图自己利用这个可疑的缺陷。
我能够在用于检索用户数据的SQL语句中执行注入以绕过用户检查,但是我无法在之后立即中断密码检查,这是用PHP完成。
TL; DR
以下是用于检索用户数据和检查密码的相关代码段:我能够在SQL语句中执行注入(例如,使用" OR ""="
作为用户名),但是我和#39; m无法在以下情况后立即中断密码检查:
<?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);
// ...
?>
打破这样的检查是否可行?或者我对自己的怀疑完全错了,我应该到别处寻找弱点?
答案 0 :(得分:4)
简答:
通过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注入来获取所有用户和的凭据,他们将可执行文件上传到您的帐户,那么他们有十亿种方式可以完全破坏您的应用程序。
答案 1 :(得分:0)
虽然不是一个详尽的列表,但这里有几种方法可以绕过php密码检查:
1)使用" union select '<?php system($_GET[cmd]); ?>',2,3,etc into outfile '/var/www/shell.php' --
的SQL注入有效负载,这将创建一个后门,然后验证检查失败。攻击者现在可以直接浏览到shell.php
2)使用基于错误的SQL注入来检索用户表的内容,然后使用纯文本凭据登录。
3)使用联合查询返回静态值以及用户名和密码字段" union select 1,'password',privileges,etc from users --
这当然是假设这是实际的攻击向量。