Chủ Nhật, 24 tháng 5, 2020

Bypass là gì?

Trong lập trình sử dụng tới database, mysql, sqlsever,... khi xử lý code phần sever bạn thường nghe thuật ngữ Bypass trong đăng nhập.

Nay mình viết bài này giúp các bạn hiểu rõ hơn thuật ngữ Bypass này hơn.

bypass-la-gi-trong-login-dang-nhap.jpg

1. Bypass là gì?
  • Bypass là thuật ngữ dùng để chỉ cách vượt qua cổng đăng nhập, login của hệ thống websitephần mềm,... nào đó.
  • Hacker sử dụng các thủ thuật trên cổng kết nối để đăng nhập vào tài khoản admin, tài khoản quản trị mà không cần mật khẩu và user chính xác.
2. Bypass hoạt động như thế nào?
  • Trong lập trình web, phần mềm, application chúng ta thường lập trình theo trình tự: tầng giao diện (tầng người dùng nhìn thấy, giao diện web, ứng dụng word, excel,..), tầng code behind (Code C#, C++, PHP, Java,..), tầng xử lý cơ sở dữ liệu (sql, mysql, oracle, LingQ, Access...). Ngoài ra lập trình viên còn sử dụng các mô hình như: mô hình 3 lớpmô hình MVC,..
  • Khi ta sử dụng các mô hình, hay các tầng giao diện trên phần quản trị dữ liệu, bảo mật dữ liệu là phần không thể thiếu của 1 hệ thống hoặc 1 website. Phần quản trị này hầu hết phải sử lý các sự kiện đăng nhậplogin để chống hacker lấy và phá dữ liệu bảo mật. Xử lý đăng nhập được mã hóa bởi UserName (tên đăng nhập) và Password (mật khẩu).
VD: 1 trang login như sau để đăng nhập vào quan trị dữ liệu
Mã:
https://itseovn.com/demo/login/index.html
Ví dụ 1 đoạn code và cách bypass như sau:
  • Code trong sql xử lý truyền thông tin uesername và password.
Mã:
select * from username where username=' "  +  @username + " ' and password=' "  +  @password + " '
  • Xử lý xong câu lệnh trên ta sẽ cho dữ liệu vào 1 datatable hoặc datarow. Sau đó xử lý dữ liệu này như sau:
Mã:
DataTable dt = new DataTable();
dt=..... câu lệnh kết nối lấy dữ liệu từ SQL trên.
if(dt.rows.count >0)
{
          //truy cập vào trang quản trị dữ liệu.
}
else
{
         //báo lỗi không đúng username mật khẩu.
}
Diễn giải code:
  • Khi code truyền vào SQL với 2 tham số người dùng nhập vào là @username=123456 và @password=654321, nếu có dữ liệu thì DataTable dt sẽ có 1 dòng dữ liệu (có thể có 1 hoặc 2 vì nhiều khi dữ liệu bạn bị lỗi gì đó). Và câu SQL sẽ được truy cập là:
Mã:
select * from username where username=' 123456 ' and password='654321'
  • Lệnh if sẽ kiểm tra nếu có dữ liệu thì cho phép truy cập vào trang quản trị dữ liệu, bảo mật thông tin. Còn sai sẽ thông báo không đúng thông tin tài khoản.
Bypass sẽ thực hiện tại bước này.
  • Với câu SQL trên thay vì người dùng nhập @username và @password như trên, người dùng sẽ nhập khác là
Mã:
@username=123456 và @password='  or '1'='1
  • Câu SQL sẽ bị đổi là:
Mã:
select * from username where username = ' 123456 ' and password = ' ' or '1'='1'
  • Câu SQL này có nghĩa là không cần quan tâm tới username và passowrd nhập vào chỉ cần 1=1 là sẽ cho ra 1 dòng dữ liệu (1 thì lúc nào mà không bằng 1), nên câu lệnh luôn đúng.
  • Code trong lệnh IF kiểm tra có dữ liệu và cho truy cập vào tài quản quản trị dữ liệu (thế là hacker có thể làm bất kỳ điều gì mình muốn với tài khoản này).
Điều kiện khác của '1'='1':

Ngoài điều kiện '1'='1' ra ta có thể chế thêm các điều kiện khác như:
  • '1' <> '0' : nghĩa là nếu 1 khác 0, 1 không phải là số 0 (1 lúc nào cũng khác không và không phải là số 0 rồi).
  • 2 > 1 : 2 lớn hơn 1.
  • 'b' = 'b' ,... và hàng ngàn, hàng tỷ cách viết khác.
Bypass khác:
  • Dấu -- trong sql và mysql được hiểu là chú thích, không xử lý tới dữ liệu sau dấu -- này.
  • Chính vì dấu -- ta có thể tùy biến thêm để câu lệnh ' or '1'='1 không có khả năng bị lỗi và có thêm các lệnh xử lý phía sau bằng cách chèn thêm như sau: ' or '1'='1 --
  • Truyền thêm ' or '1'='1 -- thì SQL sẽ được đổi như sau:

Không có nhận xét nào:

Đăng nhận xét