simple_sqli_chatgpt

2024. 10. 17. 15:52·DreamHack/WEB

 

 

 

 

 

 

 

 

#!/usr/bin/python3
from flask import Flask, request, render_template, g
import sqlite3
import os
import binascii

app = Flask(__name__)
app.secret_key = os.urandom(32)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

DATABASE = "database.db"
if os.path.exists(DATABASE) == False:
    db = sqlite3.connect(DATABASE)
    db.execute('create table users(userid char(100), userpassword char(100), userlevel integer);')
    db.execute(f'insert into users(userid, userpassword, userlevel) values ("guest", "guest", 0), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}", 0);')
    db.commit()
    db.close()

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    db.row_factory = sqlite3.Row
    return db

def query_db(query, one=True):
    cur = get_db().execute(query)
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        userlevel = request.form.get('userlevel')
        res = query_db(f"select * from users where userlevel='{userlevel}'")
        if res:
            userid = res[0]
            userlevel = res[2]
            print(userid, userlevel)
            if userid == 'admin' and userlevel == 0:
                return f'hello {userid} flag is {FLAG}'
            return f'<script>alert("hello {userid}");history.go(-1);</script>'
        return '<script>alert("wrong");history.go(-1);</script>'

app.run(host='0.0.0.0', port=8000)

 

 

전체 코드이다.

 

/login에서 문제를 푸는 거 같다.

 

 

 

 

 

 

 

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        userlevel = request.form.get('userlevel')
        res = query_db(f"select * from users where userlevel='{userlevel}'")
        if res:
            userid = res[0]
            userlevel = res[2]
            print(userid, userlevel)
            if userid == 'admin' and userlevel == 0:
                return f'hello {userid} flag is {FLAG}'
            return f'<script>alert("hello {userid}");history.go(-1);</script>'
        return '<script>alert("wrong");history.go(-1);</script>'

 

 

query_db로 로그인을 시도하는데 if를 보면 userid 가 'admin'이고 userlevel 이 0 이면 admin이라고 한다.

 

admin 하고 다른 유저를 가르는건 'userid' 인듯하다.

 

시도해 보자.

 

 

 

 

 

 

 

 

 

일단  sql injection 없이 0만 대입해 보자.

 

 

 

 

guest 가 출력된다.

 

그럼 sql injection 해보자.

 

 

 

 

 

 

        res = query_db(f"select * from users where userlevel='{userlevel}'")

 

 

일단 login에서 userlevel를 삽입하고 sql 명령어를 호출하는데 '{userlevel}'이 부분이 키워드이다.

 

admin에 대한 조건은 userid 가 'admin'이고 userlevel 은 0 인 것

 

userid 만 추가해 줘도 된다.

 

그러면 어떻게 추가해야 하나

 

 

res = query_db(f"select * from users where userlevel='0' AND userid='admin' --")

 

 

이런 식으로 추가해 준다면 admin에 대한 조건이 충족되면서...

 

 

 

 

 

 

 

 

 

 

flag를 준다.

'DreamHack > WEB' 카테고리의 다른 글

command-injection-chatgpt  (0) 2024.10.23
error based sql injection  (0) 2024.10.18
php-1  (1) 2024.10.16
XSS Filtering Bypass  (0) 2024.10.16
proxy-1  (0) 2024.10.16
'DreamHack/WEB' 카테고리의 다른 글
  • command-injection-chatgpt
  • error based sql injection
  • php-1
  • XSS Filtering Bypass
G_OM
G_OM
최대한 설명 열심히 하려고 합니다. 궁금한 거 있으면 언제든지 물어보셔도 좋습니다.
  • G_OM
    끄적끄적
    G_OM
  • 전체
    오늘
    어제
    • 분류 전체보기 (157)
      • 모의해킹 (18)
      • CTF (22)
      • Wargame (69)
        • Linux_bandit (33)
        • Webhacking.kr (36)
      • DreamHack (52)
        • WEB (14)
        • Reverising (9)
        • System (0)
      • Mobile_security (13)
        • Drozer_Android (4)
        • Frida_Android (1)
        • IOS (1)
        • tool (1)
      • 정보보안기사 (2)
      • IT? (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

    • DreamHack 에 대한 문제들...
  • 인기 글

  • 태그

    bandit30
    lfi
    bandit17
    리눅스 워게임
    php wrapper
    bandit18
    drozer
    정보보안기사
    sql injection
    wargame
    Dreamhack
    CTF
    Linux wargame
    Frida
    리눅스
    webhacking.kr
    난독화
    워게임
    overthewire
    insecurebankv2
    Android
    Linux
    url encode
    OSINT
    php
    cookies
    모의해킹
    bandit
    bandit20
    webhacking
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
G_OM
simple_sqli_chatgpt
상단으로

티스토리툴바