[Solved in under 30 minutes]
너무 잠온다.
그런데 한 문제만 풀고 자자라는 생각이 들어 일단 켰다.
가보자

바로 코드 보자

<?php
include "../../config.php";
if($_GET['view_source']) view_source();
$db = dbconnect();
if(!$_GET['id']) $_GET['id']="guest";
echo "<html><head><title>Challenge 61</title></head><body>";
echo "<a href=./?view_source=1>view-source</a><hr>";
$_GET['id'] = addslashes($_GET['id']);
if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
if(strlen($_GET['id'])>15) exit("Access Denied");
$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
echo "<b>{$result['id']}</b><br>";
if($result['id'] == "admin") solve(61);
echo "</body></html>";
?>
대충 코드 해석하자면 GET으로 id를 받는데 15자를 넘기면 안되고 select, from etc.. 필터링이 걸려있다.
가장 중요하게 봐야 할 부분은
"select {$_GET['id']} from chall61 order by id desc limit 1"
기존 SQL Injection 문제와는 다르게 select 와 from 사이에 있다.
만약 필터링이 없다면 select id from chall61 where id ="admin" # 이렇게도 먹히겠다만 필터링이 있으니 아마 다른 방법으로 푸는 문제 같다.
그리고 내림차순이며 값 하나만 뽑아낸다.
기억해두고 일단 id를 입력해보니

test라고 나온다.
id 컬럼안에 분명 "test", "guest", "admin"는 존재한다고 생각한다.
내림차순이니 a ~ z 까지 했을때 z쪽에 가까운 녀석이 제일 위에 올라오니 사실상 순서가 위와 같을 것이다.
오름차순이었으면 당연 admin이 뽑혔겠지만 그럼 문제가 아니다
정리하자면 select [여기부분] from chall61 ~ 이니 컬럼명과 관련있게 문제를 풀어나가야 한다.
SQL 컬럼명 관련해서 검색하니 AS가 나왔다.
AS는 쉽게 말해서 Linux로 따졌을때 alias 명령어와 똑같다.
그냥 별명 지어주겠다 이런거다.
그리고 AS가 들어가는 문법이 select [hello as hi] from ~
딱 들어맞으니 바로 해보자

?id=guest as id
라고 하니 나오지 않는다 당연한 사실이다.
이 말은 guest가 컬럼명으로 인식되어 chall61테이블에 guest라는 컬럼명이 없으니 당연히 false로 되어 아무것도 출력되지 않는다.
여기서 방법은 guest를 문자열로 인식하게 만들어 select 'guest' 즉, 리터럴 문자열로 값이 있든 없든 무조건 'guest'를 뽑도록 만드는것이다.
해보자

?id='guest' as id
또 아무것도 뜨지 않는다.
코드에는 안나와있지만 무언가에 의해 막혀있나보다 우회해보자
SQL에서는 hex로도 표현이 가능하기 때문에 guest = 0x6775657374이다.
삽입해보자

?id=0x6775657374 as id
또 안된다.
하지만 이번에는 다르다.
15자리 넘겼다고 가세요라 한다.
MySQL에서는 AS가 생략이 가능하니 생략하고 해보자

?id=0x6775657374 id
잘 먹은거 같다 이제 저 헥사값을 그~대로 admin으로 바꿔주면?
면?

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
?id=0x61646d696e id
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
잘된다.
이전에 대기업 공채 테스트 할때 SQL 실기 시험을 본다고 하여 그 때 공부좀 해뒀는데 그 이후에 벌써 까먹고 또 검색하러 다녔다.
인간은 망각의 동물임에 틀림없다.
뭐든 꾸준히 하면 안 잊겠지 허허
웹해킹 꾸준히 하자 밥 값 벌어 먹고 살려면 ㅜㅠㅜㅠㅜㅠㅜㅠㅜ
Webhacking.kr Old-61 Write-up
이상 보고 끝!