sort 버튼을 통해 정렬을 오름차순, 내림순으로 바꿀 수 있는데 패킷 바디를 보면 asc
혹은 desc
를 보내는 것을 확인할 수 있다.
또, 소스코드를 제공하고 있는데, 코드는 다음과 같다.
// 일부 추출
if(isset($_POST['sort'])){
$sort=$_POST['sort'];
}else{
$sort="asc";
}
mysql_query("update authkey set authkey='".auth_code('lonely guys')."'");
$sort = mysql_real_escape_string($sort);
$result=mysql_query("select * from guys_tbl order by reg_date $sort");
while($row=mysql_fetch_array($result)){
echo "<tr><td>$row[1]</td><td>$row[2]</td></tr>";
}
문제는 order by 아래에서 blind sql injection을 수행할 수 있냐는 것인데 검색 결과 꽤 흥미로운 기법들을 찾을 수 있었다.
우선 sql injection에서 order by를 사용하는 경우는 일반적으로 컬럼의 개수를 확인할 때이다.
select * from TABLE where 1=1 order by 1,2,3 #
위와 같이 입력했을 때 에러가 발생하지 않는다면 열의 개수가 3개 이상이라고 알 수 있는 것이다.
order by는 원래 열의 이름과 함께 사용되는 것으로 일반적인 사용 방법은 다음과 같다.
select no, id from TABLE where 1=1 order by no asc, id desc;
+----+-----+
| no | id |
+----+-----+
| 1 | 3 |
| 2 | 123 |
| 3 | 8 |
+----+-----+
그런데 위에서 order by 1,2,3
과 같이 사용하는 것은 1,2,3이 각각 첫번째 열, 두번째 열, 세번째 열을 자동으로 지칭하기 때문이다.