Challenge(old)_27
view-source로 코드를 확인한다.
sql 쿼리를 돌려서 id가 admin인 row를 출력하면 될 것 같다.
admin의 no가 2라는것까지 알려줬다.
근데 역시나 호락호락하지 않게 no로 입력되는 값을 필터링하고있다.
php 정규표현식을 공부할 때가 온 것 같다.
php의 정규표현식은 구분자(/ 등)로 시작해서 구분자로 끝나며 구분자 뒤에 옵션이 붙을 수 있다.
php 정규표현식을 전부 다 자세하게 다루지는 않고 편의상 문제에서 쓰인 정규표현식에 집중해서 설명을 해보자면
맨 마지막에 붙은 i가 옵션이다.
i는 대소문자를 구분하지 않는 옵션이다.
엄청 복잡해보이지만 |를 기준으로 구분하면 된다.
#, select, (, 띄어쓰기, limit, =, 0x를 필터링한다.
select id from chall27 where id='guest' and no=(여기를 채울 수 있다.)
우선은 1을 넣어보면
guest라고 맞게 뜨는걸 봐서 guest의 no가 1이었나보다.
2를 넣으면 query error라고 출력되는데 그건 지금 sql에 id가 guest라는 게 where에 있고 and로 연결되어 있어서 no를 아무리 2로 줘도 소용이 없다.
1 or no=2 이렇게 주면 될것 같다.
띄어쓰기랑 = 우회를 찾아보면..
띄어쓰기는 +, (), /**/, %0d, %0a, %09 이런 것들이 있고,
=는 어떻하지..?
찾아보니까 like로 된다고 한다.
1 or no=2 --> 1 or no like 2 --> 1/**/or/**/no/**/like/**/2
이렇게하면 guest라고만 뜨고 solve가 안된다.
like가 안먹히는 건가 싶어서 2 or no = 1이렇게도 해봤는데
마찬가지로 guest라고 뜨는 걸 봐서 맞는 like로 우회한 쿼리가 잘 돌아가는 것 같긴 하다.
아 그러면 guest를 아예 검색 안되게 해봐야겠다 싶어서
2 or no = 2로 했는데 또 guest라고 뜬다.
2)%09or%09no%09like%092
으음 ()괄호가 있는걸 못봤다..
다시다시
그러면 괄호를 우선 닫고 or no=2를 넣은다음 뒤에 남아있는 )를 주석같은거로 없애야겠다.
#은 필터링되니까 다른거 ;%00, --(공백)으로 우회
5)%0aor%0ano%0alike%0a2;%00
아 이런거 우회되는거 찾는거 너무 재미없다...
끗
정규표현식 참고
https://opentutorials.org/module/6/5141
http://tcpschool.com/php/php_regularExpression_concept