Almon Dev

[Lord of SQL Injection] gremlin 풀이 본문

모의해킹/Lord of SQLi

[Lord of SQL Injection] gremlin 풀이

Almon 2025. 1. 6. 16:37

LOS 풀이

 

gremlin

 

 

풀이

1. 코드 분석

GET메서드로 id와 pw를 파라미터로 보내면 쿼리에 포함되는 형식으로 보입니다.

쿼리의 결과 중에 id가 있으면 solve("gremlin") 함수를 실행해서 문제를 성공적으로 풀 수 있습니다.

$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");

 

입력된 파라미터를 필터링하는 부분입니다.

preg_match() 함수와 정규식을 이용해서 특정 패턴을 검색하고 발견될 경우

No Hack문자를 화면에 출력하며 문제풀이에 실패합니다.

if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

 

정규식 해석
/ / : /
사이의 값을 정규식으로 해석합니다.
prob : prob 문자열을 찾습니다.
| : or을 뜻합니다.
\. \( \) : 각각 . ( ) 문자를 뜻합니다.
i : / / 뒤에 붙은 문자는 플래그로 i는 대소문자를 구분하지 않음을 뜻합니다.

/prob|_|\.|\(\)/i
해석하면 prob _ .()를 대소문자를 구분하지 않고 찾는 정규식입니다.

 

문제를 푸는 방법은 prob, _, ., ()를 사용하지 않고 쿼리의 결과가 나오게 하면 됩니다.

 

2. 쿼리 삽입

select id from prob_gremlin where id='' and pw=''

 

문제의 쿼리에서 항상 참이 되게 하려면 or 1=1을 삽입하는 것이 가장 좋습니다.

admin과 같은 항상 있을 것 같은 계정을 id에 삽입하고 pw를 주석처리를 해도 상관없지만

저는 or 1=1을 삽입해 보겠습니다.

 

/gremlin_280c5552de8b681110e9287421b834fd.php?pw='+or+'1'='1

 

pw 파라미터에 ' or '1' = '1을 삽입하여 주석을 사용하지 않고 id를 모른다는 가정하에 문제를 풀었습니다.

 

id 파라미터에 ' or '1' = '1을 삽입할 경우 문제가 해결되지 않는데
이유는 연산자 우선순위 때문입니다.
where id='' or '1'='1' and pw='' 의 경우 and 연산이 or보다 우선순위가 높아서 먼저 연산됩니다.
where id='' or ('1'='1' and pw='')로 해석되므로
pw와 id 중 하나가 빈 문자열인 경우를 찾는 id='' or pw='' 조건문이 되어버립니다.