Iriton's log

[los.rubiya] orc write-up 본문

WebHacking/WarGame

[los.rubiya] orc write-up

Iriton 2023. 10. 10. 10:17

query:

select id from prob_orc where id=’admin’ and pw=’’

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

이 문제는 패스워드를 맞춰야 하는 문제이다.

코드를 직접 짜서 비밀번호를 유추하는 문제인데 혼자 하기 어려워서 구글링을 해 보았다.

참고: https://man-25-1.tistory.com/81

풀이는 두 부분으로 나눠서 해결할 수 있다.

length()를 이용해 비밀번호 길이를 구하기substr()를 이용해 비밀번호를 이루는 문자 구하기

첫 번째 풀이 부분: length() 함수로 비밀번호 길이 구하기

쿼리문을 살펴 보면 아이디가 존재할 시에 Hello admin이 출력된다.

쿼리문과 or을 활용해 비밀번호 길이를 유추할 수 있다.

쿼리문에 ?pw=' or id='admin' and length(pw)<10 %23 을 입력하여 앞의 판별은 무시하고

비밀번호 길이가 10 미만일 때 성공 문구를 출력할 것이다.

 

위와 같이 성공 문구가 출력한 것으로 보아 비밀번호 길이는 10 미만이다.

파이썬 코드를 짜서 반복 구문을 통해 비밀번호 길이를 구할 수 있지만 코딩까진 아직 잘 모르겠어서

쿼리문에 대입하는 수의 범위를 줄여가며 비밀번호 길이가 8이란 걸 알 수 있었다.

( (pw) < 8 이 대입될 때부터 Hello admin이 뜨지 않았다.)

두 번째 풀이 부분: strsub() 함수로 비밀번호 구하기

  • substr()

substr(string, start_index, length)

string : 추출의 대상이 되는 문자열

start_index : 추출을 시작하는 위치

length : 인덱스로 부터 추출할 문자의 개수 ( 값이 없으면 문자열의 끝까지 추출)

파이썬 모듈로 아스키 코드 48부터 127까지 하나씩 대입하여 인덱스까지 추출하는 코드를 자동화할 수 있다.

그 결과 비밀번호는 095a9852가 나온다.

 

파이썬 모듈로 코드 자동화 공부가 필요

'WebHacking > WarGame' 카테고리의 다른 글

[Dreamhack] Lv.2 DOM XSS  (0) 2023.11.07
[Dreamhack] simple_sqli write-up  (0) 2023.10.10
[los.rubiya] goblin write-up  (0) 2023.10.10
[los.rubiya] cobolt write-up  (0) 2023.10.10
[los.rubiya] gremlin write-up  (0) 2023.10.04
Comments