Wargame/Webhacking.kr
webhacking.kr - old 39
G_OM
2024. 3. 13. 13:16
문제화면이다.
바로 코드확인해 보자.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<?php
$db = dbconnect();
if($_POST['id']){
$_POST['id'] = str_replace("\\","",$_POST['id']);
$_POST['id'] = str_replace("'","''",$_POST['id']);
$_POST['id'] = substr($_POST['id'],0,15);
$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
if($result[0] == 1){
solve(39);
}
}
?>
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
<a href=?view_source=1>view-source</a>
</body>
</html>
전체코드
<?php
$db = dbconnect();
if($_POST['id']){
$_POST['id'] = str_replace("\\","",$_POST['id']);
$_POST['id'] = str_replace("'","''",$_POST['id']);
$_POST['id'] = substr($_POST['id'],0,15);
$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
if($result[0] == 1){
solve(39);
}
}
?>
'$db = dbconnect();'로 데이터베이스에 연결하고 if($_POST ['id'])' 'id'에 대한 파라미터가 전달하는 과정이다.
조건을 보면 id 값을 받을 때 '\\'[백슬래시]를 제거하고 , 작은따옴표(')를 이중 작은따옴표('')로 처리한다.
그리고 'id' 값을 꼭 15자까지만 입력하게끔 해놨다. (15글자 전부 써야 한다는 소리)
$result 코드를 보면 'id='{$_POST ['id]} 에서 작은따옴표(') 즉 닫히는 부분이 없다.
따라서 작은따옴표를 이용해서 문제를 풀 수 있을 거 같다.
소스코드의 substr() 함수를 이용해서 작은따옴표를 넣어 정답을 입력해 보자.
'substr($_POST ['id'],0,15);'를 보면 최대 15자까지만 유지하도록 하기에 띄어쓰기를 끝까지 넣었다가 마지막에 백스페이스를 눌어 작은따옴표를 추가해 보자
여기서 mysql이 문자열을 비교할 때 빈 부분만큼 공백을 추가해 준다.
구글링 해서 찾아본 결과 mysql에서 CHAR는 문자열을 비교할 때 공백(BLANK)을 채워서 비교하는 방법을 사용한다.
그리고 VARCHAR에서는 맨 처음부터 한 문자씩 비교하고 공백도 하나의 문자로 취급하므로 끝의 공백이 다르면 다른 문자로 판단하는 것이다.
그래서 if 문에 15자 에 대한 조건에 공백을 넣어서 문제를 해결할 수 있었다.