bypass theo boy hiểu là một thuật ngữ dùng để chỉ cách vượt qua cổng login của 1 hệ thống nào đó (ở đây mình muốn nói đến các ứng dụng chứ ko phải server nhé). bằng cách nào đó, attacker có thể login vào được mà không cần password chính xác của admin. giống như bạn có cái chìa khoá vạn năng mà đi ăn cắp xe máy vậy (sướng lắm).
Tìm hiểu thêm về công nghệ một chút.
Các ứng dụng hiện nay, cả web application hay win application đều sử dụng mô hình 3 lớp gồm : lớp giao diện, lớp xử lý, lớp cơ sở dữ liệu.
- lớp giao diện chính là những gì mà người dùng nhìn thấy, như một trang web hay chương trình yahoo các bạn có thể nhìn thấy.
- lớp xử lý bao gồm những đoạn code để xử lý những sự kiện, ví dụ như khi bạn nhập user + pass cho yahoo msg, xong nhấn enter, chuyện gì xảy ra ? lớp xử lý này sẽ thực hiện các sự kiện đó.
- lớp cơ sở dữ liệu dùng để lưu trử thông tin, như các thông tin về tài khoản khách hàng, thông tin quản trị,...tuỳ theo mục đích của ứng dụng để làm gì. cơ sở dữ liệu được lưu trữ trên các hệ quản trị cơ sở dữ liệu (Mysql, Sql server, Oradcle, MS Access...)
Ví dụ :
Trích dẫn:
hxxp://daleosterloh.com/bug/index.php |
Nhấn vào thanh bar để xem kích thước thật. |
lúc này lớp xử lý sẽ thực hiện các câu truy vấn đến cơ sở dữ liệu để xem thông tin bạn nhập vào có đúng hay không, và sẽ thực hiện các mã kịch bản của nó.
Tại sao có thể bypass được ?
Để có thể bypass được một cách hoàn hảo, trước hết xin khẳng định các bạn phải hiểu trong lớp xử lý được viết những gì ? những ai đã đọc qua ebook của anh hieupc cũng có thể biết được vài từ khoá để bypass, tất cả những từ khoá đó do các attacker đã tấn công vào hệ thống, xem source và đưa ra, vì các site thường dùng chung 1 source (mua từ đâu đó) nên chết là chết chùm.
Bây giờ mình sẽ phân tích đoạn code trên để các bạn hiểu rõ tại sao có thể bypass được nhé.
Sau khi các lớp giao diện gửi dữ liệu về thì ở phần xử lý này ta có 2 biến $username + $password
là 2 biến chứa user và pass mà người dùng nhập vào
Nhấn vào thanh bar để xem kích thước thật. |
bỏ qua những thứ rườm rà, các bạn tập trung vào câu query
select * from users where username='".$username."' and password='".$password."'
và câu if :
if($list_rows > 0)
{
header("Location: manage.php?hcegroup=1");
}
else
{
header("Location: error.php");
}
có ý nghĩa như sau :
Query chọn ra tất cả thuộc tính (username, password...) từ table users với điều kiện username=user đã nhập, password = password đã nhập.
if : nếu như số lượng dòng trả về > 0 thì cho vào, không thì từ chối
đến đây mình chưa thấy lỗi, bài toán khá login : tìm trong cơ sở dữ liệu có tồn tại user + pass đó, nếu số lượng lớn hơn 0, có nghĩa là tồn tại, thì cho vào, ko thì deny.
ở đây giải thích thêm tại sao dùng ($list_rows > 0), thường trong database thì user chỉ có một, nên nếu tìm thấy giá trị thì nó là 1, một số lập trình viên thay vì viết =1 thì viết thành >0.
bypass là đây
bây giờ bạn nhập user = abcd và password = ' or '1'='1 thay phần màu đỏ ở trên nhé. câu query sẽ như thế này :
select * users where user = 'abcd' and password ='' or '1'='1'
câu trên được hiểu quá đơn giản, ko cần quan tâm user là gì, pass là gì, vì '1'='1' là 1 điều kiện hiển nhiên đúng, nên tất cả user có trong bảng sẽ được select ra, vì thế số lượng users tìm được luôn lớn hơn 0 (trừ khi trong database chẳng có user nào). lúc này bạn qua được câu lệnh if và vào được trang admin.
, nếu các bạn hiểu được những gì mình viết trên thì ở đây các bạn có thể suy luận ra là đâu cần phải nhất thiết là '1'='1', có thể là '1'<>'0' hoặc 1>0 hoặc 'a' ='a hoặc 'a'<>'b, miễn sao là 1 điều kiện đúng được chèn vào câu query là được , như vậy có hàng tỷ cách để bypass
trong phần này mình muốn giải thích thêm cho các bạn về dấu ' , dấu -- khi bypass, hồi trước lúc mới đọc mình cũng thắc mắc. ví dụ by pass cổng login trên bằng pass : ' or '1'='1
tại sao có dấu ' ở đầu, tại sao ở cuối số 1 không có dấu ' ?
hãy nhìn câu select : (đừng quan tâm đến dấu " nhé)
select * from users where user ='' and password=''
khi user & pass của bạn đưa vào nó được đặt giữa 2 dấu '', cho nên đề theo đúng cú pháp các bạn phải đặt như thế này
select * from users where user ='abcd' and password='' or '1'='1'
chỗ này viết tut khó nói quá, nên mong các bạn suy nghĩ, chẵng qua là nó đóng dấu '' thằng sql nó ko nhận các giá trị mình đưa vào là chuổi thôi
dấu -- dùng để chú thích cho 1 dòng, khi bạn thêm dấu -- vào thì những ký tự sau nó sẽ không còn ý nghĩa với sql
ví dụ pass trên mình có thề dùng password : ' or '1'='1'--
thi thêm vào thì câu lện như thế này
select * from users where user ='abcd' and password='' or '1'='1'--'
lúc này dấu ' nằm sau -- sẽ ko còn tác dụng, do đó câu lệnh ko bị lỗi :*
kết : tất cả những gì mình viết đều dựa trên những gì mình hiều được, có thể đúng, cũng có thề có phần sai đâu đó, có thể ai cũng biết, nhưng có thể có vài người ko bít, hy vọng các bạn đóng góp thêm vào. nếu các bạn có thể hiểu được thì chuyện bypass chẳng là gì khi đã có source
những điều trên có thể nhiều bạn ko hứng thú, vì có thể nó chả dễ hack được site nào đâu. nhưng khi các bạn đi làm sẽ bị người ta hack.
soure : HCE