<?php
include "./config.php"; # config.php
login_chk(); # 로그인 체크
$db = dbconnect(); # DB 연결확인
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"); # 조회한 쿼리의 결과에 ID가 있다면,
highlight_file(__FILE__); # 파일을 하이라이트 적용 상태로 출력
?>
config.php
(config = 구성)
⚡ 웹의 정보를 설정하는 부분과, CI의 라이브러리, 헬퍼, 드라이버 또는 CI의 기능 들의 사용여부를 설정 ⚡
config.php를 불러와 적용.
config.php를 불러왔다고 config.php가 되는 게 아님.
login_check()
로그인 된 상태인지 확인
dbconnect()
데이터베이스에 연결
⭐ if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
GET방식으로 id를 받으며, id에 prob, _, ., () 가 들어 있고, /i 대소문자가 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.
⭐ if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
GET방식으로 pw를 받으며, pw에 prob, _, ., () 가 들어있고, /i 대소문자를 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.
🔹 preg_match()
preg_match('/대조 할 문자/','입력한 문자', $matches);
// $matches 뒤에 PREG_OFFSET_CAPTURE를 사용할 수 있다.
⭐ $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
id와 pw 둘 중 하나를 참으로 만들어주면 해당 쿼리문을 우회 가능
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$query를 불러옴 (6번 참고)
$result = @mysqli_fetch_array(mysqli_query($db,$query));
순번을 키로 하는 일반 배열과 컬럼명을 키로 하는 연관배열 둘 모두 값으로 갖는 배열을 리턴
[일반배열 + 연관배열 = 결과값 리턴]
if($result['id']) solve("gremlin");
$result 값이 id 라면, 성공적으로 출력
highlight_file(__FILE__);
정의된 색상을 사용하여 포함된 코드의 구문 강조 버전을 반환
id=1&pw='1'or'1'='1'
위에 있는 쿼리를 보면 pw= 뒤에 처음과 마지막 작은 따옴표가 두 개가 생긴 것을 알 수 있다.
그 이유는 $query 변수에서 id와 pw에 작은 따옴표가 붙어 있기 때문이다.
id=1&pw=1'or'1'='1
문제를 풀었다!
[참고한 블로그]