LoSi

7_LoSi_orge

duduranran 2022. 11. 24. 18:17

일곱 번째 문제 orge

 

 

<?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_orge 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_orge where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge"); 
  highlight_file(__FILE__); 
?>

이번 문제를 보면 지난번 orc 문제와 비슷해 보인다.

 

1. 역시 식별과 인증을 동시에 하고 있고, id값은 guest로 되어 있고, pw에 우리가 원하는 페이로드를 넣어야 한다.

2. 논리연산자 'or'와 'and'가 필터링 돼 있다.

    =>  'or' ==> '||' / 'and' ==>> '&&' 아니면 '%26%26'로 우회 가능

3. addslashe() 함수가 있어서 싱글쿼트, 더블쿼트, 백슬래쉬, NULL 값이 들어오면 그 앞에 슬래쉬가 들어간다.
    => 싱글쿼트는 &27을 입력하면 우회 가능

4. 문제 해결 방법은 GET방식으로 받아온 pw(우리가 URL에 입력하는 값)와  DB에 저장된 pw값이 같다면 해결완료!

 

우리는 현재 패스워드에 관한 정보가 전혀 없는 상태이기 때문에

1) 패스워드의 길이를 구해야 한다.

2) 각 자리의 패스워드가 무엇인지 알아 내야 한다.

아래 전에 풀었던 문제가 있는데, 여기에 들어가면 패스워드 길이 알아내기, 패스워드 확인하기 

파이썬 코드가 있다. 

 

 

LoSi_orc with addslashes() / substr()

네번째 문제 orc

duran22.tistory.com

패스워드 길이를 알아내는 방법만 적어보겠다.

where id='admin' and pw='' 

위와 같은 조건이 있을 때

앞의 id=admin까지 포함돼서 거짓으로 만들어버리고, 그 뒤에 내가 원하는 쿼리문을 쓰면 된다. 

?pw=' or id='admin' and length(pw) < 10#   이렇게 pw자리에 넣어주면

where id='admin' and pw='' or id='admin' and length(pw) < 10#

위와 같이 입력된다. 그 의미는 or 기준으로 좌측은 id는 admin이지만 패스워드가 입력되지 않아 거짓이 되고

or 기준 우측을 보면 id는 admin이고 패스워드의 길이는 10미만이다. 라는 의미이기에 참이 나온다.

업다운 게임처럼 좁혀나가면된다 <9 / <8,  9미만이냐 8미만이냐 등등

이 문제에선 9미만이냐는 질문에선 admin이 출력됐기에 쿼리문이 참인것을 알 수 있고,

8미만이냐는 질문에선 아무것도 나오지 않는 것을 보면 패스워드의 길이는 여덟자리인 것을 알 수 있다.

정 못믿겠으면 =8을 입력해보자.

하지만 여기선 논리연산자 or and 둘다 사용이 불가능하고, 싱글쿼트도 사용이 어렵다.

그래서 입력 값은 ?pw=' || id='admin' %26%@6 length(pw) < 10%23

----------------------------------------------------------------------------------------------------

파이썬으로 패스워드를 구해서 입력했다. 클리어!!

Clear!

 

 

& = %26

# = %23

|| = or

 

두 가지 의문점은

1. 논리 연산자 and는 && 이것으로 우회가 가능한 걸로 아는데 저게 안 된다. 그래서 %26%26 으로 우회했고

2. 분명  addslashes()함수가 있어서 싱글쿼트가 안먹혀야할 텐데 싱글쿼트를 주소표시줄에 넣으면 알아서 %27로 변환된다. 

 

 

 

'LoSi' 카테고리의 다른 글

9_LoSi_vampire  (0) 2022.11.26
8_LoSi_Troll with preg_match()  (0) 2022.11.25
6_LoSi_darkelf  (0) 2022.11.23
5_LoSi_wolfman with whitespace 우회  (0) 2022.11.23
4_LoSi_orc with addslashes() / substr()  (1) 2022.11.23