DVWA - CSP
악의적인 스크립트의 실행을 제한하여 XSS (Cross-Site Scripting) 공격을 방지하는 기술이다. 그러나 잘못된 구성이나 약점이 존재할 경우 CSP를 우회할 수 있는 공격 기법들이 존재할 수 있다.
LOW
허용되는 웹페이지 한정으로 include해주는 것 같다.
View Source)
$headerCSP는 Content-Security-PolicyHTTP 헤더를 설정하기 위한 문자열이다.
이 문자열은 script-src지시자를 포함하며, self(현재 페이지의 출처),
https://pastebin.com, hastebin.com, www.toptal.com, example.com, code.jquery.com, https://ssl.google-analytics.com 출처에서 JavaScript 스크립트를 로드하는 것을 허용한다.
header()함수를 사용하여 위에서 정의한 $headerCSP문자열을 Content-Security-Policy헤더로 설정한다. 이렇게 하면 브라우저는 해당 출처에서 로드된 JavaScript 파일만 허용하고, 다른 출처에서 로드된 JavaScript 파일을 실행하지 않도록 제한된다.
만약 $_POST['include']변수가 설정되어 있다면, 해당 변수의 값을 이용하여 script태그를 생성하고 $page['body']문자열에 추가한다. 이렇게 하면 사용자가 입력한 URL에 해당하는 JavaScript 파일이 현재 페이지에 동적으로 포함된다.
<script src='" . $_POST['include'] . "'></script> 코드를 통해 신뢰된 사이트에서 진행했지만 제대로 작동이 안되서 로컬에서 진행하였다.
Medium
View Source)
low레벨과 달리 인라인 자바스크립트를 금지하기 위해서 unsage-inline에 nonce에 TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA= 라는 해시값을 설정해주어서 저 해시값을 갖고 있는 인라인 스크립트만 실행하게 되어있다.
이것은 Include인자가 바로 script로 가지 못하기 때문에 공격을 실행하기 위해서는 공격자가 직접 script태그를 입력해야 한다.
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(document.cookie);</script>
High
View Source)
php 코드는 medium과 크게 달라진 것이 없다.
코드 하단에 high라는 이름의 자바 스크립트를 참조하고 있는 것을 볼 수 있다.
javascript 코드의 목적은 버튼을 클릭하여 jsonp라는 이름의 php 파일을 호출하고 간단한 수학 문제를 해결합니다.
jsonp.php는 입력된 데이터를 URL 정보에 붙여서 전달하는 GET방식으로 callback 인자를 전달하고 있다.
callback이라는 매개변수에는 아무런 검증을 하지 않는 다면 solveSum을 제거하고 악의적인 스크립를 넣어 공격할 수 있다.