반응형

문제 링크

https://portswigger.net/web-security/sql-injection/blind/lab-time-delays

 

 

목표 & 사용 도구

목표: SQL Injection 취약점을 이용하여 10초 딜레이를 시키는 것입니다.

 

사용도구: Burp Suite

 

 

문제 풀이 - Lab: Blind SQL injection with time delays

  • 문제 사이트에 접속하여 문제를 확인합니다. tracking cookie를 사용 중이며 해당 cookie를 통해 SQL query로 질의를 하고 있다는 것을 알 수 있고 SQL query로 질의를 했을 때의 결과 값 리턴이 따로 없다고 합니다.  마지막 부분을 읽어보면  SQL injection 취약점을 이용해 10초 딜레이를 시켰을 때 해당 문제를 해결할 수 있다는 것을 알 수 있습니다. ACCESS THE LAB을 클릭합니다.

 

  • LAB에 접속했을 때의 요청 및 응답을 Burp Suite를 사용해 취득한 뒤 TrackingId 쿠키가 설정되어 있는 것을 확인합니다.

 

  • 문제에서 설명했듯이 TrackingId 쿠키는 SQL query 문을 수행하는데 사용되고 있기 때문에 해당 sql query 문 조건식이 참이 되도록 하는 sql query 문을 구성하여 요청을 보냅니다. (Burp Suite의 Repeater 기능 사용)

 

  • sql query 문 조건식 결과가 거짓이 되는 sql query 문을 구성하여 요청을 보냅니다. 이때 참, 거짓에 대한 응답을 각각 살펴보면 다른 점이 없었고 응답 결과가 다름을 이용하여 DB data를 추출하는 작업을 할 수 없는 상황인 것을 알 수 있습니다.

 

  • 참, 거짓 응답 결과를 통해 data를 추출할 수 없기 때문에 Time-based SQL Injection을 시도해 볼 수 있습니다. Time delay가 발생하도록 sql query 문을 구성하여 요청을 보내보면 약 10초 정도 Time delay가 발생한 것을 볼 수 있습니다.

[페이로드(입력 값)]

페이로드: TrackingId=O0USgNjnXDZcKeUZ' || pg_sleep(10)--;

[설명]
Blind SQL Injection을 시도할 때 참, 거짓에 따른 응답 결과가 동일하거나 응답 결과를 통해 data를 추측할 수 없는 상황이면 Time-based SQL Injection을 시도해 볼 수 있습니다. 

각 DB마다 Time delay를 발생시키는 함수 및 문법이 다르기 때문에 문제를 풀 때 각 DB의 SQL query 문법에 맞춰서 Time-based SQL Injection을 시도해야합니다. 해당 LAB 문제의 경우 페이로드를 통해 PostgreSQL을 사용중 인것을 알 수 있었습니다.


* 페이로드 분석

PostgreSQL 에서  ||  은 문자열을 연결해 주는 연산자 입니다. ~~~' || pg_sleep(10)을 하게되면 문자열을 연결하기 전에 pg_sleep(10)을 보고 Time을 delay 시키게 됩니다.(10이므로 10초) 이때 pg_sleep(10)의 반환 값은 void이며 값이 없는 상태이지만 함수가 실행되기 때문에 Time delay가 발생하는 것입니다. 마지막 주석  --  은 문법을 파괴하지 않기 위해서 입력한 값입니다.


* Time delay 확인 하는 법

Burp Suite의 Repeater 기능을 이용하여 요청을 보내면 우측 하단에 시간이 나오며 이를 통해 Time delay가 발생했는지 알 수 있습니다.
Bure Suite 우측하단을 보면 10,350 millis로(약 10초) Time delay가 발생한 것을 알 수 있습니다.

 

  • 이후에 웹 페이지로 돌아가보면 문제 요구에 맞게 10초 Time delay를 발생시켰기 때문에 문제를 성공적으로 해결하게 됩니다.

 

+) 주석을 사용하지 않은 페이로드입니다.

 

[페이로드(입력 값)]

페이로드: TrackingId=O0USgNjnXDZcKeUZ' || pg_sleep(10) and '1'='1;

[설명]
O0USgNjnXDZcKeUZ' 에서 싱글 쿼터는 사용자가 입력한 값이며 사용자가 직접 문자열을 감싼 상태이므로 실제로는 O0USgNjnXDZcKeUZ'' 즉 기존에 있던 싱글 쿼터 하나가 남게 됩니다. 앞선 과정에서는 주석을 이용하여 마지막 싱글 쿼터를 인식하지 못하게 하여 문법 에러가 발생하지 않도록 했지만 만약 주석을 사용하지 못하는 상황이라면 and '1'='1 과같이 조건이 항상 참이 되도록 하여 주석 처리를 하지 않고도 마지막에 남은 싱글 쿼터를 처리할 수 있습니다.

ex)
select ___ from ___ where ___='O0USgNjnXDZcKeUZ' || pg_sleep(10) and '1'='1'

 

반응형
반응형

문제 링크

https://xss-game.appspot.com/level6

 

 

목표 & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.

 

사용도구: 개발자 도구

 

 

문제 풀이 - https://xss-game.appspot.com/level6

  • 문제 페이지에 접속합니다. Fragment 식별자(  #  )(identifier) 기호 뒤에 오는 문자열이 화면에 출력되는 것을 확인합니다.

 

 

  • Fragment 식별자 기호 뒤에 임의의 문자열을 입력해 보면 사용자의 입력 값이 화면에 반영되고 있음을 알 수 있습니다.

 

 

  • 개발자 도구의 Elements 탭에서 코드를 확인해 보면 사용자가 입력했던 값들이 head 태그 안 script 태그의 src 속성 값으로 들어가고 있는 것을 알아낼 수 있습니다. 또한 입력했던 script 태그가 남아 있는 것으로 보아 사용자가 Fragment 식별자 뒤에 문자열을 입력하면 그것을 통해 script 태그를 삽입하고 있는 것도 알아낼 수 있습니다.

 

 

  • Fragment 식별자 기호 뒤에 특수문자 4개  < ,  ' ,  " ,  > 를 삽입하여 결과를 확인해 보면 특수문자가 인코딩 되고 있으며 추가로 더블 쿼터를 이용하여 태그를 벗어나 스크립트를 삽입하는 행위는 할 수 없다는 것도 알 수 있습니다.

 

 

  • 해당 문제는 Data URI 스킴(scheme)을 이용하여 xss 공격을 시도할 수 있습니다. 아래 페이로드를 삽입합니다.

[페이로드(입력 값)]

페이로드 : data:text/javascript,alert('xss')

Data URI 스킴은 파일을 별도로 다운로드하지 않고 URL 자체에 데이터를 직접 포함 시키는 방식을 말합니다. 구조는 다음과 같습니다.

*** 구조
data:[MIME 타입][;base64],<data>

*** 페이로드 분석
data: -> Data URI 스킴
text/javascript -> 데이터를 javascript로 처리합니다.
alert('xss') -> <data> 부분으로 실제 데이터를 의미합니다. 페이로드에서는 alert 함수를 의미합니다. 

해당 CTF에서는 사용자가  script 태그가 head 태그에 삽입되며 Fragment 식별자 뒤에 온 문자열들이 삽입된 script의 src 속성 값으로 들어가는 것을 알 수 있었습니다. 따라서 해당 페이로드를 삽입하면 Data URI 스킴을 통해 javascript를 실행시키며 xss 공격을 시도할 수 있습니다.

 

 

  • 페이로드를 삽입한 뒤 결과를 확인해 보면 스크립트가 실행되며 XSS 공격에 성공하게 됩니다.(문제 클리어)

반응형
반응형

문제 링크

https://xss-game.appspot.com/level5

 

 

목표  & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.

 

사용도구: 개발자 도구

 

 

문제 풀이 - https://xss-game.appspot.com/level5

  • 문제 페이지에 접속한 뒤 Sign up 버튼을 클릭합니다.

 

 

  • Sign up 버튼을 클릭하면 next 파라미터 값으로 confirm이 들어가고 있는 것을 볼 수 있습니다. Next를 클릭합니다.

 

 

  • Next 버튼을 클릭하게 되면 next 파라미터의 값이 경로로 들어가고 있는 것을 확인해 볼 수 있습니다.

 

 

  • 다시 next 파라미터가 있던 URL 주소로 돌아와서 개발자 도구로 Next 링크를 확인해 보면 a 태그의 href 속성 값이 next 파라미터의 값이라는 것을 알 수 있습니다. 

 

 

  • next 파라미터에 특수문자 4개  < ,  ' ,  " ,  > 를 삽입하여 결과를 확인해 보면 특수문자가 필터링 없이 그대로 사용되는 것을 알 수 있습니다. 추가로 더블 쿼터를 이용하여 태그를 벗어나서 스크립트를 삽입하는 행위는 할 수 없다는 것도 알 수 있습니다.

 

 

  • 현재 사용자의 입력 값이 a 태그의 href 속성 값으로 들어가고 있으며 더블 쿼터를 이용해 태그를 벗어나 스크립트를 할 수 없는 상황입니다. 하지만 href 속성을 이용하여 javascript를 실행할 수 있기 때문에 xss 공격을 시도할 수 있습니다.

[페이로드(입력 값)]

페이로드 : javascript:alert('xss')

javascript:
스킴(Scheme)을 이용하여 스크립트를 삽입합니다. 스킴은 URL의 맨 앞부분으로 리소스를 어떤 방식으로 처리할지 알려주는 식별자입니다. 스킴의 종류는 다양하며 그중 페이로드에 쓰인 스킴은 javascript 스킴으로 Javascript 코드를 즉시 실행해 줍니다. 

따라서 해당 페이로드는 a 태그 href 속성의 값으로 들어가기 때문에 다른 사용자가 링크를 클릭할 경우 javascript 코드를 실행합니다. alert 함수를 사용했기에 경고 창을 화면에 띄웁니다.

 

 

  • 페이로드를 삽입한 뒤 Next를 클릭하면 다음과 같이 스크립트가 실행되며 XSS(RXSS) 공격에 성공하여 문제를 클리어하게 됩니다.

반응형
반응형

문제 링크

https://xss-game.appspot.com/level4

 

목표 & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.

 

사용도구: 개발자 도구

 

문제 풀이 - https://xss-game.appspot.com/level4

  • 문제 페이지에 접속한 뒤 Create timer 버튼을 클릭합니다.

 

 

  • Create timer 버튼을 클릭해 보면 3초 뒤에 Time is up이라는 창이 뜨고 있는 것을 볼 수 있으며 URL 입력 창을 보면 timer 파라미터에 입력 값이 들어가고 있는 것을 볼 수 있습니다.

 

 

  • timer 파라미터에 특수문자 4개  < ,  ' ,  " ,  > 를 삽입하여 결과를 확인해 보면 타이머가 동작하지 않는 것을 볼 수 있습니다. 이때 개발자 도구 console 탭에 들어가 보면 사용자가 입력한 값에 의해 에러가 발생하고 있는 것을 알 수 있습니다.

 

 

  • 에러를 클릭해 보면 사용자가 입력한 값이 HTML Entity 처리되어 onload 이벤트 속성에 삽입이 되는 것을 볼 수 있으며 이벤트가 발생했을 때 실행되는 startTimer 함수의 인자 값으로 들어가고 있음을 확인할 수 있습니다.

 

 

  • 여기서 문제를 해결할 포인트는 onload 이벤트 속성을 통해 함수가 실행된다는 점과 JS 엔진에서는 HTML Entity 필터링이 적용되지 않는다는 점입니다. 따라서 해당 문제는 HTML 파서, JS 엔진의 동작 방식을 이용하여 해당 문제를 풀 수 있게 됩니다.
HTML 파서 입장 : 3&lt;&#39;&quot;&gt; 을 보고 해당 HTML Entity가 의미 하는 문자로 변환 3<'">

JS 엔진 입장 : 3<'">

<img src="/static/loading.gif" onload="startTimer('3&lt;&#39;&quot;&gt;');" /> 코드가 있을 때

- HTML 파서가 HTML Entity를 보고 해당하는 문자로 디코딩을 수행합니다.
- JS 엔진은 디코딩 된 값을 가지고 동작하기 때문에 onload 이벤트가 발생했을 때 HTML Entity가 디코딩 된 값으로 함수를 실행하게 됩니다.

 

 

  • 따라서 이를 이용하여 페이로드를 작성하고 XSS 공격을 시도할 수 있습니다.

[페이로드(입력 값)]

페이로드: 3')%3balert('xss')%3bx=('

%3b는  ;  (세미콜론)을 URL 인코딩한 값입니다. URL 입력창에 페이로드를 바로 입력할 때  ;  을 인코딩 하지 않고 그대로 사용하면  ;  뒤에 오는 값들을 전부 무시하며 XSS 공격을 성공할 수 없게 됩니다. (URL 입력 창에 바로 입력하는 것 아닌 타이머 시간 설정을 할 수 있는 입력란에  ;  을 인코딩하지 않고 그냥 사용하면 자동으로 인코딩 되기 때문에 XSS을 성공시킬 수 있습니다.)

[설명]
이벤트 속성 onload에서는  ;  (세미콜론)을 이용하여 함수를 2개 이상으로 실행시킬 수 있습니다. 따라서 이를 이용하여 경고 창을 띄우는 alert 함수를 사용했고 마지막 x=(' 는 문법을 깔끔하게 맞추기 위해서 사용했습니다.


 <img src="/static/loading.gif" onload="startTimer('__입력 값__');" />

<!-- 페이로드 삽입 -->
<img src="/static/loading.gif" onload="startTimer('3');alert('xss');x=('');" />

 

[timer 파라미터에 직접 입력할 때 -  ;  인코딩 적용]

 

[timer 시간 설정하는 입력란에 입력할 때 -   ;  인코딩 미적용]

 

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 XSS(RXSS) 공격에 성공했고 문제를 클리어하게 됩니다.

 

반응형
반응형

문제 링크

https://xss-game.appspot.com/level3

 

 

목표 & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다. 

 

사용도구: 개발자 도구

 

 

문제 풀이 - https://xss-game.appspot.com/level3

  • 문제 페이지에 접속합니다.

 

  • Image 1, Image 2, Image 3을 클릭해 보면 각각의 이미지를 URL Fragment를 이용하여 가져오고 있는 것을 볼 수 있습니다.

 

  • 이번엔 Fragment 식별자 값(# 뒤의 값)을 임의로 입력하고 개발자 도구 Elements 탭을 확인해 봅니다. 코드를 보면 Image 1,2,3 버튼을 눌렀을 때 onclick 이벤트 속성에 의해 chooseTab 함수가 실행되는 것을 볼 수 있고 사용자가 입력했던 Fragment 식별자 값은 img 태그의 경로에 들어가고 있는 것을 알 수 있습니다.

 

  •  Fragment 식별자 값에 특수문자 4개  < ,  ' ,  " ,  > 를 삽입하여 결과를 확인합니다. 결과를 보게 되면 img 태그의 문법이 깨지고 있는 것을 알 수 있고 특수 문자가 어떠한 필터링 없이 그대로 사용되고 있는 것을 볼 수 있습니다.

 

  • 개발자 도구의 Elements 탭에 들어가서 script 태그들을 확인하다 보면 다음과 같이 chooseTab 함수가 어떤 식으로 동작하고 있는지를 확인할 수 있습니다. 함수 내부 코드를 보면 src 경로가 싱글 쿼터로 감싸지게 되는데 특수 문자 4개를 입력했을 때 img 태그가 깨진 이유가 싱글 쿼터 때문입니다.

 

  • 따라서 이를 이용하여 페이로드를 입력합니다

[페이로드(입력 값)]

페이로드 : 1test'><script>alert('xss');</script>

싱글 쿼터와 꺾쇠 기호를 이용하여 img 태그를 강제로 닫고 script 태그를 이용하여 스크립트를 삽입합니다.

 

  • 결과를 확인해 보면 삽입한 페이로드에 의해 스크립트가 실행되어 경고 창을 화면에 띄우며 해당 CTF 문제를 클리어하게 됩니다.

 

반응형
반응형

문제 링크

https://xss-game.appspot.com/level2

 

목표 & 사용 도구 

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다. 

 

사용도구: 개발자 도구

 

문제 풀이 - https://xss-game.appspot.com/level2

  • 문제 페이지에 접속한 뒤 입력란에 특수문자 4개  < ,  ' ,  " ,  > 를 삽입하여 Share status! 버튼을 클릭합니다. 

 

  • 결과를 확인해 보면(개발자 도구 사용) 사용자가 입력한 특수문자 4개 전부 별다른 필터링이 없이 그대로 사용되고 있는 것을 알 수 있습니다. 이는 HTML과 javascript를 이용하여 스크립트를 삽입할 가능성이 있다는 것을 의미합니다. 

 

  • script 태그가 삽입이 가능하다는 것을 확인합니다.

 

  • script 태그 삽입이 가능하므로 스크립트를 삽입합니다.

 

  • 결과를 확인해 보면 어떠한 필터링으로 인해 삽입된 스크립트가 실행되지 않으며 CTF를 클리어하지 못하는 것을 볼 수 있습니다.
[설명] 

문제 code를 보게 되면 사용자가 입력한 값은 innerHTML을 통해 삽입이 됩니다. innerHTML을 통해 script 태그를 삽입할 경우 태그는 삽입이 가능하지만 실행은 되지 않습니다.

 

  • script 태그 삽입이 가능하지만 실행이 되지 않기 때문에 다른 방법을 실행해야 합니다. 이벤트 속성을 이용하여 우회를 할 수 있기 때문에 img 태그와 이벤트 속성을 이용한 페이로드를 삽입합니다.

[페이로드(입력 값)]

페이로드 : <img src='x' onerror=alert('xss')>

이벤트 속성을 이용할 경우 innerHTML로 태그가 삽입되었다고 해도 이벤트 속성에 해당하는 이벤트가 발생했을 때 실행되기 때문에 XSS 공격을 성공시킬 수 있습니다. 

 

  • 결과를 확인해 보면 삽입한 페이로드에 의해 스크립트가 실행되어 경고 창을 화면에 띄우며 해당 CTF 문제를 클리어하게 됩니다.

반응형
반응형

문제 링크 

https://xss-game.appspot.com/level1

 

목표 & 사용 도구 

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다. 

 

사용도구: 개발자 도구

 

문제 풀이 - https://xss-game.appspot.com/level1

  • 문제 페이지에 접속한 뒤 입력란에 특수문자 4개  < ,  ' ,  " ,  > 를 삽입하여 Search 버튼을 클릭합니다. 

 

  • 결과를 확인해 보면 query 파라미터에 사용자 입력 값이 들어가며 특수문자 4개 전부 별다른 필터링이 없이 그대로 사용되고 있는 것을 알 수 있습니다. 이는 HTML과 javascript를 이용하여 스크립트를 삽입할 가능성이 있다는 것을 의미합니다. 

 

  • query 파라미터에 script 태그를 입력하여 결과를 확인해 보면 script 태그를 사용할 수 없음을 알 수 있습니다.

 

  • 이번엔 script 태그가 아닌 img 태그를 사용하여 결과를 확인해 보면 img 태그는 사용 가능하다는 것을 알 수 있습니다.

 

  • img 태그와 이벤트 속성 onerror를 이용하여 스크립트를 삽입합니다.

[페이로드(입력 값)]

페이로드 : <img src='x' onerror=alert('xss')>

img 태그의 src 속성은 image의 경로를 지정합니다. 경로를 지정하지 않는다면 error가 발생합니다. 이벤트 속성인 onerror를 설정했다면 error가 발생했을 때 이벤트 속성에 따라 처리됩니다. 해당 페이로드의 경우 이미지의 경로가 x(잘못된 경로)이므로 에러가 발생하며
onerror 속성에 따라 경고 창을 화면에 띄우게 됩니다.

 

  • 결과를 확인해 보면 삽입한 페이로드에 의해 스크립트가 실행되어 경고 창을 화면에 띄우며 해당 CTF 문제를 클리어하게 됩니다.

반응형
반응형

SVG 란?

SVG(Scalable Vector Graphics)는 XML 기반의 벡터이미지 포멧을 말합니다. 이러한 SVG의 가장 큰 특징은 벡터 기반이기 때문에 크기를 확장하거나 축소해도 해상도가 유지가 된다는 점입니다.

* XML(eXtensible Markup Language): 데이터를 구조적으로 표현하기 위한 마크업 언어입니다.

 

File Upload 취약점을 이용한 XSS 

파일 업로드를 통해 공격자가 할 수 있는 공격 방식은 다양하게 존재합니다. 그 중에는 대표적으로 Web Shell 공격이 있으며 이번에 알아볼 공격 방식은 파일 업로드를 통해 XSS 공격을 시도해보는 것입니다.

(Web Shell 공격은 제가 작성한 글을 참조해주세요!)

File Upload를 이용한 Web Shell 공격

 

 

File Upload 취약점을 이용한 XSS - 발생조건

  • 파일 업로드 기능이 존재해야 합니다.
  • 업로드된 경로에 접근이 가능해야 합니다.

 

사용 도구 

  • Burp Suite

 

실습

  • 파일 업로드 기능이 있는 게시판에 접속하여 글 작성 페이지 접속합니다.

 

  • 먼저 php 파일을 업로드하면서 웹쉘 업로드가 가능한지 확인합니다.

 

  • 허용되지 않는 파일 형식이라고 화면에 출력되며 php 파일을 업로드할 수 없음을 확인할 수 있습니다. (이번 File Upload 공격은 SVG 파일을 이용한 XSS가 목적이므로 php 파일 우회는 다른 글을 참고해 주세요.)

 

  • 이번엔 파일 업로드를 할 때 Burp Suite를 이용하여 Request를 가로챈 뒤에 확장자를 .svg 로 바꿔서 파일 업로드를 시도합니다. Response를 보면 php 파일은 안되지만 SVG 파일은 업로드할 수  있음을 알 수 있습니다.

 

  • SVG 파일을 이용하여 XSS 공격을 하기 위해서는 파일 경로로 접근이 가능해야 합니다. 파일 다운로드와 같은 버튼이 있을 때 우클릭한 뒤 링크 주소 복사를 클릭하면 복사된 주소가 파일이 저장되어있는 경로입니다.

 

  • 복사한 주소를 URL 주소창에 입력하고 접속하면 접속이 가능하며 어떤 에러가 화면에 출력되고 있는 것을 볼 수 있습니다. 해당 에러는 XML 파서 에러이므로 업로드한 파일이 SVG(XML)로 인식되고 있음을 알 수 있습니다. 

 

  • SVG 파일 업로드가 가능하며 업로드된 파일 경로에도 접근이 가능한 상태입니다. XSS 공격을 시도하기 위해 파일 업로드할 때의 Request를 가로채서 확장자를 .svg 로 바꾸고 페이로드를 삽입합니다. 

[페이로드]

페이로드 : <svg onload="alert('1')" xmlns="http://www.w3.org/2000/svg"></svg> (확장자 .svg)


svg 태그와 이벤트 속성인 onload를 이용하여 스크립트를 실행하는 페이로드 입니다. xmlns는 네임스페이스(Namespace)를 선언하는 속성이며 SVG 규격에 따른 XML 문서라는 것을 알려주는 선언입니다. "http://www.w3.org/2000/svg" 은 SVG의 공식 네임스페이스 입니다.
(.svg 파일은 xmlns를 명시해줘야 XSS를 성공시킬 수 있습니다. xmlns을 명시하지 않으면 XSS가 발생하지 않습니다.)

 

  • 페이로드를 삽입한 뒤 Request를 보내면 Response에 글 작성에 성공했다는 것을 볼 수 있습니다.

 

  • 이어서 파일 경로를 복사해 줍니다.

 

  • 복사한 파일 경로를 URL 주소창에 입력한 뒤 접속해줍니다.

 

  • 결과를 보면 파일 업로드로 올렸던 SVG 파일로 인해 스크립트가 실행되며 XSS가 발생하는 것을 볼 수 있습니다.

반응형

'[WEB] 모의해킹 > File Upload' 카테고리의 다른 글

📌File Upload 취약점  (3) 2025.07.27

+ Recent posts