#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:
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/**/--