문제 1번 - gremlin
query : select id from prob_gremlin where id='' and pw=''
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
highlight_file(__FILE__);
?>
sql injection을 하기 위해 먼저 해야하는 것이 몇가지 있다. LOS 문제 1번처럼 코드를 주는 경우에는 무엇이 입력해야하는지와 입력할때 무엇을 필터링하는지를 코드에서 확인해야한다. 코드를 안 주는 경우는 코드에서 확인하지 않고 직접 해보며 찾아야 한다.
먼저 필터링과 관련된 함수를 알아보면 preg_match 함수에 대하여 알아한다.
preg_match 함수란 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색하는 함수이다. 아래와 같이 첫 번째 인수에는 정규식 표현을 작성하고 두 번째 인수에는 검색 대상 문자열을 넣는다. 세 번째 인자는 필터링된 문자를 저장하는 배열 변수이다. (문제에는 세 번째 인자가 없는 것을 알 수 있다.)
preg_match('/대조할 문자/','입력한 문자열',$matches)
preg_match의 첫 번째 인자에 정규식 표현을 작성할때 '//'안에 각 표현들을 적는데 각 표현은 |으로 구별한다. 또 문자들은 문자 표현이라는 것을 명확해하기 위하여 \를 사용하고 문자를 표현한다. 예를 들어 (은 \(로 표현한다.
또 끝나는 /뒤에 옵션을 적을 수 있는데 /i는 필터링할 때 대소문자를 구별하지 않는다는 것이다.
즉 아래 코드에서 보이듯 id라는 변수에서 정규 표현식을 설명하면 prob와 _ , . , ( , ) ,을 필터링하고 i를 통해 대소문자를 구별하지 않는 것을 확인할 수 있다.
<?php
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
?>
또 코드를 확인해보면 result에 참인 값만 들어가면 되면 solve되니 or을 이용하여 참인 값을 입력하면 된다.
<?php
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
highlight_file(__FILE__);
?>
따라서 아이디에 해당하는 값 안에 or 1=1을 넣어 항상 참이라는 조건으로 query문에 있는 where 조건을 우회할 수 있다. 우회할 때는 자신이 원하는 문장까지 사용하고 뒤에를 주석처리 해야하는데 주석처리를 의미하는 것 중 #을 사용할 것이다.
지금 url에 #을 입력하는 것이므로 # 대신 같은 의미를 지니는 %24로 써야한다. (# == %23)
따라서 해당 주소 php 뒤에 ?id=' or 1=1 %23을 입력한다.
solve
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=%27%20or%201=1%20%23
'write-up > LOS write-up' 카테고리의 다른 글
LOS (Lord of SQL injection) 문제 6번 darkelf write-up (0) | 2021.07.06 |
---|---|
LOS (Lord of SQL injection) 문제 5번 wolfman write-up (0) | 2021.07.06 |
LOS (Lord of SQL injection) 문제 4번 orc write-up (0) | 2021.07.06 |
LOS (Lord of SQL injection) 문제 3번 goblin write-up (0) | 2021.07.06 |
LOS (Lord of SQL injection) 문제 2번 cobolt write-up (0) | 2021.07.05 |