Yozzang의 해킹일기 💻
article thumbnail
728x90

이번 포스트에서는 Lord of SQLInjection의 nightmare문제에 대해 다루겠다.

 


문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다.

nightmare

## 문제 해석 : 

해당 문제는 preg_match() 함수를 통해 prob, _, ., (, ), #, -를 필터링하고 있으며, pw의 길이가 6보다 크면 안된다는 것도 알 수 있다.

또한 id값이 존재할 때만 문제를 해결할 수 있는 것으로 보인다.

 

## 문제 풀이 : 

해당 쿼리를 항상 True를 반환할 수 있게끔 하면 되는데, 총 입력 가능 글자수가 6글자인 것을 고려해야한다.

 

먼저 해당 쿼리를 항상 True로 반환하는 공격문을 시도해보겠다.

### 사용할 공격문 : pw=')||1;%00

### 실행 결과 : 

1차 시도

";%00"은 주석을 우회하는 구문이고 방금 시도한 길이가 7이어서 "No Hack"라는 구문이 뜬 것을 알 수 있다.

 

그럼 다르게 한 번 생각해보면, 우리는 pw의 값을 모르기 때문에 "입력된 pw의 값이 False다"라는 구문의 최종 결과가 True인 것을 활용하여 공격해보겠다.

### 사용할 공격문 : pw=')=0;%00

### 실행 결과 : 

공격 성공

## 추가 해석 :

쿼리문 : pw=('')=0;%00

"pw=('')"라는 쿼리문이 False이기 때문에 뒤에 다가 False를 뜻하는 0과 등호(=)를 활용하면 된다. 즉 "pw=('')[False] = 0[False]" = True이라는 원리를 활용한다는 것이다.

profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!