은행 응용 프로그램 해독을 통해 SQL 주입 학습

소개


오늘 우리는 SQL 주입 공격을 어떻게 하는지, 그리고 그것을 예방하는 방법을 배울 것이다.
너는 해커가 매년 수십억 달러를 훔치는 것을 아니?
너는 거의 30초마다 새로운 해커 공격이 있다는 것을 아니?
만약 우리가 개발자라면, 우리는 코드의 안전성에 시종 관심을 가져야 한다.우리가 전단을 하든 후단을 하든 그것들은 모두 취약하다.
오늘은 SQL 주입 공격이 무엇인지, 어떻게 진행되는지, 왜 위험한지, 그리고 응용 프로그램이 이런 공격을 받지 않도록 보호하는 방법을 소개하고 싶습니다.
우리 시작합시다!
동영상을 좋아하신다면 유튜브를 클릭하세요.

SQL 주입


SQL 주입은 가장 흔히 볼 수 있는 OWASP 빈틈 중 하나로 매우 쉽고 무서운 파괴를 초래할 수 있다.
이것은 우리가 사용자 정의와 필요하지 않은 명령을 SQL 데이터베이스로 전송할 수 있는 상황과 비슷하다.
예를 들어, 사용자 이름을 입력할 때 사용자 정의 명령을 입력할 수 있습니다.
모든 테이블을 삭제하고 다른 데이터베이스 테이블에서 데이터를 얻거나 관리자 계정을 자동으로 잠금 해제할 수 있는 것과 같다.

왜 SQL 주입이 위험합니까?


데이터 유출
SQL 주입을 통해 공격자는 일반 사용자가 영원히 접근할 수 없는 데이터에 신속하게 접근할 수 있다.
예를 들어 귀하의 개인 정보, 은행 거래, 민감한 개인 데이터(예를 들어 귀하의 ID) 또는 거주지일 수 있습니다.
더 심각한 것은 데이터베이스가 공격을 받기 쉬우면 공격자는 순식간에 수백만 개의 기록을 열 수 있다는 것이다.
가능한 손상
이러한 유형의 공격은 데이터만 가져오는 것이 아니라 모든 SQL 명령을 촉발할 수 있습니다.
예를 들어 공격자는 당신의 계좌에서 자신의 계좌로 돈을 보내고 당신의 계좌 잔액을 변경하거나 모든 기록을 삭제할 수 있습니다.
특히 백업이 없는 상황에서 고통스러울 수도 있다.
무단 액세스
우리가 응용 프로그램을 구축할 때, 일반적으로 우리는 x 역할에 대해 약간의 권한을 가진다.
관리자만 기록을 삭제하거나 편집할 수 있는 것처럼 친구의 요청에 대해 초대받은 사람이 받아들여야 한다는 등등.
공격자가 데이터베이스에 들어가서 계정에서 메시지를 보내고 인증된 친구로 계정을 추가하거나 소셜 파일에 있는 댓글을 편집할 수 있다면 어떻게 해야 합니까?

SQL 주입 공격을 수행하도록 하겠습니다.


현재, 우리는 누군가의 계정 접근 권한을 얻기 위해 간단한 공격을 진행할 것이다.
우리는 공격을 테스트하고 코드와 응답을 검사하여 그 작업 원리를 이해할 수 있는 은행 응용 프로그램을 구축했다.
SQL 주입 공격 요구:
백엔드 코드 다운로드:
다음은 Golang back-end for banking 응용 프로그램 코드에 대한 링크입니다.
https://github.com/Duomly/go-bank-backend
그것을 복제하고 이 폴더로 들어갑니다.
PostgreSQL 데이터베이스 설정:
새 Postgres DB를 만들어야 합니다.
bankapp라고 명명하고 사용자 Postgres를 사용하거나 원하는 사용자를 사용할 수 있습니다.
이 경우 연결 문자열을 변경해야 합니다.
백엔드 코드의 연결 설정:
두 파일에 연결 문자열, 즉 vulnerabledb를 설정해야 합니다.시작하다가다
마이그레이션 시작:
지금 너는 간선도로로 가야 한다.API 코드를 주석하고 마이그레이션에 대한 주석을 취소합니다.
주 함수의 코드는 다음과 같이 해야 한다.
func main() {
 migrations.Migrate()
 // api.StartApi()
}
다음 사이트에서 프런트엔드 코드를 다운로드하십시오.
이 단계에서 URL로 이동해야 합니다.
https://github.com/Duomly/angular9-tailwind-bank-frontend
응용 프로그램을 복제하고 폴더로 이동합니다.
다음은 npm install을 통해 의존항을 설치하고 npm start를 통해 프로그램을 시작해야 합니다.
우리 놀기 시작합시다.
구성의 마지막 단계에서 이전에 변경한 사항을 취소하고 API를 시작해야 합니다.
우리의 주요 기능의 코드.바둑은 이렇게 해야 한다.
func main() {
 // migrations.Migrate()
 api.StartApi()
}
마지막 단계는main을 실행하는 것입니다.터미널에서 다음을 입력합니다.
go run main.go
축하해, 해킹을 시작할 준비가 됐어!
표준 자격 증명:
우리는 두 명의 다른 사용자를 만들었는데, 그들의 표준 증빙서류는 다음과 같다.
사용자 1:
user: Martin
password: Martin
사용자 2:
user: Michael
password: Michael
우리는 무엇을 할 것인가:
보시다시피 우리는 간단한 산열을 가지고 있으며, 이미 산열된 비밀번호를 찾습니다.
따라서 암호 입력 필드에서 사용하는 모든 기술은 SQL 명령을 추가하더라도 해시로 변환됩니다. 이것은 SQL이 SQL 명령으로 간주하지 않는다는 것을 의미합니다.
이런 상황에서 우리는 사용자 이름 입력에 관심을 가져야 한다.
이것은 SQL에 순수한 문자열로 들어가기 때문에 유효할 수 있습니다.
나는 특히 취약한 곳을 만들었다.
너는 자신의 응용 프로그램에서 이렇게 해서는 안 된다.
본문의 다음 절에서, 나는 당신에게 그것을 어떻게 정확하게 완성해야 하는지 알려 드리겠습니다.
사용자 이름으로 사용자 찾기
사용자 이름을 통해 사용자를 얻기 위해서, 사용자 이름 입력에서 이 문자열 중 하나를 사용할 수 있습니다.
물론, 너는 더 많은 방법을 사용할 수 있다.
Martin' or username='Martin' AND 1 = 1 --
xx’ or username='Martin' AND 1 = 1 --
그것의 작업 원리는 이름 Martin이나 이름 Martin과true를 통해 사용자를 얻는 것과 같다. 만약 우리가 첫 번째 Martin을 Michael로 바꾸면 우리는 두 개의 프로필을 얻을 것이다.
두 번째 방법의 작업 원리는 사용자 이름이 xx이거나 사용자 이름이 Martin이고true인 사용자를 얻는 것과 유사하다.
모든 사용자 가져오기
사용자 이름 입력에서 이 문자열을 사용하면 사용자라는 테이블에서 모든 기록을 얻을 수 있습니다.
Martin' or 1 = 1 --
이 방법의 작업 원리는 사용자 이름 Martin이나true를 사용하여 사용자를 얻는 것과 유사하다.
이것은 조건이 통과되었기 때문에 "ortrue"는 모든 다른 사용자를 얻을 수 있음을 의미합니다.
ID로 사용자 가져오기
사용자 이름 입력 필드에서 이 조합을 사용할 때, 우리는 그의 id를 통해 사용자를 얻을 수 있습니다.
관리자를 찾을 때 특히 유용합니다(기본적으로 관리자의 ID는 보통 1).
xx' or id=2 AND 1 = 1 --
이 방법의 작업 원리는 사용자 이름이 xx 또는 id가 2인 사용자를 가져오고true를 가져오는 것과 유사하다.
이러한 기호의 의미:
OR 1=1
이것은 1이 1이라는 것을 의미하는데, 이것은 정말이다.이것은 마치 조건을 통과한 것과 같다.
'
이 표시는 문자열에서 탈출하는 것과 같다.
이렇게 하면 SQL의 문자열을 정의하고 적절한 SQL 명령을 호출할 수 있습니다.
--
이것은 약간 주석과 같아서 SQL이 이 두 대시 기호 다음에 문장의 나머지 부분을 무시하게 한다.
예를 들어, 우리가 더 많은 필드를 보낼 때, 예를 들면, 비밀번호, 그것은 매우 유용하다.
우리가 이 표시를 사용할 때, 우리의 SQL은 암호를 검증해야 하는 정보도 무시할 것이다.

SQL 주입에서 애플리케이션을 보호하는 방법


프런트엔드 양식 검증
물론 똑똑한 공격자는 전단 검증을 피하기 위해 그렇게 많은 문제가 있어서는 안 된다.
그러나 이것이 첫 번째 장애가 될 것이다.
폼에 특수 검증을 추가할 수 있습니다.
사용자 이름에 특별한 문자나 길이가 크지 않으면 전자 메일이 전자 메일과 같은지 확인할 수 있습니다.
의심스러운 조합이 검출되면 표를 막을 수 있다.
일부 공격을 시도하는 IP/자격 증명이 있는 사용자에 대한 붉은 깃발을 백엔드에 보낼 수 있습니다.
예를 들어, 당신은 잠시 그의 IP를 차단하거나 영원히 그를 금지할 수 있습니다.
마찬가지로 공격자는 당신의 금령을 어떻게 피하는지 알게 될 것입니다.
그러나 이것은 새로운 장애물이다. 어떤 사람들은 당신의 응용 프로그램에 더 많은 시간을 쓰는 것을 포기할 수 있다.
백엔드 변수 검증
다음 안전한 방법은 백엔드입니다. 모든 문자열과 데이터가 정확하게 발송되었는지 확인하고 모든regexp를 통해 검증합니다.
백엔드 검증이 프런트엔드 검증보다 훨씬 어렵기 때문에 매우 유용할 수 있다.
특히 사용자가 즉시 걸 수 있는 전화 수량을 제한하는 데 도움이 된다.
기타 프로세스 비교(예: CompareHashAndPassword)
이 방법은 데이터를 공격자에게 보내는 것을 멈추는 데 도움을 줄 수 있습니다.
물론 공격자에게 SQL 주입을 허용하면 공격자는 일부 내용을 삭제하거나 기록을 변경하는 등 파괴를 초래할 수 있습니다.
예를 들어, DB에서 x 사용자 레코드를 찾을 수 있습니다.
다음은 bcrypt를 사용하여 인증서를 인증합니다.hashandpassword 비교.
응용 프로그램은 요청한 데이터를 클라이언트에게 되돌려 주지 않고 비인증 오류를 발생시켜야 합니다.
SQL 라이브러리/프레임워크 사용
Golang의gorm이나node의sequelize 같은 프레임워크를 사용합니다.js는 안전 방면에서 너를 많이 도울 수 있다.
대부분의 경우, 별도의 안전층이 있다.
이것은 파라미터가 정확한지 확인하고 사용자가 백엔드로 보낸 데이터에 따라 정확한 조회를 구축합니다.
선언 유형
이 점은 매우 관건적이다.긴밀한 유형을 성명함으로써 당신은 안전 문제뿐만 아니라 많은 문제를 피할 수 있을 것입니다.
모든 인터페이스와 형식을 정확하게 설정하면 잘못된 데이터를 다시 보낼 수 없습니다.
모든 데이터는 최종 클라이언트(사용자)로 돌아가고자 하는 100% 형식으로 전송됩니다.

결론


축하
이제 SQL 주입 공격을 수행하는 방법과 응용 프로그램을 공격으로부터 보호하는 방법을 알고 있습니다.
나는 이것이 매우 도움이 될 때가 되기를 바란다. 너는 자신의 소프트웨어를 구축하고 있다.
소유자의 허가를 받지 않은 프로그램에 대해 사용하는 것은 불법이라는 것을 기억해야 한다.
어쨌든, 당신은 우리의 코드를 다운로드하고, 당신의 응용 프로그램을 구축하거나, 가상 실험실을 찾아 테스트를 할 수 있습니다.
인코딩에 관한 더 많은 강좌를 얻으십시오.

읽어주셔서 감사합니다.
Duomly의 Radek.

좋은 웹페이지 즐겨찾기