Thứ Hai, 26 tháng 6, 2017

File upload - MIME type

Bài này thì không có gì phức tạp, tìm kiếm một lúc thì ra cả đống bài về dạng này !!!
Khi vào chall ta thấy có phần upload, click chuột vào đó thì nó cho ta một form để upload file

 
Nó chỉ cho phép upload các file có định dạng là gif, jpeg, png nói chung là file ảnh :))
Vậy giờ thử upload một file .php xem sao :D




 
Vậy là nó đã check file trước khi lưu file, dùng BurpSuite để check request:

 

Để upload được file php thì ta cần sửa trường Content-Type trong request thành : Content-Type : image/jpeg (cái này sửa thế nào cũng được, miễn sao cứ có phần mở rộng là file ảnh)
Upload lại php file và sửa trường Content-type:

 

 

Oke ta đã upload thành công php file lên server (có thể upload shell)




Sau đó click chuột vào mục upload thì ta có như hình dưới :





Click tiếp vào mshell, thì server nó sẽ thực thi file php này.
Vậy là lấy được password



Chall này đơn giản là khi ta upload file thì ở phía server chỉ có check MIME type(google for details) tức là ở đây nó chỉ kiểm tra trường Content-Type vì thế dễ dàng có thể bypass, lỗi này thường là do người lập trình không kiểm tra kỹ phần mở rộng của file trước khi lưu trên server.





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ỉ @@