본문 바로가기
워게임/LoS

[los 문제풀이] nightmare

by 그적 2021. 3. 24.

풀고 나면 꽤나 쉬운 문제라고 생각이 들것이다.

 

먼저 GET방식으로 보내는 pw 값이 6보다 작은 조건 하에, 그 아래 쿼리문이 실행되도록 해야 한다.

  // 처음에 strlen을 우회해보려고 여러 시도를 해봤는데 삽질이었다..

 

어떻게 해야 할까 고민을 많이 하다가 preg_match 필터링에 '(싱글 쿼터)가 없는 것을 보고, 'pw에 입력되는 값을 닫아버리고 pw= 식 자체를 참으로 만들어버리자'라고 생각했다. pw의 값을 닫아버리려면 pw=('')를 입력하고, 해당 식을 참으로 만들기 위해 =0를 붙이면 된다. 물론 그 뒤에 있는 값들은 주석처리가 되어야 한다.

 

입력 >> ?pw=')=0;%00

 

위의 값을 입력하면 다음과 같은 쿼리문이 나오고, 문제가 풀린다.

 

----------------------------

다른 블로그에서는 mysql 문자열이 정수와 만나면 0으로 자동형 변환되어 풀었다고 했는데, 내 생각은 조금 다르다..

pw=('') 자체의 참 거짓을 확인하면 거짓이다. 따라서 우리는 false, 즉 0을 붙여줌으로써 (거짓=거짓)의 식이 만들어지고 (거짓=거짓) 식의 결과는 참이라는 것을 이용해야 한다고 생각한다.

 

동일한 쿼리문으로 다른 데이터베이스에 적용시켜보겠다. 결과는 where 조건이 참이므로 데이터베이스에 있는 모든 레코드 값이 출력되었다. 

그럼 ShipperName=('')=0 식의 결과는 현재 참이니까 여기다가 =true 혹은 =1을 붙이면 똑같은 레코드가 출력될까? 정답은 그렇다. ((거짓=거짓)=참)이 되므로 해당 식은 결국 또 참이다. 따라서 데이터베이스 전체 레코드가 출력되는 동일한 결과가 나왔다.

false 혹은 0을 대입하면? where 조건이 거짓이므로 데이터베이스의 레코드 값이 출력되지 않는다.

 

// 번외로 네번째 레코드 값이 존재하지 않는 상태에서 =0(거짓)을 비교해주면 결과는 참이 된다. 

----------------------------

 

'워게임 > LoS' 카테고리의 다른 글

webhacking.kr old 58번 문제 풀이  (0) 2021.11.03
[los 문제풀이] dragon  (0) 2021.03.31
[los 문제풀이] zombie_assassin  (0) 2021.03.08
[los 문제풀이] succubus  (0) 2021.03.07
[los 문제풀이] assassin  (0) 2021.02.15

댓글