일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AVR
- sha1
- burpsuit
- reversing
- php_extract
- 시저 암호
- Python
- cookie
- 카이사르 암호
- Qrcode
- base16
- webhacking
- JavaScript
- Pigpen Cipher
- aslr
- Linux
- Fortran 90
- vigenere cipher
- overthewire
- base32
- 비즈네르 암호
- Masonic Cipher
- assembly
- Web Hacking
- sql injection
- Javscript
- Caesar Cipher
- BASE64
- Navajo alphabet
- Mail Header injection
- Today
- Total
My Drive
webhacking #18 본문
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 |