laruence / taint

Taint is a PHP extension, used for detecting XSS codes
Other
611 stars 128 forks source link

用mysqli_query执行被taint的sql语句时,没有提示 #45

Closed zekang closed 7 years ago

zekang commented 7 years ago

php版本: 5.5.35 nts

sql.txt内容: show databases

php代码: $link = mysqli_init(); mysqli_real_connect($link, '127.0.0.1', 'root', 'root', false, 3306); $sql = file_get_contents("d:/sql.txt"); var_dump(is_tainted($sql)); taint($sql); var_dump(is_tainted($sql)); $result = mysqli_query($link, $sql); print_r(mysqli_fetch_all($result)); 用mysqli_query执行被taint的sql语句时,没有提示,但我把taint.c php_taint_fcall_check函数中获取参数修改成如下就可以了: if (strncmp("mysqli_query", fname, len) == 0){ el = *((zval *)(p - (arg_count - 1))); }else{ el = ((zval **)(p - arg_count)); } 不知道是什么原因

laruence commented 7 years ago

诶, 我建议你用PHP7的版本, 更加准确, 也性能更好 :)

kovige commented 7 years ago

我也遇到了这个问题,我的版本是taint1.2.2, 下面这些函数,query应该是第二个参数 sqlite_single_query ( resource $db , string $query [, bool $first_row_only [, bool $decode_binary ]] ) mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] ) sqlite_single_query ( resource $db , string $query [, bool $first_row_only [, bool $decode_binary ]] )

            if (strncmp("mysqli_query", fname, len) == 0
                    || strncmp("mysql_query", fname, len) == 0
                    || strncmp("sqlite_query", fname, len) == 0
                    || strncmp("sqlite_single_query", fname, len) == 0 ) {
                zval *el;
                el = *((zval **) (p - arg_count));
//对于mysqli_query等函数这里应该是否应该是el = *((zval **) (p - (arg_count-1)));
                if (el && IS_STRING == Z_TYPE_P(el) && PHP_TAINT_POSSIBLE(el)) {
                    php_taint_error(NULL TSRMLS_CC, "SQL statement contains data that might be tainted");
                }
                break;
            }