# [HTB] Neonify Writeup
## Giới thiệu

Đập vào mắt là lấp la lấp lánh mấy cục kim cương và đúng một ô để nhập chữ. Và tính năng duy nhất cũng chỉ là nhập chữ và hiển thị ra màn hình thoi. Đơn giản nhưng khá màu mè hoa lá cành :))))
Bây giờ thì mở source code ra và mò xem có gì thú vị không
## Mục tiêu và đối tượng
1. Mục tiêu
1. Flag là file nằm trên máy victim chứ không nằm trong code như các lab khác
2. Đối tượng đáng ngờ
1. LOC 16 file index.erb (có khả năng sẽ injection ở đây được vì nhận từ input xong bỏ vào regex và render ra, nên là 50-50 sẽ có lỗi)
Với biến neon được nhận từ param và render ra phía màn hình, vì mình lần đầu đọc code Ruby nên là không hiểu lắm dấu ~= của ruby nên đã nhờ GPT giúp khá hay (fen cứng JS :))))))

Vậy là param neon sẽ chỉ nhận các kí tự là số từ 0 tới 9, các chữ từ a tới z và khoảng trắng (space)
## Thực hiện
Với những dữ liệu trên thì mình đành ngồi search GG có cách nào bypass hay không thôi.
Nếu bypass được thì mình mới tính đến chuyện Injection code để lấy file mà đọc thôi
Sau một hồi nghiên cứu thì mình thấy đối với Ruby có một cái khác biệt so với các ngôn ngữ khác đó là đối với Regex sẽ có một vài sự khác biệt
[link form validation](https://brakemanscanner.org/docs/warning_types/format_validation/)
Cặp dấu ^ và $ sẽ không lấy từ dòng mới, nghĩa là mình có thể bypass được regex khi dòng đầu mình nhập đúng format và xuống dòng mình sẽ injection vào đó
Hỏi GPT về kí tự new line của ruby thì mình đã có đáp án

vậy ta thử craft một request để test xem
```
neon=abc %0a <script>alert()</script>
```

Và kết quả là ta bypass thành công và gọi được alert ngay trong code. Đến đây thì mình có thể nghĩ đến cách để injection đối với Ruby (template ERB)
Mò hacktrick thì ra một vài cách sau
[hacktricks]: https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection#erb-ruby
Craft một payload để thử xem (%25 là urlencode của % sau một vài lần thử)
```
neon=abc %0a <script><%25= system("whoami")%25></script>
```

Hiện __true__ vậy là đã thực thi được command, bây giờ list xem có những file nào
```
neon=abc %0a <script><%25= IO.popen('ls').readlines() %25></script>
```

Đã thấy file flag, cat nó rồi lụm thoi
