인젝션(injection)
인젝션은 공격자가 악의적으로 주입한 데이터를 웹 애플리케이션에서 데이터베이스의 정상적인 쿼리 일부로 인식하고 실행할 때에 발생하는 취약점으로 데이터를 입력받거나 데이터 정보를 요청하는 곳에는 인젝션 공격이 가능하다
공격 방법이나 사용 언어에 따라 인젝션의 종류가 달라지는데 대표적인 유형으로는 SQL인젝션 ,HTML 인젝션,OS command인젝션, LDAP 인젝션 등이 있다.
SQL인젝션은 데이터 베이스 언어를 사용학 때문에 데이터베이스 내의 정보를 유출 또는 수정할수있다
HTML 인젝션
공격자는 사용자가 연결을 용청한 페이지에 HTML 태그를 삽입하여 의도하지 않은 내용을 보게하거나 악의적인 사이트에 연결한다
반사기법
URL에 악의적인 HTML태그를 삽입하여 링크를 클릭한 사용자의 PC에서 HTML 태그가 실행되게 하는 공격이다.
특히 GET방식으로 데이터를 전송할 경우 URL에 변수명과 입력값을 노출한다
저장기법
HTML태그를 데이터 베이스에 저장하여 저장된 태그 내용을 확인한 사용자의 PC에 HTML 태그가 실행되게 하는 공격이다.
1-1)반사(GET)-난이도 하
사용자가 입력한 값을 그대로 출력하는 페이지 이다
이때 입력 값을 검증하지 않으면 웹 브라우저는 공격자가 입력한 HTML 태그를 해석하고 관리자가 의도하지 않은 내용을 출력한다
입력값
<h1>Success</h1>
<img src=http://192.168.43.22/bWAPP/images/bee_1.png>
출력 화면
GET 메서드로 요청하기 때문에 웹 브라우저의 URL 입력 부분에 변수가 노출된다.
1-2)반사(GET)-난이도 중
입력페이지에 아까와 똑같은 값을 입력해 주었는데
나오는 출력화면은 아까와 같은 이미지 화면이 아니라 문자열이 그래도 출력된다
이는 태그를 필터링 하기 때문이다
따라서 태그에서 사용되는 <와> 문자를 URL 인코딩하여 입력한다
URL 인코딩은 이스키코드의 HEX값에 %를 붙인 값으로, 두 문자를 URL 인코딩하여 <은 %3C로 >은 %3E로 변환한다
구글에 URL 인코딩 검색하면 많은 사이트가 나오니 변환해준다
변환된 값으로 바꿔서 입력해주면
%3Ch1%3ESuccess%3Ch1%3E
%3Cimg src=http://192.168.43.22/bWAPP/images/bee_1.png%3E
정상적으로 출력되는걸 확인할수있다
1-3) 대응방안
난이도 상에서는 난이도 중에서 입력한 값들 역시 문자열로 추가한다
이렇게 출력되는 이유는 우회단계를 거치기 때문이다
html_get.php 코드를 확인하면
여기서 보면 case "2" 인 경우는 xss_check_3의 단계를 거쳐서 출력되는데
xss_check_3의 함수를 찾아보면
function xss_check_3($data, $encoding = "UTF-8"){
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
htmlspecialchars함수로 입력값을 우회한다.
htmlspecialchars함수는 php에서 제공하는 기본 함수로,HTML에서 사용하는 특수문자를 UTF-8로 변환한다
htmlspecialchars에서 반환하는 특수문자는 &,",',<,> 이다
따라서 htmlspecialchars 함수를 사용하여 태그에 사용되는 문자들을 인식하지 않게 인코딩하면 대응방안으로 사용할수있다
2-1) 반사 (POST)-난이도 하
POST 방식을 사용하여 데이터를 전송한다. 따라서 서버로 전송하는 변수 값이 URL에 노출되지 않는다
버프스위트를 이용하여 변수값을 전달할 것인데
프록시를 통해서 http 요청 정보를 확인하고
변수를 악의적인 내용으로 수정해주면
이렇게 공격에 성공한 모습을 볼수있다.
2-2) 반사 (POST)-난이도 중
난이도 하 와 같은 방식으로 프록시로 조작을 해보면
<h1>Success</h1>
<img src=http://192.168.43.22/bWAPP/images/bee_1.png>
값이 변경되지 않는다 GET 방식에서 사용한거 처럼 우회를 통해 접근해보면
%3Ch1%3ESuccess%3Ch1%3E
%3Cimg src=http://192.168.43.22/bWAPP/images/bee_1.png%3E
인코딩한 태그를 전송하여도 태그를 실행하지 않고 문자열을 그대로 출력한다
그래서 어떤 방식으로 인코딩이 되는지 확인해 보기위해 값을 넣고 요청값을 가로채 보았는데
더블 인코딩이 된 값을 확인할수 있었다.
더블 인코딩이란 인코딩에 사용되는 %문자도 인코딩하는 것으로 %문자의 인코딩 값 %25를 사용한다
따라서 < 를 인코딩할때 더블인코딩을 사용하면
%3C-> %253C가 된다
더블 인코딩해서 값을 넣어주면
%253Ch1%253ESuccess%253Ch1%253E
%253Cimg src=http://192.168.43.22/bWAPP/images/bee_1.png%253E
성공화면을 볼수있다.
2-3).대응방안
난이도 상에서는 난이도 중에서 입력한 값들 역시 문자열로 추가한다
이렇게 출력되는 이유는 우회단계를 거치기 때문이다
html_get.php 코드를 확인하면
여기서 보면 case "2" 인 경우는 xss_check_3의 단계를 거쳐서 출력되는데
xss_check_3의 함수를 찾아보면
function xss_check_3($data, $encoding = "UTF-8"){
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
htmlspecialchars함수로 입력값을 우회한다.
htmlspecialchars함수는 php에서 제공하는 기본 함수로,HTML에서 사용하는 특수문자를 UTF-8로 변환한다
htmlspecialchars에서 반환하는 특수문자는 &,",',<,> 이다
따라서 htmlspecialchars 함수를 사용하여 태그에 사용되는 문자들을 인식하지 않게 인코딩하면 대응방안으로 사용할수있다
'OWASP top 10 ' 카테고리의 다른 글
[A1] SSI 코드 인젝션 (0) | 2017.12.02 |
---|---|
[A1] PHP 코드 인젝션 (0) | 2017.12.02 |
[A1] OS 커맨드 인젝션(다시 공부하기) (0) | 2017.12.02 |
[A1] iframe 인젝션 (0) | 2017.12.02 |
[OWASP] 비박스 환경 구성하기 (0) | 2017.12.01 |