Error-Based SQL INJECTION

코딩 파인애플·2026년 7월 8일

SQL INJECTION

목록 보기
5/5
post-thumbnail

안녕하십니까 코딩 파인애플입니다
이번 시간에는 ERROR_BASED SQL INJECTION에 관해 알아보겠습니다.

⚠️ERROR BASED SQL INJECTION이란?

ERROR BASED SQL INJECTION이란

공격자가 데이터베이스에 에러를 일으키도록 잘못된 SQL 명령어를 입력한 뒤, 화면에 출력되는 에러 메시지를 분석해서 DB의 구조나 데이터를 탈취하는 기법을 말합니다

BLIND SQL INJECTION하고 원리는 조금 비슷한데, 에러가 나는 지 웹페이지에 반응을 보고 공격이 가능한 지 판별한 수 있습니다.

또한 ERROR BASED SQL INJECTION에서 에러를 유발시키기 위해 다음과 같은 함수를 사용합니다.

1️⃣ EXTRACTVALUE(X,Y) : 두 개의 인자를 받아 두 번째 인자인 Y에 올바른 경로가 아닌 특수문자와 함께 원하는 SQL 쿼리를 집어넣는 방식입니다

SELECT * FROM products WHERE id = 1 AND EXTRACTVALUE(1, CONCAT(0x0a, VERSION()));

을 넣어 공격하게 되면
ERROR 1105 (HY000): XPATH syntax error: 'version'
이라는 메시지가 나오면서 공격을 할 수 있습니다

또한 여기에 VERSION() 이 아닌 다른 함수를 넣어서 공격이 가능합니다

그 예시로 다음과 같은 sqli에 취약한 코드가 있다 가정해봅시다.

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')

위 코드에서는 except 구문을 보면 에러가 발생하였을 때 그 원인을 숨기지 않고 return str(e) 을 통해서 에러 메시지를 출력하게 하는 것을 알 수 있습니다.

따라서 저희는 다음과 같은 구문을 넣어 Error based sqli 공격을 가능하게끔 만들 수 있습니다.

' and extractvalue(1,concat(0x3a, (select upw from user where uid='admin'))); #

이렇게 다음과 같이 작은 따음표를 이용하여 감싸주고 extractvalue 함수를 통해서 sqli 공격을 성공한 것을 볼 수 있습니다.
(물론 문장 끝이 나오다 말았지만.)

2️⃣UPDATEXML(원본XML, XML경로, 변경할_내용) : XML 데이터를 수정하는 함수입니다.
원본 XML 문서를 가져와서, 경로에 있는 값을 새로운 내용으로 바꾸고 싶을 때 사용합니다

UPDATEXML('<book><title>제목1</title></book>', '/book/title', '<title>제목2</title>');

다음과 같이 /book/title 의 경로의 내용을 제목2로 변경시킬 수 있지만 만일 경로가 잘못되면 에러를 출력하므로

공격자는 경로에 자신이 탈취하고픈 데이터를 입력해 공격을 합니다

방금과 같은 sqli에 취약한 사이트에 공격 구문을 짜보자면 다음과 같이 나올 수 있겠습니다.

' AND UPDATEXML(1, CONCAT(0x3a, (select upw from user where uid='admin')), 1) #

이렇게 데이터를 입력하여 공격을 가능하게 만들 수 있습니다.

한번 배웠던 내용을 실습해봅시다
https://dreamhack.io/wargame/challenges/412

이상으로 글을 마치겠습니다 감사합니다

profile
안녕하떼요 취미로 콤푸타 배우는 고든학교 6학년 유치원생이빈다.

0개의 댓글