워게임/Lord Of Sql Injection

Lord Of Sql Injection gremlin 1번문제

오늘부터 los 포스팅을 시작해야겠다


우선, 1번문제 (gremlin)는 매우 간단한 문제이다. 대충 소스 이해만 하면 쿼리를 짤 수 있는데,


이런식으로 소스코드를 볼 수 있다.


우선, 최종 query 를 위에서 쉽게 확인 할 수 있다.


또한 preg_match 함수에서 필터링하는게 딱히 중요한건 없다.


그리고 get으로 받은 값을 쿼리로 날려주게 되는데, Get으로 받았다는 점을 이용해 url 로 값을 날려줘야 한다.


$query "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";


이문구를 쿼리로 날리게 되는데, 딱히 무슨 id로 로그인을 해야 되는 점이 없으니, 간단한 인젝션을 해주면 된다.


우선 or을 막지 않는것을 보니 or을 사용하면 되겠다. or은 둘중 하나이상이 참이 있으면, true 를 반환한다.


그래서 id에다가 아무값이나 집어넣는다 하더라도 or을 이용해 1=1 같은 true 를 반환시켜주면 문제는 풀리게 된다.


또한, 뒤에있는 코드를 주석으로 만들어주기 위해 #도 같이 날려줘야 된다 (php 에서 주석은 #이다.)


우선, 


http://los.eagle-jump.org/gremlin_bbc5af7bed14aa50b84986f2de742f31.php  


이 뒤에다가 파라미터를 입력해야한다. 파라미터는 id 하나만 입력해 주면 되기에, 


http://los.eagle-jump.org/gremlin_bbc5af7bed14aa50b84986f2de742f31.php?id=

이런식으로 id값을 이용해야 한다.


우선, id에다가 a를 입력한다면

이런식으로 a가 싱글쿼터로 감싸지는것을 확인할 수 있다.


이를 통해 a뒤에 싱글쿼터를 하나 입력해주면, id의 값은 a가 되고, 다른값을 인젝션 할 수 있게 된다. 


나는 참값을 보내야 하기에, 대표적인 값인 1=1 을 보낼것이다. 0=0을 보내거나 'a'='a' 등을 보내도 된다.


따라서 ?id=a' or '1=1' 뒤에다가 주석을 의미하는 #을 입력해야한다. ?id=a' or '1=1'# 이런식으로 파라미터를 만들어주면 되긴하지만,


Url Encoding 된다는 점을 이용하여 #을 url 인코딩한 값을 날려주면 된다. 

 

이런식으로 #의 url encoding 값은 %23 임을 확인할 수 있다.

 

그러므로 파라미터를, ?id=a' or '1=1'%23 을 날려주게 되면,

 

 

이와같이 문제가 해결되는것을 확인할 수 있다.

 

url : http://los.eagle-jump.org/gremlin_bbc5af7bed14aa50b84986f2de742f31.php?id=a' or '1=1'%23