728x90
<?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__);
?>
id, pw에 prob, _, ., ()가 필터링된다.
쿼리 실행 결과 id가 존재하면 풀린다.
답: ?id=' or 1 or '
위의 값을 url 끝에 붙이면 된다.
쿼리는 id='' or 1 or '' and pw='' 형태가 된다.
1은 참이기에 위의 쿼리는 모든 행이 참이 된다.
따라서 DB에 데이터가 존재한다면 무조건 행 하나는 조회될 수밖에 없다.
참고로 mysqli_query는 쿼리를 실행하여 만족하는 행 전체를 반환한다.
mysqli_fetch_array는 mysqli_query 결과로 나온 행 전체 중 행 하나를 반환한다.
형태는 mysqli_fetch_row의 배열과 mysqli_fetch_assoc의 배열을 합친 형태이다.
728x90