Back to Blog

#zerggling - web

#Phân tích

Ứng dụng khi vào yêu cầu đăng nhập, ta đăng ký tài khoản rồi đăng nhập vào

Kiểm tra mã nguồn ta cũng thấy khá nhiều endpoint, flag ở trong db nên lỗ hổng ta cần tìm có lẽ là sql injection

Ta kiểm tra param type tại listtype.php

Ta thấy ở phiên bản cũ nó không so sánh chặt chẽ == thay vì === cũng như chỉ replace các kí tự nhưng không đủ, và trong mã nguồn ứng dụng này đang sử dụng phiên bản cũ đó dẫn tới SQL Injection

Nhưng param type này được bọc khá chặt chẽ Ở common.php Tất cả các tham số dù method là GET hay POST đều loại bỏ slash cũng như escape nếu là các kí tự đặc biệt rồi đến preg_replace tại listtype.php

Nếu biến type chứa các kí tự trong khi sẽ bị thay thế thành rỗng, và ở dưới nó còn kiểm tra xem type có phải là từ 1 đến 5 không, nếu không thì sẽ không thực thi mà alert luôn

Luồng khi paramtype thỏa mãn tất cả điều kiện, nó sẽ đi vào hàm set_type

Tại hàm run tại file này, giá trị $this->type được sử dụng trực tiếp để tạo một phần của điều kiện WHERE trong câu truy vấn SQL

Sau đó các điều kiện được kết hợp thành query hoàn chỉnh

Bảng g5_shop_item nhưng trong code là g5_shop_item_table là trong install _db.php

Trong bảng g5_shop_item có 90 columns, giờ ta cần UNION để lấy thông tin từ cột flag từ bảng FLAG, nhưng vì dấu cách cũng không hợp lệ, ta có thể sử dụng /**/ là comment trong SQL, và ta để flag ở vị trí thứ 7 vì nó là cột name sẽ hiển thị ra để ta thấy

#Reproduce

payload:

sql
1/**/UNION/**/SELECT/**/1,2,3,4,5,6,flag,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90/**/FROM/**/FLAG/**/--