728x90
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(strlen($_GET[shit])>1) exit("No Hack ~_~"); // shit의 값의 길이가 1보다 크면 안됨.즉 1이어야함.
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe"); // 스페이스, 개행(%0a), Carriage Return(%0d), Tab(%09) 안됨
$query = "select 1234 from{$_GET[shit]}prob_giant where 1";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result[1234]) solve("giant");
highlight_file(__FILE__);
?>
from과 prob_giant 사이에 띄울 수 있는 길이가 1인 구분자가 필요하다.
sql의 공백(띄어쓰기) 우회는 다음과 같은 방법이 있다.
1) 개행(\n): 열은 유지한 채 커서를 한 칸 밑으로 이동. %0a
2) Carriage Return(\r): 커서를 왼쪽 끝으로 이동. %0d
3) Tab(\t): 커서를 오른쪽으로 Tab 만큼 이동. 키보드의 Tab키. %09
4) 주석(/**/): SQL에서 여러 줄을 주석처리.
5) 괄호(()): 문자(열) 양 옆에 괄호를 삽입하여 띄어쓰기 대신 문자(열)를 구분.
6) +: MySQL에서 띄어쓰기 역할. ex) select+1,+2; = select 1,2; 와 동일한 결과.
7) vertical tab(\v): 아래로 6줄 이동. %0b
8) form feed(\f): 프린트 출력 시 다음 페이지의 시작 부분으로 이동. %0c
해당 문제는 %0b 또는 %0c를 사용하면 풀린다.
답: ?shit=%0b
728x90
'Lord of SQL Injection' 카테고리의 다른 글
succubus (0) | 2022.12.23 |
---|---|
assassin (0) | 2022.12.23 |
bugbear (0) | 2022.12.22 |
darkknight (0) | 2022.12.22 |
golem (0) | 2022.12.22 |