본문 바로가기

매일 해킹공부/웹 해킹

[Lord of Sqlinjection] 1번 문제 gremlin 풀이

위의 코드를 보면 총 입력할 수 있는 항목이 2가지가 있다.

1. id='{$_GET[id]}'

2. pw='{$_GET[pw]}'

 

먼저 각 항목에 값을 입력하면 어떻게 보이는지 아무거나 입력해본다.

(파라미터에 id와 pw를 입력한다.)

SQL 주입 공격을 방지하기 위해 특정 문자에 대한 사용자 입력을 확인하지만

주석을 할때 사용하는 문자를 필터링하지는 않는것으로 보인다.

일단 아이디 비밀번호를 모두 모르기 때문에 주석만 가지고는 문제를 풀기 어려울것 같다.

논리 연산자를 사용하여 문제를 풀어보려 한다.

 

1. 논리 연산자만 사용하기

ID에 임의의 값을 입력하고 PW 부분에 그 유명한 1' or '1'='1 을 입력한다.

입력한 값은 모두 '이곳' 에 입력된다. 따라서 pw에 1' or '1'='1 을 입력할 경우 
pw='1' or '1'='1' 형태가 되어 쿼리가 동작하게 된다.

 

2. 논리 연산자 와 주석을 함께 사용하기

1번의 원리를 이용하여 이번에는 아이디 비밀번호를 각각 입력하는것이 아닌

아이디 부분에만 값을 입력하는 방법으로 주석을 입력하여 뒷부분은 생략되도록 한다.

ID에 asdfsfd' and pw='1' or '1'='1'# 을 입력한다. (id = 'asdfsfd' and pw='1' or '1'='1'#')

그런데 위와 같이 입력하면 원하는 값이 출력되지 않는다.#을 입력했으나 출력되지 않는 것으로 보아 #이 생략되도록 동작하는것 같다.그런데 파라미터를 자세히 보면%271, %27 이라는 값이 보이는데

이것은 문자를 ASCII Encoding한 것이다.  (구글링하면 나옴)

#을 ASCII Encoding 하면 %23이라는 값이 나오고

이것을 입력하면 다음과 같이 문제가 해결되는 것을 볼 수 있다.