SQL Injection 문제 풀어보기

세바님·2024년 4월 24일
0
post-thumbnail

서론

이번 시간에는 SQL Injection 문제를 풀어보았습니다.

Dreamhack.io simple_sqli

먼저 로그인 페이지가 보인다.


백엔드 코드를 보자.

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        userid = request.form.get('userid')
        userpassword = request.form.get('userpassword')
        res = query_db(f'select * from users where userid="{userid}" and userpassword="{userpassword}"')
        if res:
            userid = res[0]
            if userid == 'admin':
                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 부분을 보니 userid 가 먼저 들어가며, 특별한 처리 없이 쿼리문이 실행되는것을 볼 수 있다.
userid 만 admin으로 인식하도록 하고 나머지는 주석처리 하면 될 것 같다.

로그인을 해 보면?

해결. 굿

webhacking.kr old-03


뜬금없이 모노그램이 나왔다.
풀어주고 solved 버튼을 눌러주었다.
올바르게 해결했다면 이런 창이 뜬다.

일단 아무 이름이나 적고 제출해보았다.

그러니 이렇게 로그가 남는다.
흠... 일단 모르겠어서 id에 sql injection을 해보았다.

이것도 아닌가보다.
그런데 url을 잘 살펴보니 answer 이라는 쿼리 파라미터가 있었다. 여기에 sql injection을 해보겠다.

아?? 이번엔 burp suite를 써서 다시 해 보자.


으하하 해결

webhacking.kr old-18


대놓고 sql injection을 하라고 한다.
소스코드를 확인해보자.

대놓고 sql injection 하기 힘들게 정규식을 짜놨다. 그러나 admin의 no가 2인거도 알려준 모습이다. 이걸 활용해 and 조건을 뚫어보자.
만약 id='guest' and no=$_GET[no] 가 false가 되려면 두 식 모두가 false여야 할 것이다. 이때 첫번째 식은 고칠 수 없으니 or을 이용해 두번째 식을 true로 만들면서 여기에 no=2 를 넣어보자.
그러나 위의 정규식 때문에 일반적인 쿼리문으로 했다간 실행이 제대로 되지 않는다. 그러니 url 인코딩을 이용해 값을 넘겨보자.


캇캇캇

webhacking.kr old-27


이번에도 소스코드를 보자.

먼저 등호가 필터링이 되어있기 때문에 like를 사용해야 할 것이다.
또, 바로 2를 넣으면 첫번째에 id='guest' 때문에 소용이 없다. 이것도 old-18 문제처럼 or를 활용해주겠다. 그런데 괄호가 이를 방해한다. 그러므로 값 옆에 괄호를 추가해 이를 무시해주겠다.

이런 조건을 만족시키는 쿼리문은 다음과 같다.
0) or no like 2 --
여기서 공백을 url 인코딩한 %09로 변경만하면?
0)%09or%09no%09like%092--%09 이다. url에 넣어서 공격해보자.

통과. 굿

profile
꼴리는대로 사는게 꿈입니다

0개의 댓글