https://los.rubiya.kr/gate.php <- 여기서 푸실 수 있습니다!
LOS란..?
이 LOS(Lord Of SQLInjection)은 SQLInjection를 실습할 수 있는 웹 해킹 실습 사이트입니다.
SQL Injection에 관한 건 [해킹/웹 해킹] - SQL Injection 이 글을 읽어주세요~ㅎ
풀이 과정
맨 처음이니 하나하나 해석을 하자면 1~4까지는 딱히 필요가 없고 5~6번째 줄부터 해석하자면...
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
우리가 모르는 "preg_match"이란 것이 눈에 들어오는데요 이게 뭘까요?
preg_match란?
PHP에선 preg_match함수를 사용하여 정규식 표현을 작성합니다.
첫 번째 인수 : 정규식 표현 작성,
두 번째 인수 : 검색 대상 문자열,
세 번째 인수 : 배열 변수 반환. 패턴 매치에서 매칭 된 값을 배열로 저장하는 것입니다.
정규식 표현이란?
[해킹/웹 해킹] - 정규표현식 / 주로 사용하는 정규표현식에서 읽어주세요!
이걸로 인해 사용자가 입력한 id값에서 'prob', '_', '.', '\' 이란 값이 존재할 때 "No Hack ~_~"이란 화면이 나온다.
그리고 위 PHP문을 보면 입력값을 GET방식으로 받는 것을 알 수 있습니다. GET방식으로 받게 되면 피라미터(URL)에 입력값이 그대로 노출되게 됩니다.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
7번째 줄은 굉장히 많이 봤던 SQL 구문입니다. 데이터베이스에서 입력받은 id와 pw에 대한 값을 찾아 $query에 저장하는 쿼리문입니다.
echo "<hr>query : <strong>{$query}</strong><hr><br>";
8번째 줄은 그 쿼리문을 우리에게 보여주는 역할이네요!
$result = @mysqli_fetch_array(mysqli_query($db,$query));
9번째 줄은 입력받은 $query값을 배열로 $result에 저장하는 쿼리문입니다.
if($result['id']) solve("gremlin");
10번째 줄은 $result ['id']에 값이 들어가 있다면 solve("grelin'"; 가 실행되는 것 같습니다.
풀이 과정
다시 한번 글을 보자면 $result ['id']가 참이 되면 풀리는 문제입니다! 값을 넣는 방법은 URL끝에 "? id=값&pw=값"이런 식으로 적어주시면 됩니다.
그렇다면 앞에서 배운 대로 SQL Injection를 시도해 볼까요? 사람마다 매우 다양한 답이 나오고 어떤 방법을 사용하던 Clear만 된다면 맞는 방법일 겁니다. 다양한 방법으로 시도해 보세요!
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
이 쿼리문을 보게 되면 만약 우리가 id=1234 pw= 1234를 입력하게 되면 select id from prob_gremlin where id='1234' and pw='1234'
이런 식으로 입력이 될 것입니다. 그렇다면 ' or 1=1 %23이라고 적어 넣게 되면?
select id from prob_gremlin where id='' or 1=1 #' and pw=''
위와 같이 id가 참이 되어 이 문제는 클리어가 될 것입니다.
%23이 뭔가요?
%23을 적었을 때 출력되는 카레 문은 어떻게 뜨셨나요?
이런 식으로 #으로 뜨셨을 겁니다. 이건 URL encoding이라고 합니다.
URL 인코딩이란?
URL 인코딩(Encoding)
- 문자나 특수문자를 웹 서버와 브라우저에서 보편적으로 허용되는 변화하는 메커니즘입니다.
- URL은 ASCII 문자 집합을 사용하여 인터넷을 통해서만 전송할 수 있습니다.
- URL은 종종 ASCII 세트 외부의 문자를 포함하기에 URL은 유효한 ASCII형식으로 변환되어야 합니다.
- URL 인코딩은 안전하지 않은 ASCII 문자를 "%" 다음에 두 개의 16진수로 대체합니다.
- URL은 공백을 포함할 수 없습니다. URL 인코딩에서는 일반적으로 공백을 (+ 기호) 또는 %20으로 대체합니다.
위와 같이 %23은 #을 나타냅니다. #을 쓰는 이유는 제 SQL Injection 블로그를 보신 분이라면 아시겠지만 뒷부분을 전부 주석 처리하기 위해서입니다.
"--"이게 주석 아닌가요?라고 물어보실 수 있는데 그것도 제 블로그에 이건 MYSQL을 사용하기 때문에 주석이 #인 것입니다. --은 Oracle, MSSQL에서 작동합니다.
이렇게 1단계 gremlin를 클리어하였습니다!!! 수고하셨습니다~
+다른 풀이, 팁
단순하게 id와 pw값 모두 참으로 만들어 버리면 풀립니다.
- id=' or '1'='1&pw=' or '1'='1
- pw=' or 1=1%23
- id=' or id='1' and pw='1' or 1=1%23
위와 같이 여러 가지 풀이가 나올 수 있다!
URL Encoding값은 인터넷 표와 코딩을 통해서 일일이 확인할 수도 있지만 사이트를 통해서 얻을 수 있습니다.
예를 들면 https://meyerweb.com/eric/tools/dencoder/ 이런 사이트를 통해서 얻을 수 있습니다.
참고 :
'해킹 > 웹해킹' 카테고리의 다른 글
[LOS] 3번 goblin write up (0) | 2021.06.06 |
---|---|
[LOS] 2번 cobolt write up (0) | 2021.06.06 |
정규표현식 / 주로 사용하는 정규표현식 (0) | 2021.06.06 |
SQL Injection (0) | 2021.06.03 |
xss-game level3 write up (0) | 2021.06.02 |