PDA

View Full Version : Bảo Mật Cho IPB (Invision Power Board) Forum



vietanh143
19-10-2007, 08:44 PM
- CHMOD file conf_global.php thành "004" (có một số host ko hỗ trợ kiểu này)
- CHMOD thư mục chứa IBF thành "701"
- Tuyệt đối ko đặt user & pass database trùng với user & pass FTP

Đầu tiên tôi sẽ hướng dẫn cách đơn giản để dấu chuỗi index.php trên thanh trình duyệt.
- Các bạn dùng chức năng Search của Explorer để tìm toàn bộ trong thư mục của IBF chuỗi sau : index., sau đó bạn mở file đó ra và xóa index. đi.
- Mở file conf_global.php ra, và tìm đoạn này :

$INFO['php_ext'] = 'php';

- Bạn đổi thành :

$INFO['php_ext'] = '';

Từ giờ trở đi, IBF của bạn sẽ không còn index.php trên thanh address nữa.
Chú ý: Nếu bạn làm như vậy thì việc thử nghiệm trên localhost sẽ khó khăn với các form. Nhưng khi up lên web thì vẫn okie như thường

thủ thuật nhỏ : Các bạn có thể đổi tên file index.php thành index.php3 hoặc index.php4 để phòng tránh hacker view index.php.

Bạn có thể đổi tên index.php thành index.php3 hoặc index.php4 hoặc bất kỳ bằng cách :
Ví dụ chúng ta đã dấu index.php trên thanh Address và bây giờ muốn đổi tên file index.php thành file khác. Chẳng hạn như vidu.php đi nhé.
- Chúng ta tạo file .htaccess với nội dung như sau

DirectoryIndex vidu.php index.php index.php3 index.html

- Sau đó up lên thư mục chứa IBF. Thế là xong.
Lưu ý : có vài bạn không tạo được file .htaccess trong windows. Tôi xin up lên đây luôn. Các bạn chỉ cần download về và dùng trình soạn thảo text sửa vidu.php thành file của bạn là được.

Tiếp theo đây:
*Đổi tên thư mục :
- Các bạn dùng Explorer tìm tất cả file có text : sources/.
- Vào từng file, dùng chức năng Find and Replace (Mọi trình soạn thảo text đều hỗ trợ chức năng này).
- Bạn thay thế sources/ thành newfolder/ chẳng hạn (bạn có thể thay newfolder thành bất cứ tên gì bạn thích).
- Khi xong tất cả mọi file. Bạn thoát ra, và đổi tên thư mục sources thành tên mới của bạn.
Thế là xong.
PS : Áp dụng tương tự cho thư mục Skin.
*Đổi tên file admin.php
- Bạn dùng Explorer tìm file có chứa : admin.
- Thay thế bằng tên file admin mới, ví dụ : newadmin.php (Nếu bạn chưa dấu file index thì khi đổi chỉ cần nhập newadmin. là được, mình chỉ thế này để các bạn theo dõi từ đầu và làm theo cho dễ).
Đến đây bạn đã hoàn thành rồi đấy.

xin nhắc các bạn thêm điều này.
Nếu các bạn chưa nắm vững cách hoạt động của các file này thì delete ngay đi nhé :
ssi.php
show.php
phpinfo.php

Dấu file conf_global.php :
ở đây tôi xin hướng dẫn đổi conf_global.php thành abc.php

vào :
source/admin/admin_functions.php
tìm tất cả những từ conf_global.php thay bằng abc.php

Tìm trong 3 file : admin.php , index.php , ssi.php tất cả những từ conf_global.php thay bằng abc.php

Sau đó đổi file conf_global.php thành abc.php

Session ID :
+Bước 1:
Mở file ad_settings. php
Tìm code sau:

case 'dourl':
$this->save_config( array ( 'number_format', 'html_dir','safe_mode_skins', 'board_name','board_url','home_name','home_url', 'disable_gzip',
'html_url','upload_url', 'upload_dir', 'print_headers', 'header_redirect', 'debug_level', 'sql_debug' ) );
break;

thay bằng :

case 'dourl':
$this->save_config( array ( 'number_format', 'html_dir','safe_mode_skins', 'board_name','board_url','home_name','home_url', 'disable_gzip',
'html_url','upload_url', 'upload_dir', 'print_headers', 'session_hide', 'header_redirect', 'debug_level', 'sql_debug' ) );
break;

tìm tiếp :

$ADMIN->html .= $SKIN->add_td_row( array( "<b>Print HTTP headers?</b><br>(Some NT installs require this off)" ,
$SKIN->form_yes_no( "print_headers", $INFO['print_headers'] )
) );

thêm đường sau :

$ADMIN->html .= $SKIN->add_td_row( array( "<b>Hide Session ID?</b><br>(Removes Session ID from the URL)" ,
$SKIN->form_yes_no( "session_hide", $INFO['session_hide'] )
) );

bước2 mở index.php
tìm :

if ($ibforums->member['id'] and ( $std->my_getcookie('hide_sess') ) )
{
$ibforums->session_id = "";
}

thêm vào trước :

if ($INFO['session_hide'])
{
$ibforums->session_id = "";
}

+Bước 3:
Mở file conf_global. php
Thêm vào bất cứ đâu dòng code sau :

$INFO['session_hide'] = '1';

Code Pass cho Cpadmin, Cpmod :

Bạn dùng cách dưới đây để lập password cho cpadmin, và cpmod... để tránh khi bạn quên logout, người khác dùng nick bạn vào quậy phá forum

Demo :

http://vncool.com/forum/admin.php

Các bạn down load file : secondpass

unzip file đó ra sẽ được 3 file: auth.php, create_pwd.php, htpasswd.txt

file create_pwd.php được dùng để tạo pass cho bạn sử dụng

cách sử dụng:

up load file auth.php và htpasswd.txt vào folder có chứa file bạn muốn bảo vệ
open file bạn cần bảo vệ, đặt đoạn code sau vào đầu tiên của file

<?php include "auth.php";?>

up load file create_pwd.php lên host, đâu cũng được miễn là bạn có thể truy cập nó bằng internet explorer
dùng IE để truy cập vô file create_pwd.php, bạn sẽ thấy có dòng:

Enter your password:

bạn type pass word bạn muốn set vào ô bên cạnh, nhấn Encode
khi đó, bạn sẽ nhận được 1 dòng dạng:

Your password has been encoded as: 098f6bcd4621d373cade4e832627b4f6

phần đằng sau dấu ":" (đánh dấu đỏ) chính là password của bạn đã được mã hóa, tạm gọi là pass của bạn

bây giờ vào edit file htpasswd.txt trên host

bạn đổi chữ test thành tên khác mà bạn muốn,
bạn thay thế toàn bộ phần đằng sau dấu ":" bằng chính pass của bạn đã lấy được ở bước trên (bước dùng file create_pwd.php)
sau đó save file htpasswd.txt lại và đổi tên nó thành .htpasswd
bạn hãy chú ý tới dấu chấm đằng trước của tên file sau khi đổi tên nhé

bây giờ vào file bạn bảo vệ, bạn sẽ thấy nó sẽ hỏi pass trước khi cho phép bạn truy cập vào
user = user bạn đã nhập thay cho chữ test ở file htpasswd.txt
pass = pass của bạn

Xoá bỏ Session của IBF trên thanh Address :

Tiến hành như sau : mở file
functions.php .
Tìm dòng : $this->session_id = md5( uniqid(microtime()) );
thay bằng $this->session_id = "";
Xong .
Nhìn IBF gọn gàng & an toàn hơn.

Script giúp backup databse thường xuyên :

<?
$appname="Backup MySQL";
$copyright="©Le Van Chuong - VnToDaY";

function sqldumptable($table, $fp=0) {
$tabledump = "\n";
$tabledump.= "# Struc cua table: " .$table . "\n";
$tabledump.= "DROP TABLE IF EXISTS $table;\n";
$tabledump.= "CREATE TABLE $table (\n";

$firstfield=1;

$fields = mysql_query("SHOW FIELDS FROM $table");
while ($field = mysql_fetch_array($fields)) {
if (!$firstfield) {
$tabledump .= ",\n";
} else {
$firstfield=0;
}

$tabledump .= " $field[Field] $field[Type]";
if (!empty($field["Default"])) {
$tabledump .= " DEFAULT '$field[Default]'";
}
if ($field['Null'] != "YES") {
$tabledump .= " NOT NULL";
}
if ($field['Extra'] != "") {
$tabledump .= " $field[Extra]";
}
}
mysql_free_result($fields);

$keys = mysql_query("SHOW KEYS FROM $table");
while ($key = mysql_fetch_array($keys)) {
$kname=$key['Key_name'];
if ($kname != "PRIMARY" and $key['Non_unique'] == 0) {
$kname="UNIQUE|$kname";
}
if(!is_array($index[$kname])) {
$index[$kname] = array();
}
$index[$kname][] = $key['Column_name'];
}
mysql_free_result($keys);

while(list($kname, $columns) = @each($index)){
$tabledump .= ",\n";
$colnames=implode($columns,",");

if($kname == "PRIMARY"){
$tabledump .= " PRIMARY KEY ($colnames)";
} else {
if (substr($kname,0,6) == "UNIQUE") {
$kname=substr($kname,7);
}

$tabledump .= " KEY $kname ($colnames)";

}
}

$tabledump .= "\n);\n\n";
if ($fp) {
fwrite($fp,$tabledump);
} else {
echo $tabledump;
}

$rows = mysql_query("SELECT * FROM $table");
$numfields=mysql_num_fields($rows);
$datastruc = "# Data cua table: " .$table . "\n";
fwrite($fp,$datastruc);
while ($row = mysql_fetch_array($rows)) {
$tabledump = "INSERT INTO $table VALUES(";

$fieldcounter=-1;
$firstfield=1;
while (++$fieldcounter<$numfields) {
if (!$firstfield) {
$tabledump.=", ";
} else {
$firstfield=0;
}

if (!isset($row[$fieldcounter])) {
$tabledump .= "NULL";
} else {
$tabledump .= "'".mysql_escape_string($row[$fieldcounter])."'";
}
}

$tabledump .= ");\n";

if ($fp) {
fwrite($fp,$tabledump);
} else {
echo $tabledump;
}
}
mysql_free_result($rows);
}
// MAIN PROC
$server = "localhost";
$username = "root"; //username cua mysql
$password = "chuong2404"; // pass cua mysql
$tablebk = "phpbb"; // Ten table can luu tru
$pathtofilename =""; // duong dan den thu muc can luu tru

// Tinh ngay thang;
$ngaythang = $today = date("d")."_".date("m")."_".date("y")."__time".date("g")."_".date("i");

//open file
$filename = $pathtofilename."/backup_date".$ngaythang;
$filehandle=fopen($filename.".sql","w");

// Connect to mysql
$connect = mysql_connect($server,$username,$password);
if (!$connect) {
echo "khong ket noi duoc voi mysql";
exit;
}
mysql_select_db($tablebk);

// Header
$header = "##########################################\n";
$header.= "# Du lieu backup cua table: $tablebk #\n";
$header.= "# Ngay backup: " .$ngaythang ." #\n";
$header.= "#© by Le Van Chuong VnToDaY#\n";
$header.= "##########################################\n";
fwrite($filehandle,$header);
// end

$tablesbackup = mysql_query("SHOW tables");
while ($tablebackup = mysql_fetch_array($tablesbackup)) {
sqldumptable($tablebackup[0], $filehandle);
}
fwrite($filehandle, "\n\n\n");

fclose($filehandle);

$data = implode("", file($filename.".sql"));
$gzdata = gzencode($data, 9);
$fp = fopen($filename.".gz", "w");
fwrite($fp, $gzdata);
fclose($fp);

if (file_exists($filename.".sql")) {
unlink($filename.".sql");
}
?>

Lời kết : Trên đây là những kinh nghiệm để bảo mật IBF, đặc biệt là để chống hack local. Tuy nhiên, 1 điều quan trọng nhất mà bạn ko thể quên là phải cập nhật thường xuyên các bug (lỗi bảo mật) về IBF để fix ngay lập tức