BWAPP (문제)

 

1. HTML Injection – Reflected(GET)

 

Quest. HTML Injection이 무엇인지 정리하시오.

 

Quest. 아래 화면을 출력하시오.

난이도 low

img src: http://[본인IP]/bWAPP/images/bee_1.png

hint1. 페이지 소스 코드를 확인해봅시다.

 

난이도 medium

hint1. low일 때 성공한 페이지와 비교해봅시다. 소스코드 차이점이 반드시 있습니다.

hint2. URL Encoding 

 

난이도 high

풀 수 없습니다. 풀 수 없는 이유를 정리해주세요.

hint1. include는 외부 파일을 포함하는 함수입니다. 확인해야 할 함수가 있는데 외부 파일에 있는 듯 합니다.

hint2. function_external.php 파일에 xss_check2 함수를 확인해봅시다.


Quest. HTML Injection이 무엇인지 정리하시오.

 

: 코드 인젝션 공격의 일종으로, 웹 페이지에서 서버로 전송되는 요청 정보에 악의적인 명령 코드를 삽입하여 불필요한 동작을 실행시키거나 중요 정보를 탈취하는 기법을 말한다. “Cross-Site Scripting”, 또는 “XSS”로 불린다.

 

 

 

- 난이도 low

hint1. 페이지 소스 코드를 확인해봅시다.

로그인 창과 유사한 화면이다. 위와 아래에 텍스트를 입력하면 입력한 텍스트가 아래에 그대로 출력된다.

 

코드를 확인해 보자.

코드 확인을 어떻게 하는지 몰라 한참 헤맸는데, (검사 도구에는 html 코드만 표시될 뿐 JS나 php 코드는 볼 수 없다)

터미널에서 /var/www/bWAPP 경로로 들어가면 된다고 한다.

VMware 좌측 상단에 보이는 검은 네모 아이콘을 누르면 터미널을 열 수 있다.

배운 명령어를 잘 확인해서 위 경로대로 들어간다.

 

해당 경로에서 ls 명령어를 쓰면 htmli_get.php라는 파일을 발견할 수 있다. 이 파일이 소스코드이다.

cat 명령어로 열어본다.

 

해당 페이지 전체의 코드라 파일이 상당히 긴데, 우리가 확인해야 할 부분은 php 코드로 되어 있다.

firstname과 lastname이라는 변수를 GET으로 받아와서

하나라도 공백이라면 '두 란에 모두 입력값을 넣어달라'는 메시지를 출력하고

둘 다 잘 차있다면 Welcome 메시지와 함께 firstname과 lastname 변수를 htmli라는 함수로 출력한다.

이 htmli 함수가 어떤 기능을 하는지는 당장은 잘 모르겠지만,

이 문제의 주제는 '인젝션'이다. 어떤 식으로든 코드를 삽입하는 것이 풀이방법이 될 것이다.

그러면 저기에 html 코드를 넣어 보면 어떻게 될까?

 

First name에는 <h1> h1 </h1>

Last name에는 <h2> h2 </h2>

이런 식으로 간단히 태그를 넣어 보았다.

예상대로 입력값이 html 태그로서 작동한다. 검사 페이지에도 태그가 적용된 코드가 나타난다.

그러면 <h1> 태그로 감싼 "SUCCESS"와, 벌 이미지를 담은 <img> 태그를 각각 기입하면?

(자기 아이피는 마찬가지로 비박스 터미널에서 ifconfig 명령어로 확인할 수 있다)

 

성공이다. 증거를 위해 검사 페이지의 코드 화면이 같이 보이게 찍어두었다.

 

 


 

- 난이도 medium

hint1. low일 때 성공한 페이지와 비교해봅시다. 소스코드 차이점이 반드시 있습니다.

hint2. URL Encoding 

 

 

medium 난이도이다. 당연하지만 low 난이도에서 풀었던 대로 입력해도 풀리지 않는다.

태그가 태그로 인식이 되지 않는 모양인지, '<h1>SUCCESS</h1>' 이런 식으로 스트링이 출력된다.

다른 점을 찾아야 할 것이다. 코드를 열심히 뒤졌다.

같은 이름의 파일이라 대다수의 부분이 low 난이도와 같아 보이지만,

열심히 찾아보면 이 부분을 발견할 수 있을 것이다.

security_level의 값이 난이도마다 다르다. low는 0, medium은 1, high는 2로 설정되어 있다.

그리고 조금 더 찾아보면 이런 부분도 있다.

 

security_level의 값에 따라 다른 함수를 호출하는 모양이다.

low 난이도에서는 security_level이 0이었으니 no_check를 호출했을 것이고,

medium에서는 xss_check_1을 호출하고 있을 것이다.

하지만 이 함수는 이 파일 내에서는 자세한 내용을 발견할 수 없다.

 

그러면 외부에서 찾아보자. 이 파일 최상단에 include(파일이름) 으로 되어 있는 라인이 여럿 있을 것이다.

(검색 명령어가 기억이 안 나서 수동으로 하나하나 cat해서 뒤져보았다.

웬만하면 검색 명령어를 구글링해서 사용하도록 하자.)

 

해당 내용은 functions_external.php라는 파일에 들어 있다.

그런데 파일이 엄청나게 길다. 스크롤만 올려서는 xss_check_1이 보이지 않을 수 있다.

그렇다고 grep "xss_check_1" 만 써서는 해당 함수 코드 전체가 아닌 그 라인만 리턴되기 때문에,

grep -n 옵션을 써서 xss_check_1이 있는 라인 번호를 먼저 찾고(88번이라고 뜬다)

less -n+88 명령어로 88번 줄 이후의 부분을 보여주도록 한다.

 

xss_check_1의 내용이다.

"<"과 ">", 그러니까 꺾쇠 기호를 "&lt"와 "&gt"로 치환한다는 것이다. 힌트에서의 url 인코딩이 이것이다.

이 인코딩을 해제하기 위해 urldecode 함수를 사용하고 있으니

우리가 입력할 때 url 인코딩에서 "<"과 ">"에 해당되는 값을 대신 넣어주면

디코딩 함수에서 자연히 이것을 꺾쇠 기호로 바꿔줄 것이다.

 

URL 인코딩은 아래 아스키 코드 표에서 HEX에 해당되는 값 앞에 %을 붙이는 것이다.

그러니까 "<"는 %3C, ">"는 %3E, 닫는 태그에 사용할 "/"는 %2F가 된다.

(위 스크린샷의 주석에도 있는 내용이다.)

 

 

그러면 low 난이도에서 입력했던 값에서

<, >, / 부분만 인코딩 값으로 치환해서 다시 입력하면?

 

성공이다. (현재 난이도까지 보이게 찍었으면 더 확실했을 텐데 아쉽다)

 


- 난이도 high

풀 수 없습니다. 풀 수 없는 이유를 정리해주세요.

hint1. include는 외부 파일을 포함하는 함수입니다. 확인해야 할 함수가 있는데 외부 파일에 있는 듯 합니다.

hint2. function_external.php 파일에 xss_check2 함수를 확인해봅시다.

 

 

 

처음부터 아예 풀 수가 없는 문제라고 한다. 당연히 low나 medium에서 시도했던 방법들 모두 통하지 않는다.

high 난이도도 medium에서처럼 외부 함수를 호출하고 있다. high의 security_levle 값은 2이며,

이에 따라 xss_check_3 함수를 호출한다. 확인해 보자.

 

htmlspecialchars라는 함수가 등장한다.

힌트 내용에 따라 xss_check_2도 함께 확인해 보니 여기에도 동명의 함수가 호출되고 있다.

주석 내용에 따르면 '적용될 수 있는 모든 문자를 HTML 개체로 변환한다' 라고 적혀 있다.

이 문제를 풀 수 없는 이유는 이 함수 때문일 가능성이 높아 보인다.

 

구글링해 보니 htmlspecialchars는 php 내장 함수로,

HTML의 코드로 인식될 수 있는 문자열의 일부 내용을

특수문자(HTML entities)형태로 변환하여 출력해주는 역할을 하는 함수라고 한다.

원래부터 HTML 소스를 그대로 노출시켜야만 할 때 악성 사용자로부터의 XSS 공격을 방어하는 용도로 잘 쓰이는 함수라고 하니

지금 당장으로서는 이 함수를 뚫고 코드를 인젝션할 방법이 없어 보인다.

이러한 이유로 high 레벨은 풀 수 없는 문제이다.

'WEB > 웹해킹' 카테고리의 다른 글

XSS Game 1, 2  (0) 2022.08.12
[bWAPP] XSS - Stored(Blog) ~ (Change Secret)  (0) 2022.08.07
[bWAPP] XSS - reflected (GET)  (0) 2022.07.31
[bWAPP] SQL Injection – POST/search  (0) 2022.07.23
[bWAPP] reflected (GET) ~ stored (Blog)  (0) 2022.07.14

+ Recent posts