Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 7)

Tiếp theo nội dung Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 6), kỳ này tôi sẽ tiếp tục mân mê thằng Blind SQL Injection. Và trong kỳ, này tôi sẽ tiếp tục tăng độ khó lên với tình huống ứng dụng có khả năng xử lý lỗi từ SQL query đầy tinh tế.

Trong trường hợp này, ứng dụng sẽ chả buồn phản hồi gì với các đòn chọc ngoáy của tôi mà nó chỉ đáp lại bằng thái độ dửng dưng lạnh nhạt (tức là tôi sẽ chả có thấy khác biệt mịa gì trong response hoặc ép được ứng dụng phụt ra lỗi theo điều kiện thiết lập sẵn nữa). Lúc này, với phương châm còn thở còn gỡ, tôi sẽ thử vận may bằng cách trông cậy vô phương án kích hoạt time delay (tạm hiểu là tạo thời gian chờ trong quá trình xử lý) căn cứ theo các điều kiện thiết lập trong query.

Lưu ý:

#1. Thăm dò khả năng thao túng phản hồi của mục tiêu với thiết lập time delay trong Blind SQL Injection

Rồi, tôi vào việc ngay và luôn. Việc đầu tiên tôi cần làm là truy cập vào cái shop quen thuộc của bài Lab để túm cặp request/response có TrackingId cái đã.

TrackingID
TrackingID

Kế đến, tôi đẩy hàng qua Burp Suite Repeater và hiệu chỉnh lại request để kiểm nghiệm khả năng kích hoạt time delay (con số 10 trong cái pg_sleep(10) tương ứng với việc bắt ứng dụng ngồi đực mặt ra chờ 10 giây trước khi chạy bước xử lý tiếp theo) với:

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--

Test Time Delay
Test Time Delay

Lúc này nếu nhìn kết quả tôi sẽ chỉ thấy thấy response trả về như thông thường. Điều quan trọng tôi cần làm ở đây là theo dõi thời gian ứng dụng xử lý và trả về kết quả từ lúc tôi nhấn nút Send. Nếu thời gian xử lý xấp xỉ 10s thì tôi có thể vung tay chém gió vào không khí và hô to “Yes, you can!”.

Tôi hiệu chỉnh lại các điều kiện thiết lập trong query để xác nhận một lần nữa.

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--

Confirm Time Delay
Confirm Time Delay

1=2 trả về kết quả False dẫn đến nhánh pg_sleep(0) được thực thi nên lần này cái response phụt ra gần như tức thì mà không time delay gì cả. Như vậy tôi có thể xác nhận việc đút vào cái query điều kiện để kích hoạt time delay nhằm thao túc thời gian phản hồi của ứng dụng là khả thi.

#2. Xác nhận sự tồn tại của user administrator với điều kiện time delay

Cũng như các kỳ trước, tôi có thể cập nhật lại query để xác nhận sự tồn tại của user administrator trong bảng users kiểu như sau:

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Confirm Admin user
Confirm Admin user

Và việc ứng dụng chờ đợi gần 10s mới trả về response đã xác nhận cho tôi việc này.

#3. Xác định độ dài password với điều kiện time delay

Kế đến, tôi sẽ chuyển qua xác nhận độ dài của password cho ông administrator kiểu như sau:

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Confirm Password Length - 1
Confirm Password Length – 1

Tương tự như trên, sau khi dựa vào time delay để xác nhận việc độ dài password lớn hơn 1, tôi triển tiếp các query tiếp theo để xác nhận độ dài của password là 20.

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>20)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Confirm Password Length - 2
Confirm Password Length – 2

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>19)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Confirm Password Length - 3
Confirm Password Length – 3

#4. Xác định password với điều kiện time delay

#4.1 Xác định ký tự đầu tiên của password

Sau khi xác định xong độ dài password, tôi chuyển sang xác định ký tự đầu tiên của password. Việc này cũng sẽ cần đến sự trợ giúp của Burp Suite Intruder. Tôi đẩy hàng qua đấy, loại bỏ các thiết lập payload mặc định và thiết lập lại payload marker tại vị trí kí tự “a” để so sánh như sau:

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Get Password - 1
Get Password – 1

Ở đây, tôi cũng sẽ dùng payload simple list bao gồm các chữ a-z và số 0-9.

Get Password - 2
Get Password – 2

Vì ở đây, việc giám sát thời gian phản hồi của ứng dụng là quan trọng nên tôi sẽ cần thiết lập cho Intruder chạy các request lần lượt theo kiểu single thread. Việc thiết lập này sẽ được thực hiện trong phần Resource Pool với việc xác lập Maximum concurrent request thành 1.

Get Password - 3
Get Password – 3

Sau đó tôi xả đạn với Start Attack và thu lượm kết quả. Ở đây để quan sát được thời gian, tôi sẽ cần chọn thêm phần Respones received trong Columns menu.

Get Password - 4
Get Password – 4

Và sau đó tôi sort lại bảng kết quả theo cột Response received để xác định thằng nào có thời gian khoảng 10000 (ms) để hốt kết quả (ký tự “j” như bên dưới).

Get Password - 5
Get Password – 5

#4.2 Hốt trọn toàn bộ các ký tự của password

Quá trình tấn công ở trên có thể thực hiện thủ công thông qua việc lần lượt hiệu chỉnh chỉ số vị trí của ký tự trong password kiểu như sau:

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,2,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Tuy nhiên, tôi không có thời gian chơi trò thủ công mỹ nghệ nên sẽ thiết lập payload marker tại chỗ chỉ số vị trí của ký tự trong password luôn (đồng thời chuyển Attack type qua Cluster bomb).

TrackingId=1u9XarycOaBmAQH5'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,§1§,1)='§a§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

Get Password - 6
Get Password – 6

Sau đó thiết lập payload cho thằng chỉ số vị trí.

Get Password - 7
Get Password – 7

Và payload cho ký tự cần dò tìm tương tự như trước đó:

Get Password - 8
Get Password – 8

Rồi sau đó tôi lại xả đạn với Start attack và thu lượm kết quả (lưu ý với kiểu time delay thì quá trình tấn công sẽ hơi lâu đấy)

Get Password - 9
Get Password – 9

Sau đó tôi nhặt nhạnh các mãnh vỡ và sắp xếp lại password cho ông administrator:jtghh99tpfi0zotsi2tu rồi đút hàng vô vị trí đăng nhập để xác nhận kết quả quăng bom.

Login
Login

Phù, đến đây coi như tôi đã giới thiệu xong các chiêu trò phổ biến với SQL Injection attack. Ngoài mấy trò này, SQL Injection attack vẫn còn một chiêu cuối có sức công phá cực mạnh là sử dụng out-of-band techinques để đối phó với tình huống ứng dụng xử lý kiểu asynchronous – bất đồng bộ (nghĩa là cái trò time delay ở trên sẽ bị vô hiệu hóa). Tuy nhiên, để triển chiêu này hiệu quả bạn sẽ cần đến sự hỗ trợ của Burp Collaborator – tính năng chỉ có trên phiên bản Professional/Enterprise. Nếu có thể, tôi sẽ sắp xếp quay trở lại chém gió với nội dung này sau.

1 thought on “Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 7)”

Leave a Reply

Your email address will not be published. Required fields are marked *