JAVA -> class (java assem) -> JVM (자바 가상머신) JVM 위에서 JAVA 프로그램이 돌아가는 것.
단, 모바일 버전에서는 class를 사용하지 않음.
JAVA > smali (android assem) -> dex dex파일이 android 실행 파일 이다. 역으로 원상 복구가 가능한 파일이다. -> jadx 툴 (소스코드를 우리가 볼 수 있다.)
APK 파일 -> 압축 파일 (복호화가 필요함. 위 툴에 올리면 자동 복호화까지 가능함.)
APK 파일 설치할 때, adb 사용하면 됨. adb install 파일명 > 녹스에서 실행
Android App Acrivity : 하나의 화면 -> JAVA이기 때문에 이것도 class 임.
실행할 화면 만들고, 그 위에 Activity 만드는 것.
첫 화면이 로그인이라면, 버튼 클릭했을 때 어떤 코드가 실행되는가? 가장 먼저 실행되는 Acrivity가 무엇인지 찾아내야 함.
AndroidManifest.xml : 이 앱에 관한 설정이 모두 들어가있는 파일임. - App 식별자 (가 무엇인지 정의되어 있음.) package="com.insecureshop" -> 이게 식별자(앱 이름)임.
- 권한 (볼 수 있다) - Activity 각각의 activity 정의 되어 있음. - 태그 중 - android.intent.acrion.MAIN - 앱을 실행했을 때 가장 먼저 실행되는 화면임. activity - 해당 코드를 찾으면 주목해야 할 것 - onCreate (앱 실행하자마자 가장 먼저 실행되는 함수)
앞으로 공부는..
# Mobile App 개발하기! Android : Java 로 개발 추천 iOS : Swift > 커뮤니티 + 자동로그인 기능 구현
# Mobile APP ## DVIA Android ## DIVA iOS
## Frida DBI (동적으로 바이너리를 조사하는 툴)
함수 후킹을 쉽게 할 수 있다. (코드의 흐름을 바꿀 수 있다. 내가 짠 코드를 집어넣을 수 있음.)
사용자가 간섭 가능한 매개변수(URL 파라미터, XML 등)에 의해 SQL 질의문이 완성되는 점을 이용하여, 해당 매개변수 변조를 통해 비정상 질의 가능 여부를 점검
[평가 예시]
- URL 파라미터 또는 XML 등 입력하는 부분에 SQL 구문 입력 후 서버에서 응답한 값에 대한 위험성 점검 - SQL문으로 해석될 수 있는 값(글번호, 검색 내용 등)을 입력하여 데이터베이스내에 저장된 정보 열람 및 시스템 명령 실행가능 여부 점검 - 조작된 XPath 쿼리를 보내어 비정상적인 질의 가능 여부 점검 등
[종류]
1. Union SQLi
: SQL 질의 결과가 화면에 출력되는 경우
2. Error Based SQLi
: SQL 에러가 발생하는 경우
3. Blind SQLi
: 위 두 가지 방식으로 확인이 불가능 한 경우 최후의 보루!
[SQL Injection이 발생하는 곳]
DB에게 SQL 질의문을 사용하는 곳
파라미터를 통해 SQL문(참, 거짓)을 넣어보면서 인젝션이 가능한지 여부를 확인할 수 있다.
취약점을 찾을 때에는! 서버 측에서 어떤 SQL 질의문이 완성되는지를 생각해봐야 한다.
자주 발생하는 곳 :
order by절
[공격 시나리오]
1. 인증 우회
SQL Injection을 통해 비밀번호 체크 로직을 우회하여 인증 없이 로그인
2. 정보 유출
SQL Injection을 통해 DB에서 민감한 정보를 추출
[대응 방법]
1. Prepared Statement
SQL 쿼리에 사용되는 파라미터를 별도로 분리하여 처리하는 방식.
이것으로 대부분 해결이 된다.
다만 다음 케이스에서 적용이 안 되기 때문에 주의해야한다.
case1. order by
Order by 절은 쿼리 결과를 정렬하는데 사용되는데, Prepared Statement를 사용하더라도 Order by 절에 대한 파라미터를 완전히 분리할 수 없다.
예를 들어, "SELECT * FROM users ORDER BY ?" 와 같은 쿼리에서 ? 자리에 "name; DROP TABLE users; --" 와 같은 값이 들어올 경우 Prepared Statement로는 막을 수 없다. 이는 Order by 절이 컬럼명, 컬럼 순서, 별칭 등 다양한 방식으로 지정될 수 있어 단순 파라미터 분리가 어렵기 때문이다.
따라서 파라미터에 sort나 ord가 있다면 무조건 확인해봐야 한다.
Case2. table이름, coloum 이름
테이블명, 컬럼명은 쿼리 구조에 해당하는 값이기 때문에 단순 파라미터로 분리하기 어려운 특성이 있다.
예를 들어, "SELECT * FROM ? WHERE id = ?"와 같이 테이블명을 파라미터로 받는 경우, 첫번째 ?에 "users; DROP TABLE users; --"와 같은 값이 들어오면 쿼리 조작이 가능하다.
2. White List Filtering
Prepared Statement를 사용하지 못하는 위 두 케이스의 경우 허용하는 특정 단어만 쓸 수 있도록 필터링을 하여 대응한다.
Order by 절:
허용되는 컬럼명을 White List로 관리하고, 파라미터로 전달되는 값이 White List에 존재하는지 확인
테이블명/컬럼명:
허용되는 테이블명/컬럼명을 White List로 관리하고, 파라미터로 전달되는 값이 White List에 존재하는지 확인
만약 White List 관리가 어려운 경우에는 파라미터로 전달되는 값에 대해 알파벳, 숫자, 언더바(_) 외의 문자가 존재하는지 검사하는 블랙리스트 방식의 필터링을 적용할 수도 있다.