챌린지/los.rubiya.kr

Lord of SQLInjection - wolfman

하루히즘 2020. 12. 22. 02:50

다섯번째 문제인 울프맨이다.

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

이번에는 특이하게 화이트스페이스, 즉 공백을 필터링하고 있다. 딱히 따옴표를 필터링하는 부분이 없기 때문에 쿼리를 보면 작은 따옴표를 닫아주고 이전과 같은 union select 기법을 활용하여 'admin'이란 값을 추가해주면 풀 수 있을 것이다. 하지만 union과 select를 구분하는 공백이 필터링되기 때문에 그냥은 사용할 수가 없는데 어떻게 할 수 있을까?

 

모를때는 역시 끙끙대지말고 검색을 하는게 좋다는 것을 최근들어 느끼고 있다. 구글에 간단히 "mysql whitespace bypass"만 검색해도 여러 방법이 나오는데 그중 제일 신뢰도가 높은 Portswigger의 문서를 참고하면 다음과 같이 우회할 수 있는 것을 알 수 있다.

 

SQL Injection: Bypassing Common Filters

SQL Injection: Bypassing Common Filters In some situations, an application that is vulnerable to SQL injection (SQLi) may implement various input filters ...

portswigger.net

즉 공백 대신에 /**/처럼 주석으로 감싸줘도 이는 공백으로 처리되어 쿼리에 적용된다는 것이다. 그래서 union과 select 전후에 공백 대신에 /**/를 넣어주면 간단히 풀리는 것을 볼 수 있다.

 

 

관련해서 sqli 관련 우회 기법들이 많이 적혀있는 블로그 포스트를 발견했다. 앞으로 이 곳을 참고할 일이 많을 것 같다.

 

웹해킹 SQLI 우회기법 정리 - Webhacking SQL Injection Bypass Honey Tips

지금까지 웹해킹 워게임을 풀면서 깨달은(?) 우회기법을 정리하려 합니다. 모두 수기로 기억나는대로 작성하다보니 빠진 부분도 있을 것 같습니다. 기억나는대로 추가해서 수정하겠습니다.  - o

ar9ang3.tistory.com

 

'챌린지 > los.rubiya.kr' 카테고리의 다른 글

Lord of SQLInjection - orge  (0) 2020.12.27
Lord of SQLInjection - darkelf  (0) 2020.12.27
Lord of SQLInjection - orc  (0) 2020.12.19
Lord of SQLInjection - goblin  (0) 2020.12.17
Lord of SQLInjection - cobolt  (0) 2020.12.16