2022. 3. 29. 00:32ㆍSite/LOS
이번시간에는 sql injection과 관련된 문제를 풀 수 있는 wargame인 LORD OF SQLINJECTION의 gremlin을 풀어보겠습니다
gremlin을 누르니 위의 소스코드가 보입니다
일단 $db변수에 db를 연결해서 저장을 하고있고
preg_match함수를 통해 get으로 받은 id값중에 /prob, _, ., (, ) 가 있으면 No Hack ~_~을 출력하네요
두번째 preg_match함수도 get으로 받은 pw값중에 /prob, _, ., (, ) 가 있으면 No Hack ~_~을 출력합니다
$query에 prob_gremlin 테이블에서 get으로 받은 id값과 pw값이 일치하면 id값을 저장을 합니다
그리고 $result의 id값이 참이라면 클리어 되는 것 같습니다
접근방법
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
쿼리부분에서 id값 pw값을 아무값을 집어넣어 거짓으로 만들고 or 연산자를 붙여 뒤에 항상 참인값인 1=1을 넣어주면 모든 정보가 출력되므로 클리어 될 것 같습니다
cf) 1 or 1은 항상 참이므로 조건에 or을 추가하여 이러한 방법을 사용하면 앞의 값이 false라도 false or true -> true인 방법으로 접근할 수 있음
$query = "select id from prob_gremlin where id='gremlin' and pw='1' or '1'='1'";
이렇게 작성을하면
$query = "select id from prob_gremlin where id='gremlin' and pw='1' or '1'='1'";
sql에서 where절에서의 and는 or보다 선행되서 처리되므로 where id ='gremlin' and pw='1'부분이 먼저실행되서 false가 되고 그다음 or 뒤의 '1'='1'이 실행되어 항상 참인값이 되므로 클리어 할 수 있을것 같습니다
cf) '위치에 신경을 좀 써야 될 것 같습니다