관리 메뉴

FU11M00N

Lord of injection nightmare(18)단계 본문

Web Hacking/Lord of injection

Lord of injection nightmare(18)단계

호IT 2019. 11. 9. 02:01

안녕하세요 벌써 18단계 많은 문제를 풀어봤네요!!

바로 코드봅시다!!

이번 문제에서 금지시키는것은 prob,_(언더바) , .(쩜) ,( ) , # , - 입니다.. 되게많네요,,

그 다음엔 strlen 저번에 설명해드린 길이를 알려주는 함수입니다.

이것으로 pw에 값은 6글자이하가 되어야겠네요!!

solve는 id에 값이 오면 됩니다!!

이 문제 정말어려워서 저도 다른 글들 참조하면서 풀었습니다... 한번 풀이 가봅시다..

 

우선 이 문제에서 자동 형 변환이라는 개념을 알아야하는데요..

 

자동 형 변환이란 조건절에 있는 데이터 타입이 다르면 '우선 순위가 있는 쪽'으로 '형 변환'이

내부적으로 발생하게 되는 것을 말합니다.

 

자동 형 변환의 규칙은 다음과 같습니다.

1. 자동 형 변환은 테이블의 내용을 전체 다 살펴봅니다(전체스캔)

2. 기본적으로 문자열은 0으로 치환되어 비교됩니다.

그러하여 숫자와 문자를 비교하여 0을 비교하면 Ture값이 반환됩니다

3. 문자열과 숫자를 비교할 때 가장 처음글자와 숫자가 일치하는지 비교하고 참이면 Ture을 반환합니다.

 

 

알기쉽게 설명하기위해서 제가 테이블을하나만들어 설명해보겠습니다.

 

제가 사진과같은 테이블을 하나 만들었는데요,

여기서 아까 말했던 테이블의 내용을 전체살펴봐 전체스캔을하게됩니다.

문자 안에 있는 숫자는 숫자로 바뀌게 되고, 그와 일치하는 숫자가 있는지 확인하게 됩니다.



여기서 select *from nightmare where id=0; 을 하게되면

no 1,2,0,4,5, 가 검색됩니다!! 

이유는(중요!!) 

 

먼저 no 1,2,5 가 출력된이유는

 첫번째로 i가 문자이기때문에 비교하기위해서 0으로 치환됩니다.

그럼 결국 0과 i가 서로 비교하여 같기때문에 Ture값이 반환되어 

출력결과에 뜨는것입니다.

 

no 0,4이 출력되는이유는 말그대로 0과0을 비교하였기때문에 Ture가 반환되어 출력이 됩니다.

 

그럼 위와같은 개념을 적용하여,

여기서 이용할 자동 형 변환의 규칙 문자열은 숫자 0과 같다! 라는것을 알아야합니다


select id from prob_nightmare where pw=('')=0;') and id!='admin'
이렇게 ')=0;을하여 쿼리문을 마쳐야 정답이됩니다.

 

그러하여 저번에도말했듯 NULL을 사용하여 뒤에있는 쿼리문들을 없애줘야합니다.

')=0;%00 을해주면  NULL값을 정해주었으니

mysql은 ;까지가 쿼리문이구나하고 뒤에꺼를 무시하게되어 최종적으로

select id from prob_nightmare where pw=('')=0; 

이 쿼리문만 mysql이 인식하여 쿼리문이 전송될것입니다.

?pw=')=0;%00

이렇게 nightmare 정말 악몽같았던 문제 클리어입니다!!

 

번외로,,

 아까 strlen으로 길이가 6글자인데,

정답이 왜 ')=0;%00 가되냐고 생각할수있는데

%00 NULL은 글자수 하나로 인식되어

딱 6글자로 입력이 가능합니다!

 

그리고 글자수를 6자 이하로 정한거보니 아마

or 1=1 이것을 금지시키기위한것이 아닐까 생각되네요

 

 

Comments