My Drive

webhacking #18 본문

writeup

webhacking #18

sunnyeo.park 2014. 10. 23. 20:16

webhacking #18.


sql 인젝션 문제이다.

소스가 아래와 같이 제공되어 있다.



여기서 우리가 살펴볼 부분은 GET방식으로 no를 넘기고 있고,

if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); 

위와 같이 빈칸,/,(,),탭,|,&,union,select,from,0x 를 필터링 하고 있다.

"select id from challenge18_table where id='guest' and no=$_GET[no]"

쿼리문을 위와 같이 날리고 있고, 우리는 여기서 admin이라는 값이 반환되도록 해야 한다.



임의로 1을 입력해보니 hi guest라고 뜨는 것으로 보아, DB의 구조를 대략 파악해볼 수 있다.

no     |     id

1       |     guest

?       |     admin

또한 GET 방식이기 때문에 URL에 입력한 값이 노출된다.


admin 이라는 값이 반환되기 위해

"select id from challenge18_table where id='guest' and no=$_GET[no]"

에서 no를 1이 아닌 임의의 값으로 주어 guest가 반환되지 않게 한 후,

뒤에 추가로 admin을 반환하게 하도록 하면 된다.

많은 방법이 있겠지만, 아래와 같은 방법을 이용하였다.

"select id from challenge18_table where id='guest' and no=2 or id='admin'"

입력해 줘야 하는 구문에 빈칸이 들어 있으므로 이를 우회해 주어야 한다.

빈칸을 우회하는 방법은 아래와 같이 다양하다.

1. 주석    /**/ 

2. Line Feed (\n)    %0a

3. Tab    %09

4. 괄호    ( )

5. 더하기    +

6. 기타    %0b, %0c, %0d, %a0 .....


공백을 우회했음에도 성공하지 못하였다.


이 떄는 '가 막혀있을 확률이 높다.

sql 인젝션에서 '는 흔히 쓰이기 때문에 php 설정에서 못 쓰게 막을 수 있다.

그렇다면 문자열을 사용할 수 있는 다른 방법을 쓰면 된다.

id=0x61646d696e

id=0b0110000101100100011011010110100101101110

id=char(97, 100, 109, 105, 110)

등등 다양하다.


그 중 2진주로 변환하는 방법을 사용하였다.




'writeup' 카테고리의 다른 글

webhacking #26  (0) 2014.10.26
webhacking #25  (0) 2014.10.26
webhacking #38  (0) 2014.10.20
webhacking #47  (0) 2014.10.19
webhacking #54  (0) 2014.10.16
Comments