Thứ Hai, 26 tháng 6, 2017

Server-side Template Injection

Viết để sau này cho tiện đọc lại, vì hay quên cách làm :(
Link chall: "http://challenge01.root-me.org/web-serveur/ch41/"
Như thói quen, thấy có text-box thì mình check XSS đơn giản thì chả thấy gì 😒 ....
Ctr+U thần thánh thì thấy có đoạn JavaScript với 2 function có tên là: checkSubmit() và checkNickname() ?
Ở đây chỉ cần quan tâm đến checkNickname() :



Nhìn vào đây có thể thấy hàm này sử dụng ajax trong jquery để gửi data từ client lên server:
url: serviceUrl (gửi data đến url: /web-serveur/ch41/check)
type : "POST" (dùng POST method)
data : postData (data được gửi đi nằm trong biến postData)

Nếu request thành công thì nó sẽ trả lại dữ liệu trong "data" và đổ vào thẻ <div> có id là "result", ngược lại thì đưa ra thông báo lỗi "An error occurs!".
Search google với keyword "Server-side Template Injection" thì khá nhiều tài liệu nói về loại lỗ hổng này, có thể lợi dụng nó để tấn công XSS,...etc. Không giống như XSS thì loại này cho phép server-side attack đặc biệt là thực hiện RCE ( đấy là google nó nói vậy ). Rồi sau đó thì làm gì để solve nó :(( --chịu rồi 😓---, lại search một hồi thì tìm được ví dụ liên quan và thử nhập vào text-box
như sau :








  


Sao nó lại trả lại giá trị là 6 ??? Tiếp tục thử với các phép toán như : +, - , / , % , * thì đều thu được kêt quả như phép tính bình thường. Oke lại search tiếp xem nó là gì thì tìm được site này http://docs.oracle.com/javaee/6/tutorial/doc/gjddd.html
nó là Empression Language được sử dụng trong template. Có thể thay $ thành # thì đều có cùng kết quả nhưng cách sử dụng của chúng lại khác nhau, đọc link trên sẽ rõ. Tiếp theo là tìm xem template engine được sử dụng là gì, thử với ${{3*2}} :

 

Xuất hiện lỗi thì có thể  đoán nó dùng FreeMarker hoặc Smarty( thằng Twig sẽ có dạng ${{...}}
 Lại google cho FreeMarker template injection, thì ra luôn đoạn RCE sau :  






Ôi cuộc đời nở hoa rồi :v 💆💆
Nói qua về <#assign> nó cho phép định nghĩa biến ngay trong template(http://freemarker.org/docs/dgui_misc_var.html), đoạn code trên tạo một tên biến là "ex" cái này đặt tùy ý, việc sử dụng Built-in "freemarker.template.utility.Execute"?new() cho phép tạo một object tùy ý, và nó là object của "Excute" Class được implement từ "TemplateModel". Ốp vào và dùng thôi ^_^


Capture response lại:

 

thay "ls" thành "cat SECRET_FLAG.txt"



 

Phải nói là google đẹp trai vãi @@
Lần đầu viết blog đọc cứ lủng củng thế éo nào ấy nhỉ @@

3 nhận xét: