[VNPT SecAthon 2018] sql33t

Đi thi CTF được gần 3 năm rồi mới được giải nhất 1 lần (mặc dù biết rất nhiều đội mạnh không tham gia).
Đáng lẽ ra đây là 1 chuyện đáng mừng nếu như đội mình - "đội J nào đó" không được gọi hồn lên.


Sau đây mình xin trình bày cách giải của mình về 2 bài web sql33t_1 và sql33t_2. 

Đề bài cho ta 2 trang web http://172.16.120.5:8081/ và http://172.16.120.5:8082/. 
2 trang này cơ bản giống nhau về phần giao diện và các chức năng. 

Đầu tiên thay vì chờ hint từ BTC thì mình xem html source của trang web, tìm được đường dẫn /pyc.
Sau khi tải về về dùng Easy Python Decompiler để lấy source code. 

(Việc này cũng tương đương với việc pwn server của BTC để lấy source code về).


Mã nguồn sql33t_1
Mã nguồn sql33t_2

Nghiên cứu source code ta thấy được mục tiêu của ta là để 2 câu truy vấn SQL trong code trả về kết quả là realJEDI thì flag sẽ được xuất ra.

Challenge sql33t_1

Ở thử thách này có 2 tham số ta có thể inject được vào là username side.
Giá trị truyền vào 2 tham số này được được filter qua hàm sql_filter addslashes.
Có một điểm cần lưu ý là SQLite không nhận ký tự backslash làm ký tự escape (tương tự bài Tower 2 của SVATTT 2016).
Như vậy ta có thể inject vào tham số username mà không cần quan tâm đếm hàm addslashes

http://172.16.120.5:8081/login?username='or(9-8)-- -&password=stormtrooper&side=Lightside

Việc inject đã được thực hiện thành công.
Ta brute force từng ký tự của trường password trong bảng Lightside để lấy ra realJEDI.


Flag => SECATHON{nothing_sp3c1al!}



Challenge sql33t_2

Ở thử thách này việc inject vào tham số username là không thực hiện được (hoặc do mình không biết làm) do hàm addslashes đã được chỉnh sửa lại.
Tuy nhiên vấn đề vẫn ở ký tự backslash khi ta có thể bypass được hàm addslashes thông qua ký tự null.
Ta thực hiện SQL Injection thông qua tham số side như sau

http://172.16.120.5:8082/login?username=stormtrooper&password=stormtrooper&side=Lightside`-- -

Vấn đề cuối cùng là phải để truy vấn trả về realJEDI. 
Tuy nhiên các từ khóa như from, where, limit, ... đều đã bị filter bởi hàm sql_filter nên ta sẽ dùng join on để truy vấn có điều kiện trên bảng Lightside.
Ta vẫn thực hiện brute force các ký tự của trường password tương tự bài sql33t_1

Flag => SECATHON{AWWWW!Master_of_SQL}










Nhận xét

Bài đăng phổ biến từ blog này

[VNPT SecAthon 2018] Modulus

[SVATTT2017 Final] The last bullet