union을 사용한 sql-injection 문제이다.
사이트에 접속을 하면 uid와 pwd를 입력하는 칸이 보이고 입력된 문자를 통해 query가 만들어지는 것을 확인할 수 있다.
소스코드
input을 받고 users의 모든 정보를 조회하는 sql query문을 만들어 DB에 전송하고 받은 응답값을 출력하는 코드이다.
해당 서버의 DB의 구조 코드이다. users테이블의 컬럼 정보와 flag가 있을 테이블의 컬럼 정보를 정의하며
일부 유저를 정의하였다.
풀이
cur.execute(f"SELECT * FROM users WHERE uid='{uid}' and upw='{upw}';")
해당 코드는 입력받은 값을 바로 qurey문에 넣어 적용하는 코드이다
이렇게 할 경우 변조된 값이 들어오더라도 인증 절차가 없기에 sql-injection 공격이 가능해진다.
해당 코드의 값을 감싸는 '(작은따옴표)를 입력값에 넣고 뒤에 임의의 변조된 값을 넣게 된다면 DB에서는 변조된 값이
qurey문의 일부인 줄 알고 해당 문구까지 사용하게 된다
예를 들어 uid의 input값으로 admin'or 1=1#이라는 값을 넣는다 해보자.
해당 qurey문은 이렇게 바뀔 것이다.
SELECT * FROM users WHERE uid='admin'or1=1 #'and upw='';
그럼 뒤에 있는 upw의 부분이 주석처리가 되어 admin으로 로그인이 성공할 것이다.
이제 해당 구문이 sql-injection에 취약한 것을 확인했으니 union을 사용하여 원하는 값을 가져와보자
union
union은 쉽게 말해 테이블을 합치는 것이라 할 수 있다.
하지만 합칠 테이블의 컬럼수가 같이 않다면 에러가 뜨는데 이것을 주의해야 한다.
union을 사용하기 전 먼저 해당 테이블의 컬럼수가 몇 개 인지를 확인해야 한다.
위의 코드에서 4개의 컬럼을 가진 것을 확인했지만 소스코드를 확인할 수 없는 경우라면
union select 1,2,3... 이런 식으로 하나 하나 넣어보며 에러가 나지 않는 경우를 찾아야 한다.
컬럼의 개수를 알았다면 그다음 알아야 할 것은 flag가 있을법한 테이블을 찾아내는 것이다.
테이블의 정보를 확인하기 위해서는 information_schema를 확인하면 알 수 있다.
information_schema는 간단하게 데이터베이스의 구조와 속성에 관한 정보를 저장하는 테이블이라 할 수 있다.
information_schema에서 table이름을 가져오기 위해서는 아래 qurey문을 사용하면 된다.
apple'union select table_name,2,3,4 from information_schema.tables #
위의 qurey문을 사용하면 해당 DB의 테이블을 확인할 수 있다.
이 중에서 flag값이 있을듯한 테이블을 찾아 확인해 보면 된다.
누가 봐도 flag가 있을 듯한 테이블이다.
테이블을 확인했다면 이제 해당 테이블의 컬럼을 확인하여 어떤 값이 저장되어 있는지 확인하면 된다.
컬럼을 확인하는 방법은 아까와 비슷하지만 조금만 변경해 주면 된다.
apple'union select column_name,2,3,4 from information_schema.columns where table_name='onlyflag'#
table_name 대신 column_name으로 변경 후 onlyflag 테이블의 정보만 확인하기 위해 where문을 추가하여 주었다.
위의 qurey문을 입력하면 이렇게 컬럼을 확인할 수 있다.
이제 해당 컬럼들 중 flag값이 있는 컬럼을 찾아 확인해 보자
idx와 sname은 아이디와 이름을 나타내는 것 같이 보이므로 나머지 svalue, sflag, sclose를 확인해 보자
union 3번 자리는 확인이 불가능한 자리이니 1,2,4번의 자리에 각각 위치시킨 후 확인을 하면 된다.
apple'union select svalue,sflag,3,sclose from onlyflag#
성공적으로 flag를 획득하였다.
'Hacking > DreamHack' 카테고리의 다른 글
[DreamHack] 드림핵 random-test (1) | 2023.11.17 |
---|---|
[DreamHack] 드림핵 Type c-j (0) | 2023.11.14 |
[DreamHack] 드림핵 phpreg (0) | 2023.11.14 |
[DreamHack] 드림핵 Carve Party (0) | 2023.11.13 |
[Dream Hack] 드림핵 ex-reg-ex (0) | 2023.11.13 |