Bài này bao gồm hai lỗi là SQLi và SSRF. Cùng phân tích nhé. 1. Phân tích: Procedure searchUser() bị dính lỗi SQL Injection khi biến name được nhúng trực tiếp vào chuỗi truy vấn. ![image](https://hackmd.io/_uploads/r1-_I665gx.png) Ở index.php có chỗ để trigger, rất rõ ràng: ![image](https://hackmd.io/_uploads/HJQEw6pcge.png) Tuy nhiên, `$name` lại được nhận từ `$SESSION['name']`, nhưng mình lại không thể injection trực tiếp bởi vì ở phần đăng ký chỉ cho phép `$name` là chữ và số: ![image](https://hackmd.io/_uploads/BJT5v66cxl.png) Nhưng lại có một chức năng đổi tên, tuy nhiên lại chỉ có local mới có thể trigger được: ![image](https://hackmd.io/_uploads/Hk0y_T6clx.png) File `communicate.php` có một phần bị lỗi SSRF, có thể dùng để trigger để đổi tên: ![image](https://hackmd.io/_uploads/H1iH_665ge.png) 2. Khai thác Đầu tiên, ở `communicate.php` chúng ta có thể thấy url được parse từ hàm parse_url(), chúng ta có thể khai thác bằng payload kiểu `1232://user:pass@127.0.0.1:80|motherland.com:80/` hoặc `1232://user:pass@127.0.0.1:80;motherland.com:80/` Khi parse thì nó sẽ là: ![image](https://hackmd.io/_uploads/B1RiF6T5ll.png) Phù hợp để bypass qua phần if phía dưới. Sau khi đã qua được SSRF, mình sẽ trigger SQL Injection. Ở đây, flag nằm trong file random tên, nên mình cần RCE. Cách tốt nhất là ghi nội dung file bằng hàm INTO OUTFILE. ![image](https://hackmd.io/_uploads/S1gfq66cxx.png) 3. POC ![image](https://hackmd.io/_uploads/S1O8cpa9xl.png) ![image](https://hackmd.io/_uploads/rJ8wc669xl.png) ![image](https://hackmd.io/_uploads/S1-o9aTcxg.png)