쿼리문!
query : select 1234 fromprob_giant where 1
코드를 분석해보자.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(strlen($_GET[shit])>1) exit("No Hack ~_~");
//문자열의 길이를 구하는 함수 strlen()을 사용하고 있다.
$_GET[shit]에 입력되는 문자열의 길이가 1을 넘으면 안된다는 이야기인 것 같다.
<strlen()>
: 문자열의 길이를 구하는 함수
사용 형식
: strlen(string)
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");
//역시나 필터링되고 있는 문자열들이 꽤 있다.
$_GET[shit] -> \n, \r, \t
$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__);
?>
이제 문제를 어떻게 풀어야 할지 생각해보자.
쿼리문을 다시 봤는데 조금 이상하다...
fromprob
이렇게 띄어쓰기가 되지 않고 붙어있다.
이거를 띄어쓰기해 줘야 할 것 같은 느낌인데...
아까 preg_match를 기억해내보자.
분명 공백을 필터링해주고 있었다.
공백을 우회해주면서도, strlen의 조건을 만족시켜줘야 한다.
공백 우회 문자에는 여러 가지가 있다.
-> 주석 : /**/
line feed : %0a, %0b, %0c
tab : %09
이것저것 해보다가
shit에 %0c를 입력해주니 바로 문제가 해결되었따!
'웹 > LOS' 카테고리의 다른 글
LOS # assassin (0) | 2021.03.31 |
---|---|
LOS # bugbear (0) | 2021.03.28 |
LOS # darknight (0) | 2021.03.16 |
LOS # golem (0) | 2021.03.14 |
LOS # skeleton (0) | 2021.03.13 |