-
|Lord of SQL_injection| #21 Iron_golemWargame Site/SQL injection 2019. 2. 22. 15:24
이제 어느덧 세 줄 만 남겨 놓고 있는 상황 !!
스피드 하게 나가보자~
21단계 문제 iron_golem 이다. PHP 를 분석해보니 이번에는 "Hello admin" 과 같은 안내문을 출력해주지 않는 단계이다.
Blind SQL Injection 을 하기 위해선 사용자의 입력에 따라 화면이나 코드에 변화가 생겨야한다.
if(mysql_error( )) exit(mysql_error( ));
다음과 같이 SQL Error 를 출력해주는 취약점이 존재한다는 것을 알 수 있다.
sql 의 조건문과 관련된 함수를 사용해서 pw 에 대한 정보를 질의한 뒤 pw 에 대한 정보를 알아내면 될 것 같다.
if( 조건 , 참일 때 실행 문장, 거짓일 때 실행 문장 )
참일 때 실행될 문장을 SQL Error 를 발생하는 문장으로 설정했고,
거짓일 때 실행될 문장은 SQL Error 가 발생되지 않도록 설정했다.
case when 조건 then 참일 때 실행 문장 else 거짓일 때 실행 문장 end
이 또한 참일 때 실행될 문장을 SQL Error 를 발생하는 문장으로 설정했고,
거짓일 때 실행될 문장은 SQL Error 가 발생되지 않도록 설정했다.
자, 그렇다면 어떻게 에러를 발생하는 문장을 만들까?
먼저 SQL 에는 서브쿼리라는 것이 존재한다.
from 절, where 절, having 절들 다음에 오는 쿼리문을 서브쿼리라고하며,
간단하게 처음 select 가 있는 Main query 다음에 select 가 다시 왔을때를 의미한다.
Subquery 를 사용할 때는 괄호를 쳐야한다는 규칙이 있다.
우선 emp 테이블의 모든 정보를 탐색해보자.
이 때, JONES 이라는 사원의 봉급(sal)보다 높은 사람들을 출력하고자 할 때, 어떤방법이 있을까?
서브쿼리를 배제하고 생각한다면 다음과 같은 과정을 통해 문제를 해결할 수 있다.
1. JONES 의 봉급(sal)을 질의한다.
2. JONES 의 봉급보다 큰 사람들을 질의한다.
두 개의 쿼리과정을 하나로 만들어 놓은 것이 바로 서브쿼리이다.
서브쿼리는 세 가지 종류가 있으며, 또한 그에 걸맞는 연산자들이 있다.
참고 사이트 : http://www.gurubee.net/lecture/2179
서브쿼리의 결과가 하나의 행인 단일행 서브쿼리
서브쿼리의 결과가 여러개의 행인 다중행 서브쿼리
서브쿼리의 결과가 여러개의 열인 다중열 서브쿼리
다중행 subquery 에 단일 행 연산자가 사용된다면 SQL Error 가 발생하는 것을 확인할 수 있다.
또한, 출력하고자하는 field 수와 탐색결과의 field 수가 다를경우 Error 가 발생한다.
예를들어 select [ ] union select [ ] 과 같은 예를 들 수 있다.
union 이란 표현은 출력결과를 덧붙이는 역할을 한다.
[1 번 select 문] union [2번 select 문]
1번 select 문의 결과에 2번 select 문을 덧붙이는 명령문이다.
이 때 1 번 select 문의 결과 field 가 2 개 라면, 2 번 select 문의 결과 또한 2 개여야 한다.
하지만, 출력하고자하는 field 는 id 하나이고, select 1 union select 2 는 field 가 2개이므로 에러가 난다.
하지만, select 1 union select 1 은 1 하나의 필드만 출력이 된다.
조건문 없이도 Error SQL Injection 을 할 수 있는 구문이다.
예를 들어 select 1 union select [조건] 과 같이 설정해놓았을 때,
조건이 참이라면 1을 반환하여 1 개의 필드로, 조건이 거짓이라면 0을 반환하여 2개의 필드로 인식하여
그 차이를 가지고 SQL Injection 을 시도할 수 있다.
예를 들어 참일때 에러가 발생하도록 하려면 (이문제에 한함)
select 0 union select [참인 조건]
거짓일 때 에러가 발생하도록 하려면
select 1 union select [거짓인 조건]
과 같은 형식을 사용하면 된다.
다음과 같은 string 을 탐색하도록 코딩하였다.
짜잔!?
그 출력결과가 어디서 많이 봤던 패턴이었다.
바로 나를 괴롭혔던 Xavis 와 같은 패턴이었고, 이번엔 그 때보다 길었다.
그래서 이번에는 코드를 실행 했을 때 한국어 Password 가 바로 출력되도록 했다.
if 사용
case 사용
select [ ] union select 조건 을 이용
짜잔!!
이제 SQL Injection 의 다양한 방식들이 나오는 것 같다. Error 기반 SQL Injection 을 해결해보았고,
이제 아마 Time 기반도 나오겠죠?
이제는 하루에 한 두문제 밖에 못풀겠다.
마지막까지 꾸준하게 !!
'Wargame Site > SQL injection' 카테고리의 다른 글
|Lord of SQL_injection| #23 Hell_fire (0) 2019.02.23 |Lord of SQL_injection| #22 Dark_eyes (0) 2019.02.23 |Lord of SQL_injection| #20 Dragon (0) 2019.02.20 |Lord of SQL_injection| #19 Xavis (0) 2019.02.20 |Lord of SQL_injection| #18 Nightmare (0) 2019.02.15 댓글