※ 선행 학습 필요 개념
Union SQL Injection
2개 이상의 쿼리를 요청하여 결과를 얻는 UNION 연산자를 이용해 SQL Injection 공격을 가하는 것을 말하며 공격자는 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어낸다.
공격이 가능한 전제 조건은 컬럼의 수가 같아야 하며 데이터 형식도 같아야 한다.
step 1. 컬럼 갯수 알아내기
갯수를 알아내기 위해 앞의 쿼리문에 이어서 union select 1, %23 으로 쓴다면 에러가 뜰 것이다.
그러나 union select 1, 2, %23 => union select 1, 2, 3, %23 ... 순으로 컬럼의 갯수를 늘려가다보면 에러가 나지 않는 때가 나올때, 즉 컬럼의 갯수가 일치할 때를 알 수 있다.
컬럼 전체가 출력되는 것이 아니라 몇몇 걸럼들만 결과만 나오게 되는데 이를 사용하여 우리가 결과값을 불러올 수 있는 걸럼을 알 수 있게 된다.
또한 order by 절을 이용하여 컬럼의 갯수를 알아낼 수 있다.
where 절의 뒤에 order by 1 %23 => order by 2 %23... 순으로 하나 씩 올려가다 보면 에러가 뜰텐데 이 에러가 뜨지 않는 최대의 수가 바로 컬럼의 갯수이다.
step2. 버전, 사용자 DB명 알아내기
컬럼의 갯수를 확인하였다면 숫자 대신 version(), user(), database()를 넣어준다.
이때 유의할 점은 아까 컬럼의 갯수를 알아낼 때 같이 알아낸, 우리가 결과값을 불러올 수 있는 컬럼에 넣어줘야 한다.
my sql의 버전, 사용중인 user의 이름과 권한, 그리고 현재 database의 이름을 알아냈다면 table의 이름을 알아낼 차례이다.
table의 이름을 불러오는 구문은 `union select table_name from information_schema.tables where table_schema = database() 이다.
이때, web에서는 가장 상위에 있는 하나의 줄만을 가져오기 때문에 limit절을 사용해주어야 한다.
union select table_name from information_schema.tables where table_schema = database() limit 0,1 %23
union select table_name from information_schema.tables where table_schema = database() limit 1,1 %23...
순으로 한 줄씩 내려가며 필요해보이는 table의 이름을 찾을 수 있다.
table의 이름을 찾았다면 컬럼의 이름도 찾아야 한다.
찾아낸 table의 이름을 user라고 하자.
그렇다면 컬럼의 이름을 불러오는 구문은 table과 동일하게
union select column_name from information_schema.columns where table_name = 'user'입니다.
당연하겠지만, table_name에는 아까 찾은 이름을 넣고 컬럼의 이름을 불러올때도 똑같이 limit 0,1 %23 => limit 1,1 %23 => limit 3,1 %23... 순으로 limit절을 사용하여 한줄씩 내려가며 찾아야 한다.
※ WebGoat SQL Injection chapter 3 문제
문제를 보게 되면 user_system_data 테이블에 대한 내용이 나와있고, union이나 join을 이용하여 Dave's의 password를 풀이하라고 나와있다.
우선, Name에 쿼리를 참으로 만들어 컬럼 개수를 확인해보기로 한다.
컬럼의 갯수가 총 7개인 것을 확인할 수 있었다.
이제 컬럼의 갯수에 맞는 쿼리문을 UNION SELECT 구문을 활용하여 작성해본다.
'or 1=1 UNION SELECT userid, user_name, password, cookie, NULL, NULL, NULL FROM user_system_data--
해당 값을 입력하게 되면 dave의 패스워드를 확인할 수 있다.
이제 패스워드 값을 입력하여 결과를 확인해본다.
'모의해킹 > 웹해킹' 카테고리의 다른 글
[Web Hacking] WebGoat SQL Injection(mitigation) 문제풀이 (0) | 2020.02.25 |
---|---|
[Web Hacking] WebGoat SQL Injection(advanced) 5 문제풀이 (0) | 2020.02.24 |
[Web Hacking] WebGoat SQL Injection 문제풀이 (0) | 2020.02.21 |
[Web Hacking] OWASP A1 인젝션 종류 (0) | 2020.02.14 |
[Web Hacking] CentOS8 WebGoat 설치 (0) | 2020.02.12 |