SQL DML
1. intro
SQL에는 Data Definiton Language (DDL), Data manipulation Language(DML), Data Control Language(DCL) 총 세가지의 질의 언어를 제공한다.
이번 시간에는 세 가지 중 DML에 대해 알아볼 건데, DML은 데이터베이스에서 데이터를 조회, 추가, 삭제, 수정을 수행하는 구문이다. 우리가 웹 서비스에서 이용하는 대두수의 기능은 DML을 통해 처리한다 해도 과언이 아닐 정도로 가장 많이 사용된다. DML 구문을 사용하는 목적과 형태를 알고 있다면 SQL injection 공격을 보다 쉽고 빠르게 이해 할 수 있다.
2.DML
(1)SELECT
select는 데이터를 조회하는 구문이다. 아래는 공식 홈페이지의 구문 예시이다.
# mysql SELECT Statement https://dev.mysql.com/doc/refman/8.0/en/select.html
SELECT
select_expr [, select_expr] ...
FROM table_references
WHERE where_condition
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[ORDER BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
- SELECT: 해당 문자열을 시작으로, 조회하기 위한 표현식과 컬럼들에 대해 정의 한다.
- FROM : 데이터를 조회할 테이블의 이름이다.
- WHERE: 특정 조건을 만족하는 데이터를 찾는다. (조회할 데이터의 조건)
- ORDER BY: 조회한 결과를 원하는 컬럼 기준으로 정렬한다.
- LIMIT : 조회한 결과에서 행의 갯수와 오프셋을 지정한다.
SELCT 사용 예시
아래 쿼리를 살펴 보자, 먼저 FROM 절을 사용해 board의 테이블의 uid, title, boardcontent 데이터를 검색,
WHERE절을 사용해 boardcontent 데이터에 "abc" 문자가 포함되어 있는지 찾는다.
이렇게 찾은 데이터를 ORDER BY절을 통해 uid를 기준으로 내림 차순으로 정렬 후
LIMIT5 -5개 행을 결과로 반환한다.
SELECT
uid, title, boardcontent
FROM board
WHERE boardcontent like '%abc%'
ORDER BY uid DESC
LIMIT 5
(2)INSERT
insert는 데이터를 추구하는 구문이다. 아래는 공식사이트의 사용 예시이다.
# mysql INSERT Statement https://dev.mysql.com/doc/refman/8.0/en/insert.html
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{ {VALUES | VALUE} (value_list) [, (value_list)] ...
|
VALUES row_constructor_list
}
- INSERT - 해당 문자열을 시작으로 추가할 테이블과 데이터를 정의한다.
- INTO - 데이터를 추가할 테이블의 이름과 컬럼을 정의한다.
- VALUES: INTO 절에서 정의한 테이블의 컬럼에 명시한 데이터들을 추가한다.
INSERT 사용 예시
INSERT
INTO board (title, boardcontent)
VALUES ('title 1', 'content 1'), ('title 2', 'content 2');
INTO절을 활용해 추가할 테이블과 컬럼을 각각 board와 title, boardcontent로 명시한다
VlLUES절을 통해 INTO 절에서 명시한 테이블에 각각 컬럼에 "title1" , "content1"과 "title2", "content2" 데이터를 추가한다. 이처럼 쿼리 한 줄로 두개이상의 데이터 추가가 가능한다.
INSERT
INTO board (title, boardcontent)
VALUES ('title 1', (select upw from users where uid='admin'));
이 예시는 서브 쿼리를 통해 다른 테이블에 존재하는 데이터를 추가할 수 있는 예시이다.
쿼리를 살폅면 INTO 절은 동일 한다.
그리고 데이터를 추가하되, boardcontent에는 SELECT 구문을 실행해 users 테이블에 uid 칼럼의 값이 "admin"인 행을 찾고, 해당하는 행의 upw 데이터를 추가한다.
#이렇게 되면 values의 select구문의 값이 title과 boardcontent 에 다 들어가는 건지 잘 이해되지 않는다.
(3) UPDATE
update는 데이터를 수정하는 구문이다. 아래는 공식사이트의 사용 예시이다.
# mysql UPDATE https://dev.mysql.com/doc/refman/8.0/en/update.html
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET assignment_list
[WHERE where_condition]
- UPDATE - 해당 문자열을 시작으로, 수정할 테이블을 정의한다.
- SET - 수정할 컬럼과 데이터를 정의한다.
- WHERE - 수정할 행의 조건을 정의한다.
UPDATE 사용 예시
UPDATE board
SET boardcontent = "update content 2"
WHERE title = 'title 1';
쿼리를 살펴 보면 board 테이블의 boardcontent 컬럼을 "update content 2" 문자열로 수정한다.
수정 될 데이터의 조건은 title 컬럼의 값이"title 1"인 행이다. (WHERE 절을 통해 알 수 있음)
(4) DELETE
DELETE는 데이터를 삭제하는 구문이다. 아래는 공식사이트의 사용 예시이다.
# mysql DELETE https://dev.mysql.com/doc/refman/8.0/en/delete.html
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
- DELECT - 해당 문자열을 시작으로, 이후에 삭제할 테이블을 정의합니다.
- FROM - 삭제할 테이블을 정의합니다.
- WHERE - 삭제할 행의 조건을 정의한다.
DELETE 사용 예시
DELETE FROM board
WHERE title = 'title 1';
FROM - board 에티블 정의
WHETE - title의 컬럼이 "title 1"인 행을 삭제 하는 것
(5) 실습
dreamhack SQL-DML 실습 과제이다.
오늘 위에서 설명한 개념들을 응용하여 이것 저것 대입을 해보다가 갈피를 잡지 못하여, 결국 힌트를 보게 되었다.
힌트의 내용은 이러하다
이 힌트가 의미하는 것은 아마, injection을 활용해 insert 값 제어를 할 수 있다는 취약점을 알려주는 것 같다.
조금 더 이를 가지고 놀아보아야 답에 도달 할 수 있을 것 같다.
나는 이미 insert절이기에 위에서 배운 다른 SELECT, DELET 같은 절을 사용하지 못하는 줄 알았다.
그래서 INSERT 절의 함수 기능을 통해서 최대한 해결 하려다 보니 오히려 더 깊은 늪에 빠지는 듯 했다.
위 답은, injection을 통해 text값을 조정한다.
Selcet절을 통해 admin 테이블에 있는 upw 값을 정의하는 것으로 보여진다.
(너무 어려웠다,,,난 아직 많이 부족함을 느꼈다.)
3.REVIEW
SQL injection에 대해서는 저번 1차 강의에서 언뜻 배운 기억이 있다. 아직 이 블로그에는 정리를 하지 않았지만,,,
일단 이번 강의를 통해 SQL -DML에 대해서 사용할 수 있는 함수들을 알게 되었고
마지막 실습과제에서 머리를 싸매면서 어떻게 작동하고, 어떻게 injection을 발생 시켜야 하는지 정말 실과 같은 느낌을 받았다. 많이 부족함을 느끼고, 더 시간을 할애 해야 할 것 같다.
'IT > 웹해킹' 카테고리의 다른 글
SQL injection -4 (2) | 2023.01.25 |
---|---|
SQL Injection -3 (0) | 2023.01.24 |
SQL injection-2 (0) | 2023.01.24 |
Web 해킹 이해하기 (0) | 2023.01.19 |
무작정 웹해킹 공부해보기 (0) | 2023.01.10 |