Code::War Game/los.rubiya.kr

[LOS] Lord of the SQL Injection - orc

태군 코드 2023. 1. 4. 17:06
반응형

허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위입니다. 해킹을 시도할 때에 발생하는 법적인 책임은 그것을 행한 사용자에게 있다는 것을 명심하시기 바랍니다.

 

조금 더 구체적인 내용들은 [LOS] Lord of the SQL Injection - gremlin 문제를 풀면서 작성해 두었고, 빠진 부분이나 필요한 부분들에 대해서는 조금씩 추가하면서 작성하도록 하겠습니다.

 

Lord of the SQL Injection - orc

[LOS] Lord of the SQL Injection - orc

preg_match : porb _ . ( ) 필터링이 되어 있고 i 옵션을 통하여 대소문자를 구분하지 않음 pw='필터링값'이 있을 경우 "No Hack ~_~" 문구를 출력합니다.

addslashes() 함수 : 이스케이프해야 하는 문자 앞에 백슬래시가(\) 추가된 문자열을 반환합니다. 이러한 문자는 다음과 같습니다.

작은따옴표( ')
큰따옴표( ")
백슬래시( \)
NUL(NUL 바이트)

 

DB 조회, 삭제, 삽입 등 쿼터 같은 특수문자를 넣을 경우 오류를 발생시킬 수 있으며, SQL Injection 등 쿼리 공격을 방지하기 위해 사용합니다. 하지만 addslashes() 함수를 사용하여도 충분히 우회가 가능합니다.

 

예시)

$str = "Is your name O'Reilly?"
Outputs: Is your name O\'Reilly?

이처럼 문자에 쿼터 같은 특수문자가 들어갈경우 백슬래시(\)를 앞에 붙여 특수문자를 일반문자열로 바꿔 줍니다.

 

bWAPP DB

bWAPP DB에서 users 테이블의 login 컬럼을 조회한 결과 값입니다.

 

bWAPP DB

bWAPP DB users 테이블의 login 컬럼에서 login 값이 test'01인 값을 쿼리 하였습니다. 쿼터(') 특수문자가 중간에 들어가서 SQL 에러가 표시되는 것을 알 수 있습니다.

 

bWAPP DB

login test'01 값에 백슬래시(\)를 포함시켜 문자열로 처리하였더니 에러표시가 나지 않는것을 확인할 수 있습니다. login 값에 test'01 값이 없으므로 값은 출력되지 않습니다.

 

그럼 다시 문제로 돌아가도록 하겠습니다.

 

if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");

최종적으로 해당 문제는 저장되어 있는 pw 값과 입력된 pw 값이 같아야 풀리는 문제로 저장되어 있는 pw 값을 찾아야 해결되는 문제입니다.

 

or 1=1 참

pw=' or 1=1 # 참인 값을 입력하였더니 Hello admin 문자열을 확인할 수 있었습니다.

 

or 1=2 거짓

pw=' or 1=2 # 거짓 값을 입력하였더니 Hello admin 문자열이 표시되지 않습니다. 이것으로 알 수 있는것은 참과 거짓 값이 다르게 표시 되므로 Blind sql injection이 가능하다는 것을 알수 있습니다.

 

그럼 우선 우리는 pw를 값을 알아내야 하기 때문에 그전에 pw의 길이를 먼저 알아보도록 하겠습니다. pw의 길이를 확인하기 위해서는 length() 함수와, char_length() 함수를 사용할 수 있지만 char_length() 함수에서는 필터링이 되므로 여기서는 length() 함수를 사용하여야 합니다.

 

bWAPP DB에서 login 값의 길이 확인

 

pw 길이 확인

?pw=' or id='admin' and length(pw)=1%23 

select id from prob_orc where id='admin' and pw='' or id='admin' and length(pw)=1#'

prob_orc 테이블의 id 컬럼에서 id='admin'이고 pw='' 이거나 id='admin' 이고 pw길이가 1자리인지 확인합니다.

 

bWAPP DB

bWAPP DB의 예시와 같이 length 값이 참이 될 때까지 계속 숫자를 올리면서 확인하는 방법도 있지만, 위의 예시처럼 값이 40자리일 경우 40번의 입력을 해주어야 합니다. 여기서는 파이썬을 통한 자동화 공격으로 확인해보도록 하겠습니다.

 

pw 길이값 확인

pw의 길이값은 8자리인 것을 확인하였습니다. 즉 쿼리문은 ?pw=' or id='admin' and length(pw)=8%23 이라는 것을 알 수 있습니다.

 

파이썬 소스코드 (pw 길이 확인)

파이썬 pw 길이 추출 소스코드

소스코드를 이미지로 붙여 놓은 이유는 이 글을 보시는 분들 중 한 분이라도 직접 타이핑을 하면서 직접 입력을 해보셨으면 하는 마음에서 이미지로 붙여 넣었습니다.

 

소스코드 설명

1,2번 라인 - requests, string 모듈 사용

모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있습니다.

 

4,5번 라인 - url 주소를 입력받고, 그것을 print 함수를 통하여 화면에 출력합니다.

 

7, 8번 라인 - pw 길이와, pw 값을 찾아야 하므로 변수를 선언해 주었습니다.

 

10번 라인 - headers 변수에 현재 쿠키 값을 저장하여 줍니다.

 

12번 라인 - brute 변수에 string 모듈을 사용하여 pw 값에 대입할 값을 저장

 

14 ~ 24번 라인 - for 문을 통하여 Hello admin이 표시될 때까지 1부터 99까지 값을 대입

 

반응형

 

pw 값 확인 (확인 방법은 여러 가지가 있습니다)

substr( ) 함수 - 지정한 특정 위치의 문자를 출력해주는 함수입니다.
형식은 substr("찾을 문자", "시작위치", "찾을 글자수")입니다.

mid 함수 -  문자에 지정한 시작 위치를 기준으로 일정 개수를 가져오는 함수.

 

ord( ) 함수 - 아스키코드를 숫자로 만들어주는 함수이다.
chr( ) 함수 - 숫자를 아스키코드로 바꿔주는 함수이다.

 

pw 값 확인

?pw=' or id='admin' and substr(pw,1,1)='0'%23 - pw의 첫 번째 자리의 값이 0인지 확인

?pw=' or id='admin' and substr(pw,2,1)='0'%23 - pw의 두 번째 자리의 값이 0인지 확인

 

pw 값 확인

 

파이썬 소스코드 (pw 값 확인)

 

전체 소스코드

 

 

반응형