[PHP] SQL Escape & Bypass
SQL Escape method
mysqli::real_escape_string
addslashes
magic_quotes_gpc ( REMOVED as of PHP 5.4.0. )
magic_quotes_runtime ( REMOVED as of PHP 5.4.0. )
bypass
숫자형 데이터로 넘기기
query에서 ``php $id``를 ``php ''``로 감싸지 않았을 때,
단순히 ``php mysql_real_escape_strig($id)``만 수행하면 숫자가 넘어올 경우 이를 숫자형 데이터로 간주해 우회된다.
따라서 다음과 같은 방법으로 Filtering / Escape 하며, query 내의 변수는 ``php '$id'``형태로 꼭 감싸주어 문자열로 인식할 수 있도록 한다.
multibyte encoding
ALL RECODES LEAK!
Note ) 또 다른 charset 변환 함수 ``php iconv()``에서는 없는 문자가 들어오면 에러가 발생한다.`` \xa1\xa0`` 부터 에러 발생.
```php
$id = iconv('EUC-KR', 'UTF-8', $id);
iconv(): Detected an illegal character in input string
```
그러나 `` //IGNORE``를 지정해주는 경우, bypass 가능하다. ( `` //TRANSLIT``도 지정 가능하지만 이건 에러가 발생한다. )
```php
$id = iconv('EUC-KR', 'UTF-8//IGNORE', $id);
```
```php
after escape : p2�\' or 1#
after mb_convert : p2' or 1#
ALL RECODES LEAK!
```
따라서 user input을 변환해야 한다면 이를 옵션 지정하지 말고 사용하는 편이 좋다.
Indirect SQL Injection
즉, user input이든 DB든 외부 source에서 온 데이터는 무조건 필터링과 escape 과정을 거쳐야한다.
* `` magic_quotes_runtime=off``일 때만 적용되나, PHP 5.4부터 제거된 옵션이다.
이렇게 Bypass가 가능하니 preparedStatement를 사용하는 것이 좋다.
'Languages & Frameworks > PHP' 카테고리의 다른 글
[PHP] File Upload (0) | 2017.11.11 |
---|---|
[PHP] File IO (0) | 2017.11.11 |
[PHP] mysqli, PDO / password_* (0) | 2017.06.24 |
[PHP] 함수, 클래스, 객체, 상속, 트레이트 (0) | 2017.06.10 |
[PHP] form tag, GET POST / cookie, session (0) | 2017.06.10 |