아래는 처음 들어갔을 때 화면이고 경고문이 있다.
들어가서 회원가입 하고 로그인 할 때는 딱히 트릭은 없다.
아래는 서버 코드이다.
<?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 문법들은 필터링 되고 있지 않고 있다.
아마도 첫 번째 문제라서 낮은 난이도인 것 같다.
그럼 난 위 쿼리문에 아주 기본적인 sql 인젝션인 ' or 1=1을 아래오 같이 삽입하여 무조건 참이 되게 하여 결과값이 있게 한 후 주석으로 그 뒤는 다 무시해주겠다.
.을 공백으로 잘못보고 아래처럼 공백을 %09로 우회해주었다.
아무튼 아래 쿼리를 id에 get 메소드 페이로드로 보내게 되면
result에 id 결과 값이 성공적으로 담기면서 GREMLIN 단계를 Clear할 수 있다.