안녕하세요! SQL 인젝션에 대하여 공부를 하던중 제가 미숙한 SQL 문법을 발견해서 실험을 해본 내용을 남기는 글입니다!
해당 내용을 공부하며 Blind SQL 인젝션 진행시 ASCII를 굳이 쓸 필요 없이 if구문을 를 사용할 수도 있다는 것을 깨달았습니다. if 문으로 참 거짓이 바뀌는 것을 통해 Blind SQL 인젝션을 진행할때 사용해볼 수 있을것 같습니다. 개인적으로 ascii 값을 비교해서 하는방법이 힘들었는데 그것보다는 편해서 종종 이용해볼 것 같습니다 :)
SQL 인젝션 공부중 문자 하나만 출력해야 하는 상황에서 드는 의문이 있었습니다.
SQL 구문 결과값을 한문자만 출력하거나 TRUE , FALSE 로 출력하려면 어떻게 해야할까?
실험
1. 우선 기존의 로그인을 시도한다면 아래와 같은 구문을 사용해야 합니다.
> 기존 로그인 시도 SQL 구문
select password from userlog where id="james" and password="admin1234"
(원래는 컬럼명에 * 를 붙이지만 지금은 password 값이 출력되는지 확인차 넣어주었습니다)
2. 그러면 만약에 결과값을 한문자만 출력해야 한다면?
> 아래 사진과 같이 substr 함수를 사용하시면 됩니다. 여기서 헷갈리실 수 있는 포인트는 컬럼명이 들어갈 자리인데 substr() 함수가 들어가도 되냐? 인데, 컬럼명 부분을 저렇게 함수식으로 사용하게 되면 select password from userlog where id="james" and password="admin1234" 를 실행후 결과값에서 한글자만 가져오게 됩니다. 즉 substr이란 함수는 컬럼명에 영향을 미치는게 아닌 전체 쿼리 결과값에 영향을 미친다는 뜻이죠! substr 사용법은 아래와 같습니다.
substr([검색할 컬럼명],[추출 시작위치],[시작위치로부터 추출한 문자 개수])
> SUBSTR 을 이용한 한문자만 출력하는 로그인 시도 쿼리
select substr(password,1,1) from userlog where id="james" and password="admin1234";
3. SQL인젝션 시도시 유용한 하게 쓸수있는 IF 문
> 위에 substr 함수와 같이 Blind SQL 인젝션에 사용하기 좋은 if 구문이 있습니다. 사용법은 다음과 같습니다.
if([조건식],[참일경우 결과값],[거짓일경우 결과값])
> IF문을 활용한 참 거짓 쿼리
select if(substr(password,1,1)='a',true,false) from userlog where id="james" and password="admin1234";
> IF문을 활용한 참 거짓 쿼리 (Error Based SQL 인젝션용)
MySQL 에선 double 형 변수의 최대값을 넘어가게 되면 에러가 발생되도록 되어있습니다. dobule 형 변수의 범위는 다음과 같습니다. ( -1.22E-308 ~ 1.79E+308) << 만약 웹 서버의 디버깅모드가 켜져있다면 이 범위를 넘는 값을 삽입함으로써 에러를 의도적으로 발생시켜 Error Based SQL Injection 을 시도해볼수 있습니다.
select if(substr((password),1,1)='a', 9e307*2,0) from userlog where name='james';
(참일 경우 에러발생!) : password 맨 앞자리는 a 라는 문자가 맞기때문에 범위초과로 에러발생
(거짓일 경우 에러X) : 거짓일경우 조건식대로 0 을 출력한다.
4. 그런데 컬럼명이 이상하게 나옵니다... if(substr... 이라고 이상한 컬럼명으로 나오는데 이를 password 라는 컬러명으로 출력이 되도록 바꾸려면??
> 조건식 앞에 as 를 사용하시면 됩니다. as란 alias 의 약자로 별칭이란 뜻이며 as 이후 써주는 이름대로 컬럼명이 출력이됩니다.
> AS 를 사용한 컬럼명 변경
select if(substr(password,1,1)='a',true,false) as password from userlog where id="james" and password="admin1234";
긴 글 읽어주셔서 감사합니다!
'SQL' 카테고리의 다른 글
[SQL] UNION ,ORDER BY, LIMIT , LIKE (0) | 2024.05.26 |
---|---|
SQL 의 기초문법! (0) | 2024.05.17 |