minhui study

Webhacking.kr 27번 본문

Hacking/Webhacking.kr

Webhacking.kr 27번

minhui 2020. 2. 14. 19:50

Challenge 27 - 150 Points

 

바로 소스코드를 확인해보자.

코드의 전반적인 흐름을 보면 id값에 admin이 들어가게 되면 풀리는 문제인 것 같다.

데이터베이스 테이블 중에서 id가 guest이고 no가 사용자로부터 전달받은 그 파라미터에 해당하는 값인 그 데이터를 찾아서 id값을 조회한다는 것을 알 수 있다. 이를 통해 데이터베이스의 테이블에는 문자열인 id와 정수인 no가 있다는 걸 알 수 있다.

 

그래서 위 화면을 보면 사용자가 1을 넣었을 때 id가 guest이고 no가 1인 id가 조회되어서 $q에 guest값이 담기게 되었고 그 결과 guest가 화면에 출력된 것을 확인할 수 있다. 

하지만 만약에 2이상의 값들을 입력하게 된다면 테이블에는 id가 guest면서 no가 2이상인 정보는 없으므로 query error가 뜨게 되는 것이다. 문제가 풀리기 위해서는 id가 admin이고 no가 2인 데이터가 테이블에서 조회되어야 한다.

 

select id from challenge 27_table where id='guest' and no=(0) or no=(2)

 

or no=2앞에 있는 것이 거짓이라면 자연스럽게 사라질 것이고 where no=2만 남으므로 admin이 조회될 것이다.

하지만 0) or no=(2를 입력했을 때 다음과 같이 no hack이 뜬다.

 왜냐하면 다음의 코드에서 ()을 사용할 수 없게 해놨기 때문이다.

if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");

이 때 우리는 다음과 같이 주석처리를 사용해볼 수 있다.

select id from challenge 27_table where id='guest' and no=(0) or no=2--)

=도 사용할 수 없으므로 like로 바꾼다.

select id from challenge 27_table where id='guest' and no=(0) or no like 2--)

url에 ?no=0)%09or%09no%09like%092%09--%09라고 입력하면 문제가 풀린다.

'Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 32번  (0) 2020.02.15
Webhacking.kr 31번  (0) 2020.02.15
Webhacking.kr 25번  (0) 2020.02.14
Webhacking.kr 19번  (0) 2020.02.14
Webhacking.kr 54번  (0) 2020.02.14
Comments