Webgoat 실습

CJY·2023년 4월 7일
0

컴퓨터보안

목록 보기
6/11

SQL Injection

Intro

9번


정답: Smith’ or ’1’=’1
SQL문에 대해 알려주고 여기에 어떻게 대입하면 테이블의 정보를 가져올 수 있는지 물어보는 문제였다. WHERE절의 조건이 어찌됐든 맨 마지막에 or과 함께 항상 참인 조건을 넣어주면된다. '를 고려하는 것도 잊으면 안된다.

  • “ or “a”=“a
  • ‘ or 1=1 --
  • ‘ or ‘a’=‘a
  • ‘) or (‘a’=‘a
  • “) or (“a”=“a

이 방법들이 SQL injection에 자주 사용된다.

10번


마찬가지로 Login_Count, User_Id가 어찌됐건 마지막에 or 1=1 --을 붙여줌으로 항상 참인 조건을 만들어줬다. 참고로 --은 SQL에서 뒤의 내용을 주석처리하는 것이다. 앞서 소개한 5가지 방법 중 어느 것을 넣어도 정답처리된다.

11번


문제에서 이름과 Authentication TAN을 모두 주어졌다. 역시나 마지막에 참인 조건을 붙여주면 테이블의 모든 정보를 반환해준다. 지금 이미 John Smith의 salary값을 바꾼 결과가 나와버렸는데 원래는 Tobi와 Bob보다 John의 salary가 낮았다. 다음 문제에 활용되니 잘 보고 가자.

12번

정답: Smith
3SL99A'; UPDATE employees SET SALARY=90000 WHERE USERID=37648 --

이번엔 테이블 값을 바꾸고 싶은 것이니 세미콜론(;)과 함께 원하는 SQL구문을 넣어주는 문제였다. SQL에서 세미콜론으로 여러개의 명령을 실행할 수 있다. UPDATE의 WHERE절은 John의 컬럼값 아무것이나 넣어줘도 상관없다. 그리고 SALARY는 그냥 임의로 90000을 넣은 것 뿐 다른 누구보다 높게만 설정해주면 된다.

13번

정답 : Smith';drop table access_log –

SQL을 조작한 나의 행동들이 로그에 남았다. 따라서 로그 테이블을 아예 없애버렸다.

advanced

3번


정답: helloWorld' or 1=1 ; select * from user_system_data –
또는 helloWorld' or 1=1 UNION select userid,user_name,password,cookie,null,null,null from user_system_data --

helloWorld는 그냥 임의로 넣어준 값이고 이 문제는 다른 테이블의 정보를 불러오는게 핵심이었다. 세미콜론을 이용하고 그냥 select문으로 원하는 테이블의 모든 정보를 가져와도 되고, UNION을 활용해 합쳐서 조회할 수도 있다.

친절하게 문제에서 테이블들의 기본 정보를 모두 제공해줬다. 참고로 UNION은 테이블 간 열의 개수가 동일해야하고 타입도 일치해야한다.

5번

정답 : thisisasecretfortomonly
풀이 :
1. 로그인 화면에서 SQL injection 시도. 실패, data명이 username_login, password_login
2. 회원가입 화면에서 SQL injection 시도. 실패, data명이 ~_reg임을 확인.
3. 조교님의 주소지 관련 힌트를 통해 아이디 중복 체크에서 가능성 발견.
4. 회원가입 아이디 칸에 tom’ and length(password)=? – 를 시도. 성공
5. 이후 23자리임을 알고 반복문으로 tom’ and substr(password,i,1)=’char(j)’ 시도. 성공
6. 손으로 길이와 구체적인 password를 알기 힘들어 파이썬 코드 작성.

XSS

7번

Credit card number를 입력 받은대로 돌려주므로 해당 인풋칸이 취약점이다.

11번

정답: 난수
풀이: 이전문제(10번)에서 친절히 start.mvc#test/가 해당 웹사이트에 존재함을 알려줬다.


GoatRouter.js에서부터 함수를 따라 들어가봤다. 결과적으로 pathVariable을 html 내용 안에 추가해주는 사실을 알았다. 그래서 URL에

http://127.0.0.1:8080/WebGoat/start.mvc#test/<script>webgoat.customjs.phoneHome();</script>

를 시도해봤지만 console창에 아무것도 나타나지 않았다. Jquery의 html함수에 대해 알아보고 했지만 해결할 수 없었다. 알고보니 주소창의 특수문자의 %인코딩문제였고 간단하게 ‘/’만 ‘%2F’로 바꿔주었더니 성공했다.

http://127.0.0.1:8080/WebGoat/start.mvc#test/<script>webgoat.customjs.phoneHome();<%2Fscript>

Hijack a session

hijack_cookie값이 없는 상태로 Burp Suite의 repeater를 통해 계속 repeat을 보내봤다. 조교님의 설명대로 뒷부분은 시간을 나타내는 것이었고 앞부분은 그냥 request할 때마다 1씩 올라가는 것 같았다. 근데 조금 이상했던게 하이잭쿠키의 앞부분이 가끔은 2씩 올라가고 대부분은 1씩 올라가는 것이었다. 거기서 조교님이 말씀하셨던 비록 나 혼자 로컬 서버에서 연습하는 것이지만 세계적인 사이트에 여러 클라이언트가 접속 중이라고 상상하며 풀어야 풀릴 것이라는 말이 이해가 갔다. 중간에 2가 올라간 것은 내가 아닌 다른 누군가가 로그인을 시도했다는 것이었고 이제 그 세션 앞부분을 가지고 뒷부분은 무작위로 대입하면 되는 것이었다. 이제 intruder를 이용해 다음과 같이 설정했다.


4504와 5624는 내가 받은 뒷부분 시간값이었다.
그런데 돌리자마자 Congratulation이라는 피드백을 받았다. 아마 Burp Suite의 community 버전을 생각한 출제자의 배려였나 싶다.

profile
열심히 성장 중인 백엔드

0개의 댓글