CTF/웹해킹

[EZCTF] Super Secure - 웹해킹 / SQL Injection

SecurityMan 2022. 5. 21. 11:00

 

이번 대회에서 가장 쉬웠던 웹해킹 문제이다.

 

참고로 해킹대회에서 이번 문제 제목인 Super Secure 처럼

 

Secure 를 강조한다면

 

절대 Secure 하지 않은 시스템이다.

 

반응형

 

문제 설명 역시 This is so unbreakable! 이라고 적혀있는데

 

무조건 breakable 이다.

 

이번문제 역시 따로 웹 소스는 주어지지 않고, 문제페이지 주소만 주어진다.

 

 

문제 페이지에 접속하면 이런 화면이 나온다.

 

뭔가 사이버틱한 배경화면에 중간엔 로그인창이 있다.

 

아무래도 이 로그인 절차를 우회해야 하는듯 하다.

 

 

로그인을 우회하는 가장 잘 알려진 방법은 SQL Injection 취약점을 이용하는 것이다.

 

웹서버를 구현할 때 DB와 상호작용하는 로그인창, 게시판, 검색창 등등 부분에

 

SQL(Structrued Query Language) 이라는 DB 언어를 이용해 

 

데이터를 불러오고, 또 저장하는데

 

서버에서 DB로 전달하는 SQL문을 비인가자가 조작이 가능할 경우 취약점이 발생한다.

 

SQL 인젝션 취약점이 존재하는지 알아볼 수 있는 가장 쉬운 방법은

 

위 그림처럼 입력창에 작은따옴표(')를 하나 적어보는것이다.

 

 

그럼 위에 보이는것 처럼 SQL 구문 오류가 나는데

 

이 오류가 나는 이유는 빨간 밑출친 부분 때문이다.

 

SELECT * FROM members WHERE username= '사용자 입력값'

 

SQL 쿼리가 위처럼  최초에 작성이 되어있다.

 

만약에 NAME 칸에 hello 라고 입력했다면

 

SELECT * FROM members WHERE username= 'hello'

 

이런식으로 DB로 전달이 될 것이다.

 

그런데 아까처럼 작은따옴표를 입력한다면?

 

SELECT * FROM members WHERE username= '''

 

이렇게 입력이 들어가게 되는데 여기서 문제가 발생한다.

 

작은따옴표는 하나를 열었으면, 하나를 닫아줘야 한다.

 

즉, 작은따옴표의 총 개수가 홀수가 되면 안된다.

 

그런데 위처럼 작은따옴표의 개수가 홀수일 경우 아직 닫히지 않은 작은따옴표가 생기기 때문

 

에러가 발생하는 것이다.

 

작은따옴표를 하나 입력했을때 저렇게 에러가 발생한다면 SQL 인젝션 취약점이 있다고 생각하면 된다.

 

 

이제 본격적으로 로그인 절차를 우회해 본다.

 

' or 1=1-- - 라고 입력을 하게되면

 

SELECT * FROM members WHERE username= '' or  1=1-- -'

 

이런식으로 쿼리가 전달될 것이다.

 

여기서 1=1 은 참(True) 이고, 참과 or을 하면 그 결과 역시 참이기 때문에

 

WHERE(조건절)이 항상 참인 결과가 나오게 된다.

 

그리고 아직 닫히지 않은 맨끝의 작은따옴표는 주석(-- -)을 입력해 줌으로써 없애버릴 수 있다.

 

그럼 결국 DB로 전달되는 쿼리는

 

SELECT * FROM members 가 되어서 로그인이 우회된다.

 

 

로그인을 우회하면 플래그를 만날 수 있다.

반응형