SQL injection중에서 데이터 추출은 크게 3가지로 나누어 생각해 볼 수 있다.
1. sql 질의문이 화면에 보이는 경우
2. sql 에러가 응답에 포함되는 경우
3. sql 질의문이 화면에 보이지 않는 경우
먼저 sql 질의문이 화면에 보이는 경우를 공부해보자
sql 질의문이 화면에 보이는 경우
Union을 사용하여 select문을 1번 더 사용 하는 방법을 원하는 데이터를 추출할 수 있다.
sql 질의문의 형식을 생각해보면 select ◎◎◎ from ◎◎◎ where ◎◎◎ 와 같다.
그런데 아래 그림과 같이 검색하고자 하는 내용의 일부분만 입력하여도
검색이 되는 경우 질의문 안에 like를 사용하고 있다고 볼 수 있다.
따라서, 질의문 형식이 select ◎◎◎ from ◎◎◎ where id like '%%' 와 같은 형태일 것으로 추측할 수 있다.
(참고 : https://bactoria.tistory.com/22)
이 부분을 이용하여 sql injection이 가능한지 확인을 해본다.
step 1. 취약점 확인
질의문 형식을 고려하여 입력값에 mario%' and '1%'='1를 넣어 본다.
where id like '%mario%' and '1%'='1%'가 아래의 그림과 같이 정상적으로 출력이 되었다면
mario%' and '1%'='1가 아이디가 아닌 질의문으로 동작하였음을 알 수 있다.
이것으로 sql injection이 가능하다는 것을 확인하였다.
step 2. 컬럼 수 확인
컬럼 수는 order by를 통해 확인 가능하다.
테이블에서 데이터를 조회할 때, 지정된 컬럼을 기준으로 정렬 하려면 order by [컬럼명] 를 사용한다.
order by [숫자]를 사용할 경우에는 컬럼의 순서를 기준으로 정렬이 된다.
예) select id, pw, name from customer order by 2; 이라면 pw 기준으로 정렬된다.
이부분을 이용하여 순차적으로 숫자를 입력해본다.
위의 그림과 같이 5부터 화면에 아무것도 출력되지 않는다면, 컬럼 수는 4개이다.
step 3. date 출력 위치 확인
select뒤에 데이터를 입력하면 입력한 값이 출력이 된다.
화면에 모든 컬럼이 보이지 않는 경우가 많기 때문에
어떤 컬럼이 화면에 출력되는지 확인 하려면 step2를 통하여 확인한
컬럼수만큼 숫자를 데이터를 입력하면 화면에 어떤 컬럼이 출력되는지 알 수 있다.
예) 컬럼수: 6개 / 입력: select 1,2,3,4,5,6 / 화면출력 : 1,3,5,6
step 4. DB명 확인
mysql 에서 현재 디비명을 확인하려면 database()를 조회하면 된다.
DBMS마다 확인방법이 다름(참고 : https://noirstar.tistory.com/291)
step3을 통해 알게된 화면에 출력되는 컬럼 위치에 원하는 정보를 입력하여 확인한다.
Step 5. table명 확인
mysql에서 테이블 조회를 하려면 information_schema.tables를 확인해야한다.
(참고 : https://rk1993.tistory.com/230)
이것 역시 DBMS마다 다르다. (step4 링크에 다 포함되어 있음)
table_name을 화면에 출력되는 컬럼위치에 입력하여 조회하였더니
flag_table과 user_info가 보인다. flag를 찾아야 하므로 flag_table을 확인해본다.
Step 6. 컬럼 이름 확인
step5 와 같은 방법으로 information_schema.tables 통해 column_name을 조회하면
아래의 그림과 같이 컬럼 이름이 화면에 출력된다.
Step 7. 데이터 추출
위에서 알아낸 컬럼명과 테이블 명을 가지고 sql 질의문을 만들어 원하는 데이터를 추출한다.
'매일 해킹공부 > 웹 해킹' 카테고리의 다른 글
[Lord of Sqlinjection] 1번 문제 gremlin 풀이 (0) | 2023.01.20 |
---|---|
SQL Injection 대응방안 (0) | 2022.11.14 |
SQL Injection - 데이터 추출(Error Based SQLi) (0) | 2022.11.13 |
SQL Injection - 로그인 인증 우회 (1) | 2022.11.01 |
SQL Injection 정리 - 1 (0) | 2022.10.31 |