Skip to content
Tags

SQL injection - Insert

Estimated time to read: 5 minutes

May 06, 2023


Tài nguyên của challenge này tại https://www.root-me.org/en/Challenges/Web-Server/SQL-injection-Insert

Link challenge này tại http://challenge01.root-me.org/web-serveur/ch33/

Tổng quan

Trong challenge này, mục tiêu của ta là lấy flag

Kịch bản tấn công

Bước 1: Kiểm tra website

Challenge này cung cấp cho ta 2 website: 1 cho việc login tài khoản , 1 cho việc đăng kí tài khoản (trang register)

Ta thử đăng kí tài khoản với user=abc, password=abc, email=abc@gmail.com thì nhận được kết quả là đăng kí thành công.

Image title

Hình ảnh mô tả kết quả đăng kí tài khoản

Ta thử đăng kí tài khoản với user=admin, password=admin, email=admin@gmail.com thì nhận được kết quả là tài khoản đã tồn tại.

Image title

Hình ảnh mô tả kết quả đăng kí tài khoản

Tuy nhiên, sau một vài phép thử ta biết được trường email không được filter đầu vào cụ thể nếu ta nhập user=a, password=a, email=a thì vẫn được chấp nhận.

Bước 2: Tạo cơ sở dữ liệu và testing payload

Roài, ta thử tạo 1 cơ sở dữ liệu gồm bảng member để test một vài câu lệnh insert xem tình hình như thế nào...

Tổng quan để thêm thông tin user=a, password=a, email=a vào bảng member gồm 3 trường (username, password, email) ta có cú pháp câu lệnh như sau:

insert into member (username, password, email) values ('a', 'a', 'a');

hoặc

insert into member values (username, password, email), ('a', 'a', 'a'); 

Image title

Hình ảnh mô tả kết quả thêm thông tin vào bảng trong cơ sở dữ liệu

Uầy uầy, nhìn quen quen nhể ::))

Câu hỏi

Chuyện gì xảy ra nếu ta tiêm email = abc') ?

Trả lời câu hỏi

Ngay lập tức câu lệnh insert into member values (username, password, email), ('a', 'a', 'a'); thành

insert into member values (username, password, email), ('a', 'a', 'abc')');

Uầy uầy ::), đến đây ta có thể tiêm thêm vài câu lệnh như email = abc'), ('aa', 'aa', (select version())) để thêm ngầm 1 tài khoản có email chính là phiên bản sql hiện tại

Image title

Hình ảnh mô tả kết quả thêm thông tin vào bảng trong cơ sở dữ liệu

Tiếp theo, ta vào challenge và tiêm payload nhằm mục đích show table INFO bằng username=kk, password=kk, email=a'),('something','something',(select group_concat(INFO) from information_schema.processlist limit 1));#

Image title

Hình ảnh mô tả kết quả thêm thông tin vào bảng trong cơ sở dữ liệu

Ta thấy được bảng membres. Roài ta sẽ tiến hành xem username trong bảng membres bằng zzzz'),('something1','something1',(select username from membres limit 0, 1));# thì nhận được kết quả request fail. Lúc này ta chưa hiểu lý do tại sao luôn, ngồi ngẫm nghĩ mãi và thử case này trên db của mình, thì mới thấy được thông báo

ERROR 1093 (HY000): Table 'member' is specified twice, both as a target for 'INSERT' and as a separate source for data

Image title

Hình ảnh mô tả kết quả thêm thông tin vào bảng trong cơ sở dữ liệu

Và đây chính là vấn đề, này là tính năng của SQL rùi ::). Nên ta phải làm gì đó khác thôi....

Sau một hồi lang thang trên mạng, tôi biết rằng ta cần tìm kiếm một bảng nào đó đáng nghi ngờ trong information_schema.tables. Và yeah, sau quá trình Brute force thì ta nhận được trong information_schema.tables có bảng flag.

Brute force theo select table_name from information_schema.tables limit {0},1

Tiến hành tìm flag thôi nào, dùng 1 case username=abcd, password=abcd, email=a'),('2222','2222',(select * from flag limit 0, 1));# ta sẽ có flag

Image title

Hình ảnh mô tả kết quả thêm thông tin vào bảng trong cơ sở dữ liệu

Flag

moaZ63rVXUhlQ8tVS7Hw

[^1] Xem hướng dẫn cài đặt sqlmap tại https://sqlmap.org/

Comments