ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • |Lord of SQL_injection| #21 Iron_golem
    Wargame 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 기반도 나오겠죠?


    이제는 하루에 한 두문제 밖에 못풀겠다.


     마지막까지 꾸준하게 !! 








    댓글

Designed by Tistory.