Netsky(VNISS)
Blind Sql Injection
Trước hết phải nói đây là bài cũ rùi, nhưng sau bài này mình sẽ có thêm 1 ví dụ cụ
thể chăc sẽ dễ chịu hơn với những ai chưa rõ lắm ( chỉ sợ ai cũng rõ rồi thì phí
công wé )
Bài lấy trong kho nhé :
Bài này là bài dịch đầu tay hay sao á
Dựa theo bài viết của : Kevin Spett
Nói qua 1 chút , nếu khai thác theo lỗi SQL injection thông thường ta khai thác qua
các error message gửi về từ server .Tuy nhiên 1 số admin đã ngăn việc hiển thị các
error message nhưng thật đáng tieec như thế là ko đủ
Nếu như bạn ko nhận được các error message thì đừng lo vì rất có thể chúng ta vẫn
khai thác thông tin được qua "blind" sql injection .
Phát hiện lỗi "blind sql injection":
1 URL như sau :
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ư:
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
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 :
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ề
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 )
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 :
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:
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
< 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 :
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
Chúc vui , pi pi
Pip(vniss)
trang này bị lỗi blind, tiếc là mình chưa hoàn thành
việc khai thac của nó .
Đầu tiên check xem có bị blind hay ko:
Sau khi mình thử :
( thêm 1 dấu nháy ) ta được:
Có vẻ rùi đây, tiếp theo để chắc chắn ta thử :
and 1=1
thì thấy đựoc:
Vậy là dính Blind rùi:
Bắt đầu khai thác nhé :
ES),1,1)))%3E1
Các bạn để ý ở đây mình dùng table khác thôi còn lại đều tương tự hết.CÁc hàm
substring, ascii các bạn ko hiểu nên đọc thêm 1 chút nhé.
Khi tôi chạy link trên thì lại đuợc :
Tất nhiên là đúng rồi vì ở đây tôi so sánh mã ascii của kí tự đầu tiên của tên table
đầu tiên với 1 mà.
Ta sẽ thực hiện đoán tên table như bài trên đa nói, chỉ thay %3E1 ( thực chất là >1
) băng >xyz nào đó. Cứ làm dần dần giới hạn lại sẽ ra. Chỉ chú ý là khi đoán kí tự
thứ 2 ta thay INFORMATION_SCHEMA.TABLES),1,1)))%3E1 bằng 2 nhé. Cứ
thế mà đi lên.
Nghe tưởng phức tạp nhưng ko hề đâu
Tôi đựơc table đâu tiên là donhang_hk
Để xác định table thứ 2 ta dùng where table_name not in ('donhang_kh').
_SCHEMA.TABLES where table_name
not in ('donhang_kh')),1,1)))%3E1
Nhưng nếu bạn chạy link trên nó sẽ lại báo failed (tưc là hiện ra trang lỗi ý )
Chứng tỏ đã lọc dấu nháy rùi, vậy ta chuyển qua dung hàm char():
Ta được như sau :
))),1,1)))%3E1
CỨ thế tiếp tục như cách thử đê tim table 1 ta được table thứ 2:
admin
Rất may mắn chứ thử nưa cũng mệt
Tiếp theo ta lấy các giá trị column trong table admin: cái này thì làm nư bth thôi
chỉ chú ý các bạn phải dùng char()
Sau đây là các column tôi lấy được:
admin_id , admin_username, admin_password admin_name
Cuối cùng là truy vấn vào cac column để lấy giá trị : Tiêc là đoạn này tịt mệt quá
cũng nen thèm làm nữa
Mình với anh DH đã thử thì có biêt trong column có record nhưng ko hiểu sao vẫn
ko lấy đựơc giá trị của nó. Toàn bào failed.
Ai làm được thì lên tiếng nhé:
P/S:
Đang đói nên viết ko văn và hay lắm, sơ lược thôi. Các bạn nên từ đó và tìm hiểu
sẽ thấy thú vị và thich hơn khi đạt được thanh quả.
Chuc vui
pip(vniss)