분류 전체보기
- 블로그 다시 시작 및 재정비 2023.01.30
- [WEB-EASY]DaVinciCTF Members 2021.03.15
- [BUUCTF] [强网杯 2019]随便注1 Write-up 2021.01.10
- [DreamHack#3] broken-png 2020.11.16
- d 2020.10.01
- basic_exploitation_000 2020.09.19
- Proxy-1 2020.09.19
- command-injection-1 2020.09.13
블로그 다시 시작 및 재정비
[WEB-EASY]DaVinciCTF Members
[BUUCTF] [强网杯 2019]随便注1 Write-up
문제 유형 : SQL Injection
문제를 열어보면 위 처럼 입력할 수 있는 칸 한개와 제출 버튼이 있다. 페이지에 보이는 중국어는 풀이와 전혀 관계 없으니 신경쓰지 말자. 기본적으로 입력되어 있는 1이라는 숫자를 입력하고 제출 버튼을 누르면 아래와 같은 결과가 나온다.
느낌상 DB에 특정 쿼리를 날려서 결과 값을 뿌려주는 듯 싶다. 몇가지 입력을 추가로 시도해본다.
2를 입력했을때 위와 같은 내용이 나왔고 그 외에 -1,0,3,99 등 다양한 숫자를 시도했을땐 아무것도 나오지 않고 기본 화면으로 돌아온다. 또한 '1,2'처럼 한번에 여러가지를 요청했을때도 그냥 기본 화면으로 돌아온다.
이제 특수문자와 주석 입력을 시도해본다.
싱글쿼터(')를 입력했을때 위와 같은 오류 메세지가 나온다. 그외에 주석(//,--,# 등)은 초기화면으로 돌아오고 끝이었고 다른 특문도 마찬가지로 초기화면으로 돌아오고 끝
위의 오류를 통해 정확한 쿼리문을 예측하긴 어렵지만 아래와 같은 형식이라는걸 유추해볼 수 있다
SELECT ??,?? FROM ???? WHERE ??='입력값'
유추해본 내용을 바탕으로 공격을 시도해본다.
위의 결과는 1';show databases; 라는 값을 넣었을때 나온 결과이며 이를 통해 싱글쿼터(')와 세미콜론(;)을 통해 사용자가 원하는 내용을 추출해낼 수 있다는걸 알 수 있으므로 추가적인 공격을 통해 풀이를 위한 정보를 획득해본다.
FLAG 획득을 위한 정보는 모두 찾았으나 위처럼 일부 명령어에 대한 필터링이 걸려있다. 일단 현재까지 획득한 정보를 바탕으로 서버로 전달되는 쿼리문을 유추해보자면 다음과 같다.
SELECT id,data FROM words WHERE id='입력값';
이제 필터링을 우회하여 FLAG값을 빼오면 되는데 여기서 고민 좀 하다가 그냥 FLAG값이 있는 1919810931114514 테이블을 words로 바꿔버리고 id 컬럼을 추가하고 flag 컬럼을 data로 변경하면 쉽게 풀리지 않을까 생각해서 이것저것 시도해봤다.
그런데 문제가 풀리지 않아 풀이를 검색해봤는데 약간의 차이로 인해 틀린듯 싶다 아래에서 위에꺼가 직접 시도한 입력값, 아래꺼가 풀이에서 가져온 입력값
1'; RENAME TABLE words to words1; RENAME TABLE `1919810931114514` to words;
ALTER TABLE words ADD COLUMN id int(10) NOT NULL auto_increment;
ALTER TABLE words CHNAGE COLUMN flag data varchar(100);
1'; rename table words to word1; rename table `1919810931114514` to words;
alter table words add id int unsigned not Null auto_increment primary key ;
alter table words change flag data varchar(100);
거의 비슷했는데 아깝.. 정확히 어떤 부분에서 잘못됐는지 나중에 확인해봐야할듯 싶다.
[DreamHack#3] broken-png
d
basic_exploitation_000
Proxy-1
본 포스팅은 문제 풀이가 아닌 힌트 및 접근 방법에 대해서만 간단하게 설명합니다.
#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for
import socket
app = Flask(__name__)
try:
FLAG = open('./flag.txt', 'r').read()
except:
FLAG = '[**FLAG**]'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/socket', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('socket.html')
elif request.method == 'POST':
host = request.form.get('host')
port = request.form.get('port', type=int)
data = request.form.get('data')
retData = ""
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(3)
s.connect((host, port))
s.sendall(data.encode())
while True:
tmpData = s.recv(1024)
retData += tmpData.decode()
if not tmpData: break
except Exception as e:
return render_template('socket_result.html', data=e)
return render_template('socket_result.html', data=retData)
@app.route('/admin', methods=['POST'])
def admin():
if request.remote_addr != '127.0.0.1':
return 'Only localhost'
if request.headers.get('User-Agent') != 'Admin Browser':
return 'Only Admin Browser'
if request.headers.get('DreamhackUser') != 'admin':
return 'Only Admin'
if request.cookies.get('admin') != 'true':
return 'Admin Cookie'
if request.form.get('userid') != 'admin':
return 'Admin id'
return FLAG
app.run(host='0.0.0.0', port=8000)
admin 함수 조건들만 충족하면 문제를 풀 수 있다.
/socket 페이지를 잘 이용하면 된다.
'Web Hacking > Dreamhack.io' 카테고리의 다른 글
command-injection-1 (0) | 2020.09.13 |
---|---|
image-storage (0) | 2020.09.13 |
command-injection-1
본 포스팅은 문제 풀이가 아닌 힌트 및 접근 방법에 대해서만 간단하게 설명합니다.
사용자 입력 값 검증과 사용자 입력 값을 어떻게 처리하는지 잘 확인해보면 풀 수 있다.
'Web Hacking > Dreamhack.io' 카테고리의 다른 글
Proxy-1 (0) | 2020.09.19 |
---|---|
image-storage (0) | 2020.09.13 |