- 해석

해보자 다른 사용자의 로그인 자격 증명이 포함 된 요청을 보내려면 "로그인"버튼을 클릭하십시오.

그런 다음 이러한 자격 증명을 적절한 필드에 쓰고 확인을 위해 제출합니다.

패킷 스니퍼를 사용하여 요청을 가로 채십시오.

 

 

#패킷스니퍼(Burp Suite) 사용

 

 

#end

#XSS - Cross Site Script

 -> CSS가 맞지만 이미 CSS(Cascading Sytle Sheets)가 존재해서 XSS가 되었다.

 

 -> 서버에 프로그램이 코딩되어 있지만, 실행은 클라이언트에서 하기 때문에

     동작주체가 클라이언트로 넘어오게 된다.

 

 -> 발생하는 위치 : 클라이언트의 입력창, http header, 사용자의 응답 등

 

#XSS 취약점 판단

 -> 아무 스크립트 코드(ex:Java Script)나 넣었을 때, 스크립트가 정상적으로 작동하면

     취약점이 존재하는 것.

 

 -> 단순 필터링 우회 : ex ) <script> 필터링

  --> <scr<script>ipt> / <src+ipt> 등으로 우회가 가능하다.

 

 

#7) Reflected XSS

- 해석

XSS에 취약한 필드 식별 항상 서버 측에서 모든 입력의 유효성을 검사하는 것이 좋습니다.

XSS는 확인되지 않은 사용자 입력이 HTTP 응답에 사용될 때 발생할 수 있습니다.

반사 된 XSS 공격에서 공격자는 공격 스크립트를 사용하여 URL을 만들어 다른 웹 사이트에 게시하거나

이메일을 보내거나 피해자가 클릭하도록 할 수 있습니다.

필드가 XSS 공격에 취약한 지 확인하는 쉬운 방법은 alert () 또는 console.log () 메소드를 사용하는 것입니다.

그중 하나를 사용하여 취약한 분야를 찾으십시오.

 

 

#end / alert 삽입

 - <script>alert("hi")</script>

  -> 'hi'라는 메세지박스를 출력하는 스크립트 코드

 

 - 스크립트 코드를 넣으니까 문제가 해결되었다.

 

 

#10) Identify potential for DOM-Based XSS

- 해석

DOM 기반 XSS의 잠재력 파악 DOM 기반 XSS는 일반적으로 클라이언트 측 코드에서

경로 구성을 검색하여 찾을 수 있습니다.

페이지에 "반영되는"입력을받는 경로를 찾으십시오.

이 예제에서는 경로 핸들러에서 '테스트'코드를 찾고 싶을 것입니다

(WebGoat는 백본을 기본 JavaScript 라이브러리로 사용).

때로는 테스트 코드가 프로덕션에 남아 있습니다

(그리고 종종 테스트 코드는 매우 간단하고 보안이나 품질 관리가 부족합니다!).

당신의 목표는 경로를 찾아 그것을 활용하는 것입니다.

우선… 기본 경로는 무엇입니까? 예를 들어,이 강의의 URL을보십시오.… /WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9와 같은 형식이어야합니다.

이 경우 '기본 경로'는 다음과 같습니다.

start.mvc # lesson / CrossSiteScripting.lesson / 9는 JavaScript 경로 처리기에 의해 처리되는 매개 변수입니다.

그렇다면 프로덕션 중에 앱에 남아있는 테스트 코드의 경로는 무엇입니까?

이 질문에 답하려면 JavaScript 소스를 확인해야합니다.

 

 - 경로 처리기를 찾아야 한다고 말한다.

 - mvc를 언급하는 것으로 보아 mvc와 관련이 있어 보인다.

 

#mvc(Model View Controller)

출저 : https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC

 

 - Model : 무엇을 할지 결정. 로직처리(알고리즘, DataBase와의 상호작용 데이터 등)

 - Controller : 앞의 모델이 어떻게 처리할지 결정

 - View : 화면의 출력을 담당. Model과 Controller로 인한 것을 출력함.

 

출저 : https://medium.com/@jang.wangsu/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-mvc-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80-1d74fac6e256

 

#mvc route

 -> 쉽게 설명하면 경로를 찾는 것인데, mvc와 route에 대해서는 다른 글에서 더 자세하게 다룰 예정

 

 -> start.mvc # lesson / CrossSiteScripting.lesson / 9는 JavaScript 경로 처리기에 의해 처리되는 매개 변수

  --> 부분에서 테스트코드의 경로를 찾으라고 했으므로, test route를 찾아야 하는 것임을 알 수 있다.

 

 

#mvc 요소 중에서 획득

 - test/:param이 testRoute임을 명시해주는 코드를 획득할 수 있었다.

 

 

#test 경로 확인

 - start.mvc#test/ 부분에서 XSS취약점이 발생하는 것을 확인하였다.

 

 

#end

 

 

 

 

#11) Try It! DOM-Based XSS

 - 해석

시도 해봐! DOM 기반 XSS
일부 공격은 '블라인드'입니다. 다행히 여기에서 서버를 실행하고 있으므로 성공했는지 알 수 있습니다. 방금 찾은 경로를 사용하고 인코딩없이 경로의 매개 변수를 반영한다는 사실을 사용하여 WebGoat에서 내부 기능을 실행할 수 있는지 확인하십시오. 실행하고자하는 기능은…

DOM 기반 XSS 실습입니다.
일부 공격들은 성공 여부를 확인할 수 없다 (blind). 그러나 운 좋게도 당신은 스스로 서버를 구동하고 있으므로 성공 여부를 확인할 수 있습니다. 당신이 금방 전 확인한 경로를 이용하여, 경로 내에서 값이 있고 필터링하여 발생하여, WebGoat 내 특정 함수가 있는지 확인하라. 당신이 할 함수는 같다.

webgoat.customjs.phoneHome ()

물론, 콘솔 / 디버그를 사용하여 트리거 할 수 있지만 새 탭의 URL을 통해 트리거해야합니다.
당연히 당신은이 이벤트를 콘솔이나 디버그를 호출 할 수 있습니다. 많은, 새 탭의 URL을 통해 호출 시도십시오.
트리거를 실행하면 후속 응답이 임의의 숫자로 브라우저 콘솔에 표시됩니다. 그 난수를 아래에 넣으십시오.
이 함수가 호출되면 임의 번호가 당신의 브라우저의 콘솔에 출력 될 것입니다. 아래 폼에 그 번호를 삽입하십시오.

 

 

#제공받은 함수로 10번문제에서 획득한 test경로에 스크립트를 작동시키자.

  - 콘솔을 확인하면 난수가 생성된 것을 확인할 수 있다.

 

 

#end

 - 난수이므로 그대로 갖고가셔도 문제가 풀리지 않습니다

#12

 - 이 할당에서 ORDER BY 필드를 통해 SQL 주입을 수행하십시오. webgoat-prd 서버의 IP 주소를 찾으십시오. 전체 IP       주소는 너무 오래 걸릴 수 있으므로 마지막 부분 인 xxx.130.219.202를 제공합니다.

 

 - 참고 :이 할당의 제출 필드는 SQL 주입에 취약하지 않습니다.

 

 

#제출필드는 sql을 쓰는것이 아닌 것 같다. 버프슈트로 잡아서 요청값을 보자.

 -  hostname을 GET방식으로 인자 전달을 하는 것을 확인했다.

 

 

#test 테이블 존재여부 검사

 - (case+when+exists(select+ip+from+test+where+hostname%3d'webgoat-prd')+then+ip+eles+id+end)

  -> test 테이블에서 ip 컬럼에 hostname이 'webgoat-prd'가 있으면 ip기준으로 정렬, 없으면 id 기준으로 정렬

 

 - 500에러(서버내부에러)가 출력되는 것을 보아, test테이블이 존재하지 않는다.

 - 좌측 상단에 인자가 servers?column= 인 것으로 보아 servers 테이블인 것 같다.

 

 

#servers 테이블로 수정

 - ip기준으로 잘 정렬된 것을 볼 수 있다.

 

 

#webgoat-prd가 servers 테이블에 존재한다는 것을 알았지만, 출력은 되지 않는다.

#유효성 검사를 위해 sql문을 사용하여 반응을 유도하자.

 - (case+when+exists(select+ip+from+servers+where+hostname+=+'webgoat-                                                      prd'+and+substring(ip,1,1)='1')+then+ip+else+id+end)

  -> 해당 sql문을 사용하여, webgoat-prd의 ip 첫째자리부터 검사하여 반응을 유도한다,

 

 - 해당 사진은 1번째 자리가 '1'이 맞아서 ip기준으로 정렬된 모습이다.

 - 문제에서 앞 세자리만 구하라고 했으므로, 30번 안으로 답을 구할 수 있다.

 

#end

 

 

 

 

'Web > WebGoat' 카테고리의 다른 글

[WebGoat] Insecure Login  (0) 2021.06.06
[WebGoat] (A7)Cross Site Scripting - 7,10,11  (0) 2021.06.05
[WebGoat] General - HTTP Basics  (0) 2021.06.05
[WebGoat] Challenges - Without account  (0) 2021.05.31
[WebGoat] Challenges - Without password  (0) 2021.05.31

 

#POST 나 GET방식을 판단해야 하므로 버프슈트로 포워드값을 잡아보자.

 - 상단에 POST와 하단에 magic_num이 보인다.

 

#end

 

 

 

#별점을 클릭하니 login이 필요하다고 한다.

 

 

#버프슈트 사용

 - 실패한 쿼리가 나온다.

 

++ 로그인 시도를 위해 페이지 분석, 쿼리 분석을 해보았으나 모두 실패..

 

 

#서버가 처리할 수 있는 요청방식 확인

 - GET을 OPTIONS로 변경하여 보내면 서버가 허용하는 메소드가 출력된다.

   OPTIONS와 GET은 이미 응답을 알고 있으므로, HEAD로 바꿔서 요청해보자.

 

 

#end

#Without password

 

 

# ' (쿼터) 입력 확인

 - 쿼터가 들어가긴 하지만, 모종의 이유로 문자로 들어간다.

 

 

#버프슈트 확인

 - 패스워드 부분에 '를 넣으니 내부에러가 발생한다. 

 

 

#내부 에러 분석

 - 쿼리 형식이 보인다.

 

 

#SQL INJECTION

 - 형식에 맞춰 sqli를 써주면 성공

   -> 1'or'1'='1

   --> 1 또는 1=1 일때, 참이다.

 

 

# ' 기호를 넣어서 injection이 먹히는지 본다.

 - 다른 기호들도 넣어봤지만 별다른 변화가 없다.

  -> 블라인드 sqli로 풀어볼려고 했지만 응답형식이 같아서 실패

 

#뭔가 다른 그림

 - 페이지 좌측상단의 그림과 로그인 그림이 뭔가 다르다. 마치 뜯어달라는 것처럼

   하얀 여백도 존재한다. 

 

#파일 다운로드

 - 별다른 이상은 안보이니 HxD에 넣어서 메타데이터를 보자.

 

#HxD

 - 파일 안에 잘 숨겨져 있는 것을 확인했다.

#HTML 변조

 

2) Try it yourself

 

#개발자도구

 - 정상적인 웹사이트는 데이터 검증을 하지만, 이 사이트는 하지 않는다.

 - total을 찾아서 값을 변조해봤지만, 화면상에서만 바뀌고 오답이 출력된다.

 - 조금 더 밑을 보니, type이 hidden인 숨겨진 태그가 보인다. 

  -> 0을 대입하고 checkout을 누르니 해결.

 

client side에서만 검증을 받게되면 이러한 취약점이 발생한다.

그러므로, server side에서도 검증을 받아야 한다.

#서버가 직접 권한을 검사해서 모든 클라이언트한테 출력을 다르게 하거나,

 클라이언트쪽에서 검사해서 접근은 할 수 있지만 출력값이 달라지게 할 수 있는데,

 후자를 이용한 사이트의 취약점(메모리 or 캐시 등엔 기록됌.)

 

2) Salary manager

 

 

#개발자도구 - network

 - network는 로드되는 모든 응답들을 보여주는데, 아무 것이나 조회하면 userid=101으로 뿌려지는 응답들이

  보인다.

 

 

#end

 

 

3) 돈을 안내고 살 수 있게 코드입력하기

 

 

#2번문제처럼 network를 검사.

 - 버튼들을 입력하다 보면 coupons/ 가 보이는데, 안에 있는 쿠폰 중, get_it_for_free를 입력하면 0원이 된다.

 

 

#end

 

#Client side attack : 서버에게 전달되기 전에, 프론트엔드에서 변조.

 

2) Fied Restrictions

 - select field with two possible values : 두 가지밖에 고르지 못한다.

 - Radio button with two possible values : 라디오 버튼 두 가지 밖에 고르지 못한다

 - Checkbox values either on or off : on 혹은 off인 체크박스

 - Input restricted to max 5 characters : 5글자밖에 쓰지 못한다.

 

 모든 제한된 것들에서 다른 것을 할 수 있어야 한다.

  ex) 두 가지 제한 --> 세 가지의 선택지

 

 

#개발자도구 사용

 - 모든 제한 사항을 넘치거나, 바꾸면 된다.

 

1. 옵션 2개제한

 -> 옵션쪽에서 우클릭 한 다음, edit as HTML 을 누르면 HTML 코드를 수정할 수 있게 되는데,

     <option value="option2">Option 2</option> 줄을 복사하고 붙여넣은 다음, 3으로 바꿔주면 된다.

 

2. 2가지의 라디오 버튼

 -> 라디오버튼을 1번과 마찬가지로 하나 복사해서 넣고, input type을 checkbox로 바꿔주고, 기존의 라디오 버튼 하나       도 마찬가지로 checkbox로 바꿔준다.

   라디오버튼 3개로 제출하니까 오답이 났었다. --> 문제에 라디오버튼이라고 명시해서 그런 것 같다.

 

3. on과 off가 가능한 체크박스

 -> input type을 text로 바꿔서 텍스트박스로 만들어버리자.

 

4. 5글자밖에 쓰지 못한다.

 -> maxlength="5" 부분을 6으로 바꾸고 value를 6자리로 바꿔주자.

 

#end

 

 

3) Validation

 - 모든 정규식에 맞지않는 값을 보내야 한다.

 

 

#특수문자를 모두 넣었지만 잘못되었다고 에러를 출력한다.

 

 

#버프슈트로 검사

 - 필드 7개가 에러를 출력했는데, error가 7이므로 0으로 바꿔서 request를 전송한다. --> error=0

 

 

#end

 - 개발자도구에서 이벤트 리스너를 지워주면 풀리기도한다.

+ Recent posts