이번 문제는 where절의 pw가 ('')로 감싸져 있다. 또한 id는 admin이 아니라고 박혀있다.
solve를 얻기 위해선 쿼리문의 값이 있어야 solve를 얻을 수 있다.

 

문제를 풀기 앞서 pw에 대한 검사가 있었다.

  • prob, _, ., (), #, -를 필터링
  • 길이가 6 초과를 하면 안됨.

일단 #, --를 사용해서 and id != 'admin'를 주석 처리하는 것은 포기해야할 것 같다.
인터넷에 주석 방법을 찾아보니 #, --, /**/, ;%00 4가지 방법이 있었다.

 

이 중 #, --은 필터링 때문에 불가능하며, /**/*사이에 쿼리문이 들어가야 함으로 현 문제에서 사용이 불적합하다.
즉, ;%00을 이용하여 and id != 'admin'를 주석 처리해야한다.

 

select id from prob_nightmare where pw=(';%00') and id!='admin'에서 select id from prob_nightmare where pw=('으로 되기 때문에 pw를 True로 만들 방법을 생각해야한다.

 

일단 ('로 내두면 어떠한 값을 넣어도 쿼리문이 Error를 발생시키기 때문에 ('')으로 만들어줘야한다.
그럼 pw=('')임으로 아무 값이 없기 때문에 False로 된다. 이 때문에 ''사이에 값을 넣어서 True로 만들어야한다.

 

몇가지 SQLI의 사례를 살펴본 결과 pw=('')=0으로 True로 만들어 줄 수 있다는 것을 알 수 있었다.
이것은 pw=('')이 False이고, 0은 Fasle이고 이들을 False = False로 비교하면 True로 나오게 된다.

 

문제를 쉽게 클리어할 수 있었다.

복사했습니다!