Nei*_*eil 14 php security hash cryptography sql-injection
我只是有一个网站来管理,但我不太确定前一个人写的代码.我正在粘贴下面的登录程序,您能看看并告诉我是否存在任何安全漏洞?乍一看,似乎可以通过SQL注入或操纵cookie和?m =参数进入.
define ( 'CURRENT_TIME', time ()); / / Current time.
define ( 'ONLINE_TIME_MIN', (CURRENT_TIME - BOTNET_TIMEOUT)); / / Minimum time for the status of "Online".
define ( 'DEFAULT_LANGUAGE', 'en'); / / Default language.
define ( 'THEME_PATH', 'theme'); / / folder for the theme.
/ / HTTP requests.
define ( 'QUERY_SCRIPT', basename ($ _SERVER [ 'PHP_SELF']));
define ( 'QUERY_SCRIPT_HTML', QUERY_SCRIPT);
define ( 'QUERY_VAR_MODULE', 'm'); / / variable contains the current module.
define ( 'QUERY_STRING_BLANK', QUERY_SCRIPT. '? m ='); / / An empty query string.
define ( 'QUERY_STRING_BLANK_HTML', QUERY_SCRIPT_HTML. '? m ='); / / Empty query string in HTML.
define ( 'CP_HTTP_ROOT', str_replace ( '\ \', '/', (! empty ($ _SERVER [ 'SCRIPT_NAME'])? dirname ($ _SERVER [ 'SCRIPT_NAME']):'/'))); / / root of CP.
/ / The session cookie.
define ( 'COOKIE_USER', 'p'); / / Username in the cookies.
define ( 'COOKIE_PASS', 'u'); / / user password in the cookies.
define ( 'COOKIE_LIVETIME', CURRENT_TIME + 2592000) / / Lifetime cookies.
define ( 'COOKIE_SESSION', 'ref'); / / variable to store the session.
define ( 'SESSION_LIVETIME', CURRENT_TIME + 1300) / / Lifetime of the session.
////////////////////////////////////////////////// /////////////////////////////
/ / Initialize.
////////////////////////////////////////////////// /////////////////////////////
/ / Connect to the database.
if (! ConnectToDB ()) die (mysql_error_ex ());
/ / Connecting topic.
require_once (THEME_PATH. '/ index.php');
/ / Manage login.
if (! empty ($ _GET [QUERY_VAR_MODULE]))
(
/ / Login form.
if (strcmp ($ _GET [QUERY_VAR_MODULE], 'login') === 0)
(
UnlockSessionAndDestroyAllCokies ();
if (isset ($ _POST [ 'user']) & & isset ($ _POST [ 'pass']))
(
$ user = $ _POST [ 'user'];
$ pass = md5 ($ _POST [ 'pass']);
/ / Check login.
if (@ mysql_query ( "SELECT id FROM cp_users WHERE name = '". addslashes ($ user). "' AND pass = '". addslashes ($ pass). "' AND flag_enabled = '1 'LIMIT 1") & & @ mysql_affected_rows () == 1)
(
if (isset ($ _POST [ 'remember']) & & $ _POST [ 'remember'] == 1)
(
setcookie (COOKIE_USER, md5 ($ user), COOKIE_LIVETIME, CP_HTTP_ROOT);
setcookie (COOKIE_PASS, $ pass, COOKIE_LIVETIME, CP_HTTP_ROOT);
)
LockSession ();
$ _SESSION [ 'Name'] = $ user;
$ _SESSION [ 'Pass'] = $ pass;
/ / UnlockSession ();
header ( 'Location:'. QUERY_STRING_BLANK. 'home');
)
else ShowLoginForm (true);
die ();
)
ShowLoginForm (false);
die ();
)
/ / Output
if (strcmp ($ _GET [ 'm'], 'logout') === 0)
(
UnlockSessionAndDestroyAllCokies ();
header ( 'Location:'. QUERY_STRING_BLANK. 'login');
die ();
)
)
////////////////////////////////////////////////// /////////////////////////////
/ / Check the login data.
////////////////////////////////////////////////// /////////////////////////////
$ logined = 0, / / flag means, we zalogininy.
/ / Log in session.
LockSession ();
if (! empty ($ _SESSION [ 'name']) & &! empty ($ _SESSION [ 'pass']))
(
if (($ r = @ mysql_query ( "SELECT * FROM cp_users WHERE name = '". addslashes ($ _SESSION [' name'])."' AND pass = ' ". addslashes ($ _SESSION [' pass']). " 'AND flag_enabled = '1' LIMIT 1 ")))$ logined = @ mysql_affected_rows ();
)
/ / Login through cookies.
if ($ logined! == 1 & &! empty ($ _COOKIE [COOKIE_USER]) & &! empty ($ _COOKIE [COOKIE_PASS]))
(
if (($ r = @ mysql_query ( "SELECT * FROM cp_users WHERE MD5 (name )='". addslashes ($ _COOKIE [COOKIE_USER ])."' AND pass = '". addslashes ($ _COOKIE [COOKIE_PASS]). " 'AND flag_enabled = '1' LIMIT 1 ")))$ logined = @ mysql_affected_rows ();
)
/ / Unable to login.
if ($ logined! == 1)
(
UnlockSessionAndDestroyAllCokies ();
header ( 'Location:'. QUERY_STRING_BLANK. 'login');
die ();
)
/ / Get the user data.
$ _USER_DATA = @ Mysql_fetch_assoc ($ r);
if ($ _USER_DATA === false) die (mysql_error_ex ());
$ _SESSION [ 'Name'] = $ _USER_DATA [ 'name'];
$ _SESSION [ 'Pass'] = $ _USER_DATA [ 'pass'];
/ / Connecting language.
if (@ strlen ($ _USER_DATA [ 'language'])! = 2 | |! SafePath ($ _USER_DATA [ 'language']) | |! file_exists ( 'system / lng .'.$_ USER_DATA [' language '].' . php'))$_ USER_DATA [ 'language'] = DEFAULT_LANGUAGE;
require_once ( 'system / lng .'.$_ USER_DATA [' language'].'. php ');
UnlockSession ();
roo*_*ook 20
是的,此代码中存在一些漏洞.
这可能是一个问题:
define ( 'QUERY_SCRIPT', basename ($ _SERVER [ 'PHP_SELF']));
Run Code Online (Sandbox Code Playgroud)
PHP_SELF是不好的,因为攻击者可以控制这个变量.例如,PHP_SELF当您使用此URL访问脚本时尝试打印:http://localhost/index.php/test/junk/hacked .尽可能避免使用此变量,如果使用它,请确保对其进行消毒.使用此变量时,通常会看到XSS突然出现.
第一个漏洞:
setcookie (COOKIE_USER, md5 ($ user), COOKIE_LIVETIME, CP_HTTP_ROOT);
setcookie (COOKIE_PASS, $ pass, COOKIE_LIVETIME, CP_HTTP_ROOT);
Run Code Online (Sandbox Code Playgroud)
这是一个相当严重的漏洞.如果攻击者在您的应用程序中有SQL注入,那么他们可以立即获取md5哈希和用户名并立即登录,而不必破坏md5()哈希值.就像您以明文形式存储密码一样.
这个会话漏洞是双重的,它也是一个"不朽的会话",会话ID必须始终是大的随机生成的值到期.如果他们没有过期,那么他们就更容易暴力.
您永远不应该重新发明轮子,session_start()在应用程序的最开始时调用,这将自动生成一个到期的安全会话ID.然后使用会话变量$_SESSION['user']来跟踪浏览器是否实际登录.
第二个漏洞:
$ pass = md5 ($ _POST [ 'pass']);
Run Code Online (Sandbox Code Playgroud)
md5()被证明是不安全的,因为故意产生碰撞.md5()永远不 应该用于密码.你应该使用sha2系列的成员,sha-256或sha-512是很好的选择.
第三个漏洞:
我没有看到任何CSRF保护您的身份验证逻辑.我怀疑您的应用程序中的所有请求都容易受到CSRF的攻击.
| 归档时间: |
|
| 查看次数: |
2131 次 |
| 最近记录: |