SQL Injection 정리

Peroro·2023년 5월 8일
0
post-custom-banner

SQL Injection

  • SQL Injection: 임의의 SQL문을 삽입해 실행하는 공격
  • 인증 우회, 데이터 추출, 변조 등 DB에 임의의 명령을 내릴 수 있다.

공격 유형

Union SQL Injection

  • SQL 질의문을 넣었을 때 결과값이 보이는 경우에 사용

Error based SQL Injection

  • 화면에 Error 메시지가 나왔을 때 사용
  • 논리 에러를 사용해야 한다.

Blind SQL Injection

  • 결과 값을 참과 거짓으로 구별할 수 있을 때 사용.
  • 대부분의 상황에서 사용할 수 있음.

Union, Error based: https://velog.io/@azurp158/4주차-수업
Blind SQLI: https://velog.io/@azurp158/5주차-수업

Prepared Statement

  • Prepared Statement: SQL Injection을 원천적으로 막는다.

php Prepared Statement

$index = 1;
$mysqli = new mysqli($dbserver, $dbuser, $dbpasswd, $dbname);
$sql = "select * from board where idx = ?";

$smst = $mysqli->stmt_init();
$smst->prepare($sql);
$smst->bind_param("i", $index)
$smst->execute();

$result = $stmt->get_result();
$stmt->close();
  • 바인딩할 파라미터가 문자라면 s, int형이라면 i로 한다.
  • 바인딩할 파라미터가 5개라고 가정하자. 파라미터의 개수에 맞게 데이터 유형 지정자 역시 개수를 맞춰야 한다.
$smst->bind_param("sssss", $word1, $word2, $word3, $word4, $word5)

맹점

  • order by, table column에는 Prepared Statement가 적용되지 않는다.
  • 이 때는 white List 기반 필터링이 필요하다.
    1. 화이트 리스트 -> 허락, 더 안전함.
    2. 블랙 리스트 -> 금지, 생각지도 못했던 방법으로 우회가 가능할 수 있어 화이트 리스트가 추천된다.

SQL Injection 예시

case 1

게시판 검색: sotingAd

case when (조건) then (참일 경우) else (r거짓일 경우)
mysql mssql oracle

sotingAd=,(case+when+ascii(substr(select+user+from+dual),1,1))=0
+then+1+else+(1/0)+end

-> case when ascii(substr(select user from dual),1,1))=0 
then 1 else (1/0) end
  • oracle에서는 가상DB dual을 써야함.
  • case when (조건) then 1 else 2 end;

case 2

page=1&board_id=&sorting=A.REG_DTsotringAd=ASC;if+substring((select%20user_name()), 1, 1)=%27a%27+waitfor+delay+%270:0:1%27

-> ASC; if substring((select user_name()),1,1)='a' waitfor delay '0:0:1'
  • 참일 때와 거짓일 때 차이 없을 때 사용하는 방식.
  • delay를 주어서 참일 때와 거짓일 때를 구별하는 방식.
  • 단점이 있다면 너무 느리다.

case 3

  • Concat
  • UNION SQLi, Error based SQLi 사용 가능
select 1,2,3,4,5 from member
  • 이때, 페이지는 2만 출력되는 경우에 concat을 사용해서 다른 값을 출력할 수 있다.
select 1,
concat(idx, 0x3a, id, 0x3a, password, 0x3a, email, 0x3a, date)
,3,4,5 from member
profile
오늘 공부한 것을 올리는 공간 / 일주일에 글 3개 / 블로그 이전 : https://perorochan321.tistory.com/
post-custom-banner

0개의 댓글