<?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를 공부하지 않았다가 이번에 xampp를 사용해서 간단한 로그인 기능과 게시판 기능을 만들어보면서 해석이 되기 시작했다.
input에 값을 넣어야 하는 문제이다.
그리고 php를 보면 solve 기준이 result가 1을 가지면 되는 문제이다.
그럼 어떻게 1을 가지나 했더니 sql에서 select 1 from ... 이렇게 나와있었다.
sql의 select 다음에 컬럼명이 아닌 숫자가 들어간 건 처음 봐서 직접 써보니
그냥 조건에 맞는 모든 행들이 1이란 값을 가지게 하는 sql문이었다.
고로 이 문제는 저 sql문을 건드려서 어떤 값이든 조회하게 하면 되는 문제이다.
그럼 이제 조건을 보자.
Post로 받은 값의 '\\'을 없애고 작은 따옴표(')를 두 개로 만들며 마지막으로 시작 기준 15글자만 받도록 한다.
이제 보니 sql문도 잘못되어 있었다.
Select 1 from member where length(id)<14 and id='{$_POST['id']}
마지막에 ' 가 없다.
이러면 잘못된 sql문이므로 값이 아예 나오지 않는다.
그리고 '는 ''으로 바뀌어 그냥 단순히 input에 '를 쓰는 것만으로는 해결되지 않는다.
하나 아까 조건에서 15글자까지만 받는다 했다.
그럼 띄어쓰기를 14 글자까지 하고 마지막에 '를 붙이면 결국 sql에는 마지막에 ' 하나만 들어갈 것이다.
참고로 sql에서는 띄어쓰기 이후의 값이 없으면 띄어쓰기를 제거한다.
ex)
Insert into user(name) values('rio'); # 'rio'
Insert into user(name) values('rio '); # 'rio'
Insert into user(name) values('rio rio'); # 'rio rio'
Insert into user(name) values('rio rio '); # 'rio rio'
고로 아무 값이나 넣고 띄어쓰기를 14자까지만 한 후 '를 넣으면 결국 아무값' 이 되기 때문에 값이 조회가 된다.
그럼 여기서 의문점이 생길 수가 있다. (필자는 생겼다)
결국 그 값은 무엇인가?
그래서 내가 이 문제는 잘못된 문제라고 생각한 것이다.
그 db에 들어간 값이 무엇인지는 알 수가 없다. 결국엔
그 유명한 ' or 1 = 1 도 못한다.
그렇기에 대충 있을법한 admin이나 guest, 12345 같은 것들을 해야 한다.
어쨌든 답은 값을 넣고 14자까지 공백, 이후 '이다.
필자는
admin '
를 썼다.
'Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old 20 해설 (0) | 2025.01.04 |
---|---|
[Webhacking.kr] old-38 풀이 (1) | 2024.12.15 |
[Webhacking.kr] old-54 풀이 (1) | 2024.12.14 |
[Webhacking.kr] old-24 풀이 (0) | 2024.12.14 |
[Webhacking.kr] old-01 풀이 (0) | 2024.12.14 |