Webhacking.kr

Challenge(old)_27

꼬마인간 2020. 7. 2. 10:32

Challenge(old) 26

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/**/

이렇게하면 guest라고만 뜨고 solve가 안된다.

like가 안먹히는 건가 싶어서 2 or no = 1이렇게도 해봤는데

마찬가지로 guest라고 뜨는 걸 봐서 맞는 like로 우회한 쿼리가 잘 돌아가는 것 같긴 하다.

아 그러면 guest를 아예 검색 안되게 해봐야겠다 싶어서

2 or no = 2로 했는데 또 guest라고 뜬다.

2)%09or%09no%09like%09

 

으음 ()괄호가 있는걸 못봤다..

다시다시

그러면 괄호를 우선 닫고 or no=2를 넣은다음 뒤에 남아있는 )를 주석같은거로 없애야겠다.

#은 필터링되니까 다른거 ;%00, --(공백)으로 우회

5)%0aor%0ano%0alike%0a2;%00

아 이런거 우회되는거 찾는거 너무 재미없다...

 

 

정규표현식 참고

https://opentutorials.org/module/6/5141

http://tcpschool.com/php/php_regularExpression_concept