Об инвариантных свойствах фильтрации
filed in Методы и техники, Практика on Apr.02, 2011
Продолжая свою работу над автоматизацией аудита веб-приложений, дошел сегодня до классификации различного рода фильтрации данных.
Решалась задача анализа сканером алгоритма фильтрации данных.
Научил сканер разделять фильтра на инвариантные и неинвариантные.
Пусть $s – сигнатура фильтра, если f($s)!=$s
Тогда:
f($a.$s) инвариантен по $s, если
f($a.$s)==f($s.$a)
Примеры:
f($a) { return mysql_real_escapestring($a); } не инвариантен по сигнатуре ‘ , так как f(” a’ “) !=f(” ‘a “)
f($a) { return str_replace($a,”",” ‘ “); } инвариантен по сигнатуре ‘, так как f(” ‘a “)==f(” a’ “)==”a”
f($a) { return intval($a); } инвариантен по ‘, при том (f($a.$s)==f($s.$a))!=f($a), если $a содержит не только цифры
Что это дает при автоматизации анализа?
Если фильтр инвариантен по сигнатуре, можно бросить все попытки пробить его по более длинным сигнатурам, включающим эту (доказательство и доп. условия приводить не буду).
Для mysql_real_escape_string это не помогает, а вот для остальных примеров – дает реальное уменьшение времени фаззинга.
Это уже хоть что-то, а не эта бесконечная долбежка Акунетикса… Он меня просто достал – третий день сканит…